svn merge -r38600:38700 https://svn.blender.org/svnroot/bf-blender/trunk/blender
This commit is contained in:
@@ -105,12 +105,15 @@ void* AUD_openalRunThread(void* device)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void AUD_OpenALDevice::start()
|
||||
void AUD_OpenALDevice::start(bool join)
|
||||
{
|
||||
lock();
|
||||
|
||||
if(!m_playing)
|
||||
{
|
||||
if(join)
|
||||
pthread_join(m_thread, NULL);
|
||||
|
||||
pthread_attr_t attr;
|
||||
pthread_attr_init(&attr);
|
||||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
|
||||
@@ -271,8 +274,8 @@ void AUD_OpenALDevice::updateStreams()
|
||||
// stop thread
|
||||
if(m_playingSounds->empty() || (cerr != ALC_NO_ERROR))
|
||||
{
|
||||
unlock();
|
||||
m_playing = false;
|
||||
unlock();
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
@@ -366,6 +369,8 @@ AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize)
|
||||
pthread_mutex_init(&m_mutex, &attr);
|
||||
|
||||
pthread_mutexattr_destroy(&attr);
|
||||
|
||||
start(false);
|
||||
}
|
||||
|
||||
AUD_OpenALDevice::~AUD_OpenALDevice()
|
||||
@@ -414,13 +419,8 @@ AUD_OpenALDevice::~AUD_OpenALDevice()
|
||||
alcProcessContext(m_context);
|
||||
|
||||
// wait for the thread to stop
|
||||
if(m_playing)
|
||||
{
|
||||
unlock();
|
||||
pthread_join(m_thread, NULL);
|
||||
}
|
||||
else
|
||||
unlock();
|
||||
unlock();
|
||||
pthread_join(m_thread, NULL);
|
||||
|
||||
delete m_playingSounds;
|
||||
delete m_pausedSounds;
|
||||
|
||||
@@ -106,7 +106,7 @@ private:
|
||||
/**
|
||||
* Starts the streaming thread.
|
||||
*/
|
||||
void start();
|
||||
void start(bool join = true);
|
||||
|
||||
/**
|
||||
* Checks if a handle is valid.
|
||||
|
||||
@@ -239,4 +239,4 @@ def basename(path):
|
||||
|
||||
Use for Windows compatibility.
|
||||
"""
|
||||
return _os.path.basename(path[2:] if path.startswith("//") else path)
|
||||
return _os.path.basename(path[2:] if path[:2] in {"//", b"//"} else path)
|
||||
|
||||
@@ -50,11 +50,11 @@ def region_2d_to_vector_3d(region, rv3d, coord):
|
||||
-0.5
|
||||
))
|
||||
|
||||
w = (out[0] * persinv[0][3]) + \
|
||||
(out[1] * persinv[1][3]) + \
|
||||
(out[2] * persinv[2][3]) + persinv[3][3]
|
||||
w = ((out[0] * persinv[0][3]) +
|
||||
(out[1] * persinv[1][3]) +
|
||||
(out[2] * persinv[2][3]) + persinv[3][3])
|
||||
|
||||
return ((out * persinv) / w) - rv3d.view_matrix.inverted()[3].xyz
|
||||
return ((persinv * out) / w) - rv3d.view_matrix.inverted()[3].xyz
|
||||
else:
|
||||
return rv3d.view_matrix.inverted()[2].xyz.normalized()
|
||||
|
||||
@@ -116,7 +116,7 @@ def location_3d_to_region_2d(region, rv3d, coord):
|
||||
"""
|
||||
from mathutils import Vector
|
||||
|
||||
prj = Vector((coord[0], coord[1], coord[2], 1.0)) * rv3d.perspective_matrix
|
||||
prj = rv3d.perspective_matrix * Vector((coord[0], coord[1], coord[2], 1.0))
|
||||
if prj.w > 0.0:
|
||||
width_half = region.width / 2.0
|
||||
height_half = region.height / 2.0
|
||||
|
||||
@@ -144,21 +144,21 @@ class _GenericBone:
|
||||
""" Vector pointing down the x-axis of the bone.
|
||||
"""
|
||||
from mathutils import Vector
|
||||
return Vector((1.0, 0.0, 0.0)) * self.matrix.to_3x3()
|
||||
return self.matrix.to_3x3() * Vector((1.0, 0.0, 0.0))
|
||||
|
||||
@property
|
||||
def y_axis(self):
|
||||
""" Vector pointing down the x-axis of the bone.
|
||||
"""
|
||||
from mathutils import Vector
|
||||
return Vector((0.0, 1.0, 0.0)) * self.matrix.to_3x3()
|
||||
return self.matrix.to_3x3() * Vector((0.0, 1.0, 0.0))
|
||||
|
||||
@property
|
||||
def z_axis(self):
|
||||
""" Vector pointing down the x-axis of the bone.
|
||||
"""
|
||||
from mathutils import Vector
|
||||
return Vector((0.0, 0.0, 1.0)) * self.matrix.to_3x3()
|
||||
return self.matrix.to_3x3() * Vector((0.0, 0.0, 1.0))
|
||||
|
||||
@property
|
||||
def basename(self):
|
||||
@@ -294,9 +294,9 @@ class EditBone(StructRNA, _GenericBone, metaclass=StructMetaPropGroup):
|
||||
:type roll: bool
|
||||
"""
|
||||
from mathutils import Vector
|
||||
z_vec = Vector((0.0, 0.0, 1.0)) * self.matrix.to_3x3()
|
||||
self.tail = self.tail * matrix
|
||||
self.head = self.head * matrix
|
||||
z_vec = self.matrix.to_3x3() * Vector((0.0, 0.0, 1.0))
|
||||
self.tail = matrix * self.tail
|
||||
self.head = matrix * self.head
|
||||
|
||||
if scale:
|
||||
scalar = matrix.median_scale
|
||||
@@ -304,7 +304,7 @@ class EditBone(StructRNA, _GenericBone, metaclass=StructMetaPropGroup):
|
||||
self.tail_radius *= scalar
|
||||
|
||||
if roll:
|
||||
self.align_roll(z_vec * matrix)
|
||||
self.align_roll(matrix * z_vec)
|
||||
|
||||
|
||||
def ord_ind(i1, i2):
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
import bpy
|
||||
import mathutils
|
||||
|
||||
@@ -40,8 +40,10 @@ def add_torus(major_rad, minor_rad, major_seg, minor_seg):
|
||||
for minor_index in range(minor_seg):
|
||||
angle = 2 * pi * minor_index / minor_seg
|
||||
|
||||
vec = Vector((major_rad + (cos(angle) * minor_rad), 0.0,
|
||||
(sin(angle) * minor_rad))) * quat
|
||||
vec = quat * Vector((major_rad + (cos(angle) * minor_rad),
|
||||
0.0,
|
||||
(sin(angle) * minor_rad),
|
||||
))
|
||||
|
||||
verts.extend(vec[:])
|
||||
|
||||
@@ -72,7 +74,11 @@ def add_torus(major_rad, minor_rad, major_seg, minor_seg):
|
||||
|
||||
return verts, faces
|
||||
|
||||
from bpy.props import FloatProperty, IntProperty, BoolProperty, FloatVectorProperty
|
||||
from bpy.props import (FloatProperty,
|
||||
IntProperty,
|
||||
BoolProperty,
|
||||
FloatVectorProperty,
|
||||
)
|
||||
|
||||
|
||||
class AddTorus(bpy.types.Operator):
|
||||
@@ -82,7 +88,8 @@ class AddTorus(bpy.types.Operator):
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
major_radius = FloatProperty(name="Major Radius",
|
||||
description="Radius from the origin to the center of the cross sections",
|
||||
description=("Radius from the origin to the "
|
||||
"center of the cross sections"),
|
||||
default=1.0, min=0.01, max=100.0)
|
||||
minor_radius = FloatProperty(name="Minor Radius",
|
||||
description="Radius of the torus' cross section",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
|
||||
import bpy
|
||||
from bpy.props import StringProperty
|
||||
@@ -28,7 +28,11 @@ class EditExternally(bpy.types.Operator):
|
||||
bl_label = "Image Edit Externally"
|
||||
bl_options = {'REGISTER'}
|
||||
|
||||
filepath = StringProperty(name="File Path", description="Path to an image file", maxlen=1024, default="")
|
||||
filepath = StringProperty(
|
||||
name="File Path",
|
||||
description="Path to an image file",
|
||||
maxlen=1024,
|
||||
)
|
||||
|
||||
def _editor_guess(self, context):
|
||||
import sys
|
||||
@@ -57,10 +61,13 @@ class EditExternally(bpy.types.Operator):
|
||||
def execute(self, context):
|
||||
import os
|
||||
import subprocess
|
||||
filepath = bpy.path.abspath(self.filepath)
|
||||
filepath = os.path.normpath(bpy.path.abspath(self.filepath))
|
||||
|
||||
if not os.path.exists(filepath):
|
||||
self.report({'ERROR'}, "Image path %r not found, image may be packed or unsaved." % filepath)
|
||||
self.report({'ERROR'},
|
||||
"Image path %r not found, image may be packed or "
|
||||
"unsaved." % filepath)
|
||||
|
||||
return {'CANCELLED'}
|
||||
|
||||
cmd = self._editor_guess(context) + [filepath]
|
||||
@@ -70,7 +77,10 @@ class EditExternally(bpy.types.Operator):
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
self.report({'ERROR'}, "Image editor not found, please specify in User Preferences > File")
|
||||
self.report({'ERROR'},
|
||||
"Image editor not found, "
|
||||
"please specify in User Preferences > File")
|
||||
|
||||
return {'CANCELLED'}
|
||||
|
||||
return {'FINISHED'}
|
||||
@@ -104,7 +114,9 @@ class SaveDirty(bpy.types.Operator):
|
||||
if "\\" not in filepath and "/" not in filepath:
|
||||
self.report({'WARNING'}, "Invalid path: " + filepath)
|
||||
elif filepath in unique_paths:
|
||||
self.report({'WARNING'}, "Path used by more then one image: " + filepath)
|
||||
self.report({'WARNING'},
|
||||
"Path used by more then one image: %r" %
|
||||
filepath)
|
||||
else:
|
||||
unique_paths.add(filepath)
|
||||
image.save()
|
||||
@@ -142,14 +154,14 @@ class ProjectEdit(bpy.types.Operator):
|
||||
|
||||
filepath = os.path.basename(bpy.data.filepath)
|
||||
filepath = os.path.splitext(filepath)[0]
|
||||
# filepath = bpy.path.clean_name(filepath) # fixes <memory> rubbish, needs checking
|
||||
# fixes <memory> rubbish, needs checking
|
||||
# filepath = bpy.path.clean_name(filepath)
|
||||
|
||||
if filepath.startswith(".") or filepath == "":
|
||||
# TODO, have a way to check if the file is saved, assume startup.blend
|
||||
if bpy.data.is_saved:
|
||||
filepath = "//" + filepath
|
||||
else:
|
||||
tmpdir = context.user_preferences.filepaths.temporary_directory
|
||||
filepath = os.path.join(tmpdir, "project_edit")
|
||||
else:
|
||||
filepath = "//" + filepath
|
||||
|
||||
obj = context.object
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
|
||||
import bpy
|
||||
|
||||
@@ -111,7 +111,8 @@ class MeshMirrorUV(bpy.types.Operator):
|
||||
|
||||
#for i, v in enumerate(mesh.vertices):
|
||||
vmap = {}
|
||||
for mirror_a, mirror_b in (mirror_gt, mirror_lt), (mirror_lt, mirror_gt):
|
||||
for mirror_a, mirror_b in ((mirror_gt, mirror_lt),
|
||||
(mirror_lt, mirror_gt)):
|
||||
for co, i in mirror_a.items():
|
||||
nco = (-co[0], co[1], co[2])
|
||||
j = mirror_b.get(nco)
|
||||
@@ -120,7 +121,8 @@ class MeshMirrorUV(bpy.types.Operator):
|
||||
|
||||
active_uv_layer = mesh.uv_textures.active.data
|
||||
fuvs = [(uv.uv1, uv.uv2, uv.uv3, uv.uv4) for uv in active_uv_layer]
|
||||
fuvs_cpy = [(uv[0].copy(), uv[1].copy(), uv[2].copy(), uv[3].copy()) for uv in fuvs]
|
||||
fuvs_cpy = [(uv[0].copy(), uv[1].copy(), uv[2].copy(), uv[3].copy())
|
||||
for uv in fuvs]
|
||||
|
||||
# as a list
|
||||
faces = mesh.faces[:]
|
||||
|
||||
@@ -28,9 +28,22 @@ class SelectPattern(bpy.types.Operator):
|
||||
bl_label = "Select Pattern"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
pattern = StringProperty(name="Pattern", description="Name filter using '*' and '?' wildcard chars", maxlen=32, default="*")
|
||||
case_sensitive = BoolProperty(name="Case Sensitive", description="Do a case sensitive compare", default=False)
|
||||
extend = BoolProperty(name="Extend", description="Extend the existing selection", default=True)
|
||||
pattern = StringProperty(
|
||||
name="Pattern",
|
||||
description="Name filter using '*' and '?' wildcard chars",
|
||||
maxlen=32,
|
||||
default="*",
|
||||
)
|
||||
case_sensitive = BoolProperty(
|
||||
name="Case Sensitive",
|
||||
description="Do a case sensitive compare",
|
||||
default=False,
|
||||
)
|
||||
extend = BoolProperty(
|
||||
name="Extend",
|
||||
description="Extend the existing selection",
|
||||
default=True,
|
||||
)
|
||||
|
||||
def execute(self, context):
|
||||
|
||||
@@ -39,7 +52,8 @@ class SelectPattern(bpy.types.Operator):
|
||||
if self.case_sensitive:
|
||||
pattern_match = fnmatch.fnmatchcase
|
||||
else:
|
||||
pattern_match = lambda a, b: fnmatch.fnmatchcase(a.upper(), b.upper())
|
||||
pattern_match = (lambda a, b:
|
||||
fnmatch.fnmatchcase(a.upper(), b.upper()))
|
||||
|
||||
obj = context.object
|
||||
if obj and obj.mode == 'POSE':
|
||||
@@ -98,14 +112,19 @@ class SelectHierarchy(bpy.types.Operator):
|
||||
bl_label = "Select Hierarchy"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
direction = EnumProperty(items=(
|
||||
('PARENT', "Parent", ""),
|
||||
('CHILD', "Child", "")),
|
||||
name="Direction",
|
||||
description="Direction to select in the hierarchy",
|
||||
default='PARENT')
|
||||
direction = EnumProperty(
|
||||
items=(('PARENT', "Parent", ""),
|
||||
('CHILD', "Child", ""),
|
||||
),
|
||||
name="Direction",
|
||||
description="Direction to select in the hierarchy",
|
||||
default='PARENT')
|
||||
|
||||
extend = BoolProperty(name="Extend", description="Extend the existing selection", default=False)
|
||||
extend = BoolProperty(
|
||||
name="Extend",
|
||||
description="Extend the existing selection",
|
||||
default=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
@@ -163,7 +182,12 @@ class SubdivisionSet(bpy.types.Operator):
|
||||
level = IntProperty(name="Level",
|
||||
default=1, min=-100, max=100, soft_min=-6, soft_max=6)
|
||||
|
||||
relative = BoolProperty(name="Relative", description="Apply the subsurf level as an offset relative to the current level", default=False)
|
||||
relative = BoolProperty(
|
||||
name="Relative",
|
||||
description=("Apply the subsurf level as an offset "
|
||||
"relative to the current level"),
|
||||
default=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
@@ -215,7 +239,8 @@ class SubdivisionSet(bpy.types.Operator):
|
||||
mod = obj.modifiers.new("Subsurf", 'SUBSURF')
|
||||
mod.levels = level
|
||||
except:
|
||||
self.report({'WARNING'}, "Modifiers cannot be added to object: " + obj.name)
|
||||
self.report({'WARNING'},
|
||||
"Modifiers cannot be added to object: " + obj.name)
|
||||
|
||||
for obj in context.selected_editable_objects:
|
||||
set_object_subd(obj)
|
||||
@@ -224,23 +249,37 @@ class SubdivisionSet(bpy.types.Operator):
|
||||
|
||||
|
||||
class ShapeTransfer(bpy.types.Operator):
|
||||
'''Copy another selected objects active shape to this one by applying the relative offsets'''
|
||||
'''Copy another selected objects active shape to this one by ''' \
|
||||
'''applying the relative offsets'''
|
||||
|
||||
bl_idname = "object.shape_key_transfer"
|
||||
bl_label = "Transfer Shape Key"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
mode = EnumProperty(items=(
|
||||
('OFFSET', "Offset", "Apply the relative positional offset"),
|
||||
('RELATIVE_FACE', "Relative Face", "Calculate the geometricly relative position (using faces)."),
|
||||
('RELATIVE_EDGE', "Relative Edge", "Calculate the geometricly relative position (using edges).")),
|
||||
name="Transformation Mode",
|
||||
description="Method to apply relative shape positions to the new shape",
|
||||
default='OFFSET')
|
||||
|
||||
use_clamp = BoolProperty(name="Clamp Offset",
|
||||
description="Clamp the transformation to the distance each vertex moves in the original shape.",
|
||||
default=False)
|
||||
mode = EnumProperty(
|
||||
items=(('OFFSET',
|
||||
"Offset",
|
||||
"Apply the relative positional offset",
|
||||
),
|
||||
('RELATIVE_FACE',
|
||||
"Relative Face",
|
||||
"Calculate relative position (using faces).",
|
||||
),
|
||||
('RELATIVE_EDGE',
|
||||
"Relative Edge",
|
||||
"Calculate relative position (using edges).",
|
||||
),
|
||||
),
|
||||
name="Transformation Mode",
|
||||
description="Relative shape positions to the new shape method",
|
||||
default='OFFSET',
|
||||
)
|
||||
use_clamp = BoolProperty(
|
||||
name="Clamp Offset",
|
||||
description=("Clamp the transformation to the distance each "
|
||||
"vertex moves in the original shape."),
|
||||
default=False,
|
||||
)
|
||||
|
||||
def _main(self, ob_act, objects, mode='OFFSET', use_clamp=False):
|
||||
|
||||
@@ -272,13 +311,16 @@ class ShapeTransfer(bpy.types.Operator):
|
||||
orig_shape_coords = me_cos(ob_act.active_shape_key.data)
|
||||
|
||||
orig_normals = me_nos(me.vertices)
|
||||
# orig_coords = me_cos(me.vertices) # the actual mverts location isnt as relyable as the base shape :S
|
||||
# the actual mverts location isnt as relyable as the base shape :S
|
||||
# orig_coords = me_cos(me.vertices)
|
||||
orig_coords = me_cos(me.shape_keys.key_blocks[0].data)
|
||||
|
||||
for ob_other in objects:
|
||||
me_other = ob_other.data
|
||||
if len(me_other.vertices) != len(me.vertices):
|
||||
self.report({'WARNING'}, "Skipping '%s', vertex count differs" % ob_other.name)
|
||||
self.report({'WARNING'},
|
||||
("Skipping '%s', "
|
||||
"vertex count differs") % ob_other.name)
|
||||
continue
|
||||
|
||||
target_normals = me_nos(me_other.vertices)
|
||||
@@ -395,7 +437,10 @@ class ShapeTransfer(bpy.types.Operator):
|
||||
|
||||
if 1: # swap from/to, means we cant copy to many at once.
|
||||
if len(objects) != 1:
|
||||
self.report({'ERROR'}, "Expected one other selected mesh object to copy from")
|
||||
self.report({'ERROR'},
|
||||
("Expected one other selected "
|
||||
"mesh object to copy from"))
|
||||
|
||||
return {'CANCELLED'}
|
||||
ob_act, objects = objects[0], [ob_act]
|
||||
|
||||
@@ -429,11 +474,14 @@ class JoinUVs(bpy.types.Operator):
|
||||
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
|
||||
|
||||
if not mesh.uv_textures:
|
||||
self.report({'WARNING'}, "Object: %s, Mesh: '%s' has no UVs\n" % (obj.name, mesh.name))
|
||||
self.report({'WARNING'},
|
||||
"Object: %s, Mesh: '%s' has no UVs"
|
||||
% (obj.name, mesh.name))
|
||||
else:
|
||||
len_faces = len(mesh.faces)
|
||||
|
||||
uv_array = array.array('f', [0.0] * 8) * len_faces # seems to be the fastest way to create an array
|
||||
# seems to be the fastest way to create an array
|
||||
uv_array = array.array('f', [0.0] * 8) * len_faces
|
||||
mesh.uv_textures.active.data.foreach_get("uv_raw", uv_array)
|
||||
|
||||
objects = context.selected_editable_objects[:]
|
||||
@@ -454,7 +502,8 @@ class JoinUVs(bpy.types.Operator):
|
||||
else:
|
||||
uv_other = mesh_other.uv_textures.active
|
||||
if not uv_other:
|
||||
uv_other = mesh_other.uv_textures.new() # should return the texture it adds
|
||||
# should return the texture it adds
|
||||
uv_other = mesh_other.uv_textures.new()
|
||||
|
||||
# finally do the copy
|
||||
uv_other.data.foreach_set("uv_raw", uv_array)
|
||||
@@ -482,14 +531,18 @@ class MakeDupliFace(bpy.types.Operator):
|
||||
|
||||
SCALE_FAC = 0.01
|
||||
offset = 0.5 * SCALE_FAC
|
||||
base_tri = Vector((-offset, -offset, 0.0)), Vector((offset, -offset, 0.0)), Vector((offset, offset, 0.0)), Vector((-offset, offset, 0.0))
|
||||
base_tri = (Vector((-offset, -offset, 0.0)),
|
||||
Vector((+offset, -offset, 0.0)),
|
||||
Vector((+offset, +offset, 0.0)),
|
||||
Vector((-offset, +offset, 0.0)),
|
||||
)
|
||||
|
||||
def matrix_to_quat(matrix):
|
||||
# scale = matrix.median_scale
|
||||
trans = matrix.to_translation()
|
||||
rot = matrix.to_3x3() # also contains scale
|
||||
|
||||
return [(b * rot) + trans for b in base_tri]
|
||||
return [(rot * b) + trans for b in base_tri]
|
||||
scene = bpy.context.scene
|
||||
linked = {}
|
||||
for obj in bpy.context.selected_objects:
|
||||
@@ -498,7 +551,10 @@ class MakeDupliFace(bpy.types.Operator):
|
||||
linked.setdefault(data, []).append(obj)
|
||||
|
||||
for data, objects in linked.items():
|
||||
face_verts = [axis for obj in objects for v in matrix_to_quat(obj.matrix_world) for axis in v]
|
||||
face_verts = [axis for obj in objects
|
||||
for v in matrix_to_quat(obj.matrix_world)
|
||||
for axis in v]
|
||||
|
||||
faces = list(range(len(face_verts) // 3))
|
||||
|
||||
mesh = bpy.data.meshes.new(data.name + "_dupli")
|
||||
@@ -535,7 +591,8 @@ class MakeDupliFace(bpy.types.Operator):
|
||||
|
||||
|
||||
class IsolateTypeRender(bpy.types.Operator):
|
||||
'''Hide unselected render objects of same type as active by setting the hide render flag'''
|
||||
'''Hide unselected render objects of same type as active ''' \
|
||||
'''by setting the hide render flag'''
|
||||
bl_idname = "object.isolate_type_render"
|
||||
bl_label = "Restrict Render Unselected"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
@@ -16,102 +16,107 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
|
||||
import bpy
|
||||
from mathutils import Vector
|
||||
|
||||
def GlobalBB_LQ(bb_world):
|
||||
|
||||
|
||||
# Initialize the variables with the 8th vertex
|
||||
left, right, front, back, down, up =\
|
||||
bb_world[7][0],\
|
||||
bb_world[7][0],\
|
||||
bb_world[7][1],\
|
||||
bb_world[7][1],\
|
||||
bb_world[7][2],\
|
||||
bb_world[7][2]
|
||||
|
||||
left, right, front, back, down, up = (bb_world[7][0],
|
||||
bb_world[7][0],
|
||||
bb_world[7][1],
|
||||
bb_world[7][1],
|
||||
bb_world[7][2],
|
||||
bb_world[7][2],
|
||||
)
|
||||
|
||||
# Test against the other 7 verts
|
||||
for i in range (7):
|
||||
|
||||
|
||||
# X Range
|
||||
val = bb_world[i][0]
|
||||
if val < left:
|
||||
left = val
|
||||
|
||||
|
||||
if val > right:
|
||||
right = val
|
||||
|
||||
|
||||
# Y Range
|
||||
val = bb_world[i][1]
|
||||
if val < front:
|
||||
front = val
|
||||
|
||||
|
||||
if val > back:
|
||||
back = val
|
||||
|
||||
|
||||
# Z Range
|
||||
val = bb_world[i][2]
|
||||
if val < down:
|
||||
down = val
|
||||
|
||||
|
||||
if val > up:
|
||||
up = val
|
||||
|
||||
|
||||
return (Vector((left, front, up)), Vector((right, back, down)))
|
||||
|
||||
def GlobalBB_HQ(obj):
|
||||
|
||||
|
||||
matrix_world = obj.matrix_world.copy()
|
||||
|
||||
|
||||
# Initialize the variables with the last vertex
|
||||
|
||||
|
||||
verts = obj.data.vertices
|
||||
|
||||
val = verts[-1].co * matrix_world
|
||||
|
||||
left, right, front, back, down, up =\
|
||||
val[0],\
|
||||
val[0],\
|
||||
val[1],\
|
||||
val[1],\
|
||||
val[2],\
|
||||
val[2]
|
||||
|
||||
|
||||
val = matrix_world * verts[-1].co
|
||||
|
||||
left, right, front, back, down, up = (val[0],
|
||||
val[0],
|
||||
val[1],
|
||||
val[1],
|
||||
val[2],
|
||||
val[2],
|
||||
)
|
||||
|
||||
# Test against all other verts
|
||||
for i in range (len(verts)-1):
|
||||
|
||||
vco = verts[i].co * matrix_world
|
||||
|
||||
|
||||
vco = matrix_world * verts[i].co
|
||||
|
||||
# X Range
|
||||
val = vco[0]
|
||||
if val < left:
|
||||
left = val
|
||||
|
||||
|
||||
if val > right:
|
||||
right = val
|
||||
|
||||
|
||||
# Y Range
|
||||
val = vco[1]
|
||||
if val < front:
|
||||
front = val
|
||||
|
||||
|
||||
if val > back:
|
||||
back = val
|
||||
|
||||
|
||||
# Z Range
|
||||
val = vco[2]
|
||||
if val < down:
|
||||
down = val
|
||||
|
||||
|
||||
if val > up:
|
||||
up = val
|
||||
|
||||
return (Vector((left, front, up)), Vector((right, back, down)))
|
||||
|
||||
return Vector((left, front, up)), Vector((right, back, down))
|
||||
|
||||
|
||||
def align_objects(align_x, align_y, align_z, align_mode, relative_to, bb_quality):
|
||||
def align_objects(align_x,
|
||||
align_y,
|
||||
align_z,
|
||||
align_mode,
|
||||
relative_to,
|
||||
bb_quality):
|
||||
|
||||
cursor = bpy.context.scene.cursor_location
|
||||
|
||||
@@ -123,20 +128,20 @@ def align_objects(align_x, align_y, align_z, align_mode, relative_to, bb_quality
|
||||
objs = []
|
||||
|
||||
for obj in bpy.context.selected_objects:
|
||||
matrix_world = obj.matrix_world
|
||||
bb_world = [Vector(v[:]) * matrix_world for v in obj.bound_box]
|
||||
matrix_world = obj.matrix_world.copy()
|
||||
bb_world = [matrix_world * Vector(v[:]) for v in obj.bound_box]
|
||||
objs.append((obj, bb_world))
|
||||
|
||||
if not objs:
|
||||
return False
|
||||
|
||||
for obj, bb_world in objs:
|
||||
|
||||
|
||||
if bb_quality:
|
||||
GBB = GlobalBB_HQ(obj)
|
||||
else:
|
||||
GBB = GlobalBB_LQ(bb_world)
|
||||
|
||||
|
||||
Left_Front_Up = GBB[0]
|
||||
Right_Back_Down = GBB[1]
|
||||
|
||||
@@ -193,13 +198,14 @@ def align_objects(align_x, align_y, align_z, align_mode, relative_to, bb_quality
|
||||
# Main Loop
|
||||
|
||||
for obj, bb_world in objs:
|
||||
bb_world = [Vector(v[:]) * obj.matrix_world for v in obj.bound_box]
|
||||
|
||||
matrix_world = obj.matrix_world.copy()
|
||||
bb_world = [matrix_world * Vector(v[:]) for v in obj.bound_box]
|
||||
|
||||
if bb_quality:
|
||||
GBB = GlobalBB_HQ(obj)
|
||||
else:
|
||||
GBB = GlobalBB_LQ(bb_world)
|
||||
|
||||
|
||||
Left_Front_Up = GBB[0]
|
||||
Right_Back_Down = GBB[1]
|
||||
|
||||
@@ -339,8 +345,10 @@ class AlignObjects(bpy.types.Operator):
|
||||
|
||||
bb_quality = BoolProperty(
|
||||
name="High Quality",
|
||||
description="Enables high quality calculation of the bounding box for perfect results on complex shape meshes with rotation/scale (Slow)",
|
||||
default=False)
|
||||
description=("Enables high quality calculation of the "
|
||||
"bounding box for perfect results on complex "
|
||||
"shape meshes with rotation/scale (Slow)"),
|
||||
default=True)
|
||||
|
||||
align_mode = EnumProperty(items=(
|
||||
('OPT_1', "Negative Sides", ""),
|
||||
@@ -374,10 +382,15 @@ class AlignObjects(bpy.types.Operator):
|
||||
|
||||
def execute(self, context):
|
||||
align_axis = self.align_axis
|
||||
ret = align_objects('X' in align_axis, 'Y' in align_axis, 'Z' in align_axis, self.align_mode, self.relative_to, self.bb_quality)
|
||||
ret = align_objects('X' in align_axis,
|
||||
'Y' in align_axis,
|
||||
'Z' in align_axis,
|
||||
self.align_mode,
|
||||
self.relative_to,
|
||||
self.bb_quality)
|
||||
|
||||
if not ret:
|
||||
self.report({'WARNING'}, "No objects with bound-box selected")
|
||||
return {'CANCELLED'}
|
||||
else:
|
||||
return {'FINISHED'}
|
||||
return {'FINISHED'}
|
||||
|
||||
@@ -16,11 +16,16 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
|
||||
from mathutils import Vector
|
||||
import bpy
|
||||
from bpy.props import BoolProperty, EnumProperty, IntProperty, FloatProperty, FloatVectorProperty
|
||||
from bpy.props import (BoolProperty,
|
||||
EnumProperty,
|
||||
IntProperty,
|
||||
FloatProperty,
|
||||
FloatVectorProperty,
|
||||
)
|
||||
|
||||
|
||||
def object_ensure_material(obj, mat_name):
|
||||
@@ -61,7 +66,8 @@ class QuickFur(bpy.types.Operator):
|
||||
|
||||
def execute(self, context):
|
||||
fake_context = bpy.context.copy()
|
||||
mesh_objects = [obj for obj in context.selected_objects if obj.type == 'MESH']
|
||||
mesh_objects = [obj for obj in context.selected_objects
|
||||
if obj.type == 'MESH']
|
||||
|
||||
if not mesh_objects:
|
||||
self.report({'ERROR'}, "Select at least one mesh object.")
|
||||
@@ -92,7 +98,8 @@ class QuickFur(bpy.types.Operator):
|
||||
psys.settings.child_type = 'INTERPOLATED'
|
||||
|
||||
obj.data.materials.append(mat)
|
||||
obj.particle_systems[-1].settings.material = len(obj.data.materials)
|
||||
obj.particle_systems[-1].settings.material = \
|
||||
len(obj.data.materials)
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
@@ -149,7 +156,10 @@ class QuickExplode(bpy.types.Operator):
|
||||
|
||||
for obj in mesh_objects:
|
||||
if obj.particle_systems:
|
||||
self.report({'ERROR'}, "Object %r already has a particle system" % obj.name)
|
||||
self.report({'ERROR'},
|
||||
"Object %r already has a "
|
||||
"particle system" % obj.name)
|
||||
|
||||
return {'CANCELLED'}
|
||||
|
||||
if self.fade:
|
||||
@@ -184,9 +194,7 @@ class QuickExplode(bpy.types.Operator):
|
||||
|
||||
if self.fade:
|
||||
explode.show_dead = False
|
||||
bpy.ops.mesh.uv_texture_add(fake_context)
|
||||
uv = obj.data.uv_textures[-1]
|
||||
uv.name = "Explode fade"
|
||||
uv = obj.data.uv_textures.new("Explode fade")
|
||||
explode.particle_uv = uv.name
|
||||
|
||||
mat = object_ensure_material(obj, "Explode Fade")
|
||||
@@ -247,7 +255,7 @@ class QuickExplode(bpy.types.Operator):
|
||||
|
||||
def obj_bb_minmax(obj, min_co, max_co):
|
||||
for i in range(0, 8):
|
||||
bb_vec = Vector(obj.bound_box[i]) * obj.matrix_world
|
||||
bb_vec = obj.matrix_world * Vector(obj.bound_box[i])
|
||||
|
||||
min_co[0] = min(bb_vec[0], min_co[0])
|
||||
min_co[1] = min(bb_vec[1], min_co[1])
|
||||
@@ -262,21 +270,26 @@ class QuickSmoke(bpy.types.Operator):
|
||||
bl_label = "Quick Smoke"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
style = EnumProperty(items=(
|
||||
('STREAM', "Stream", ""),
|
||||
('PUFF', "Puff", ""),
|
||||
('FIRE', "Fire", "")),
|
||||
name="Smoke Style",
|
||||
description="",
|
||||
default='STREAM')
|
||||
style = EnumProperty(
|
||||
items=(('STREAM', "Stream", ""),
|
||||
('PUFF', "Puff", ""),
|
||||
('FIRE', "Fire", ""),
|
||||
),
|
||||
name="Smoke Style",
|
||||
description="",
|
||||
default='STREAM',
|
||||
)
|
||||
|
||||
show_flows = BoolProperty(name="Render Smoke Objects",
|
||||
description="Keep the smoke objects visible during rendering.",
|
||||
default=False)
|
||||
show_flows = BoolProperty(
|
||||
name="Render Smoke Objects",
|
||||
description="Keep the smoke objects visible during rendering.",
|
||||
default=False,
|
||||
)
|
||||
|
||||
def execute(self, context):
|
||||
fake_context = bpy.context.copy()
|
||||
mesh_objects = [obj for obj in context.selected_objects if obj.type == 'MESH']
|
||||
mesh_objects = [obj for obj in context.selected_objects
|
||||
if obj.type == 'MESH']
|
||||
min_co = Vector((100000.0, 100000.0, 100000.0))
|
||||
max_co = -min_co
|
||||
|
||||
@@ -336,21 +349,25 @@ class QuickSmoke(bpy.types.Operator):
|
||||
mat.volume.density = 0
|
||||
mat.volume.density_scale = 5
|
||||
|
||||
mat.texture_slots.add()
|
||||
mat.texture_slots[0].texture = bpy.data.textures.new("Smoke Density", 'VOXEL_DATA')
|
||||
mat.texture_slots[0].texture.voxel_data.domain_object = obj
|
||||
mat.texture_slots[0].use_map_color_emission = False
|
||||
mat.texture_slots[0].use_map_density = True
|
||||
tex = bpy.data.textures.new("Smoke Density", 'VOXEL_DATA')
|
||||
tex.voxel_data.domain_object = obj
|
||||
|
||||
tex_slot = mat.texture_slots.add()
|
||||
tex_slot.texture = tex
|
||||
tex_slot.use_map_color_emission = False
|
||||
tex_slot.use_map_density = True
|
||||
|
||||
# for fire add a second texture for emission and emission color
|
||||
if self.style == 'FIRE':
|
||||
mat.volume.emission = 5
|
||||
mat.texture_slots.add()
|
||||
mat.texture_slots[1].texture = bpy.data.textures.new("Smoke Heat", 'VOXEL_DATA')
|
||||
mat.texture_slots[1].texture.voxel_data.domain_object = obj
|
||||
mat.texture_slots[1].texture.use_color_ramp = True
|
||||
tex = bpy.data.textures.new("Smoke Heat", 'VOXEL_DATA')
|
||||
tex.voxel_data.domain_object = obj
|
||||
tex.use_color_ramp = True
|
||||
|
||||
ramp = mat.texture_slots[1].texture.color_ramp
|
||||
tex_slot = mat.texture_slots.add()
|
||||
tex_slot.texture = tex
|
||||
|
||||
ramp = tex.color_ramp
|
||||
|
||||
elem = ramp.elements.new(0.333)
|
||||
elem.color[0] = elem.color[3] = 1
|
||||
@@ -371,28 +388,38 @@ class QuickFluid(bpy.types.Operator):
|
||||
bl_label = "Quick Fluid"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
style = EnumProperty(items=(
|
||||
('INFLOW', "Inflow", ""),
|
||||
('BASIC', "Basic", "")),
|
||||
style = EnumProperty(
|
||||
items=(('INFLOW', "Inflow", ""),
|
||||
('BASIC', "Basic", ""),
|
||||
),
|
||||
name="Fluid Style",
|
||||
description="",
|
||||
default='BASIC')
|
||||
|
||||
initial_velocity = FloatVectorProperty(name="Initial Velocity",
|
||||
description="Initial velocity of the fluid",
|
||||
default=(0.0, 0.0, 0.0), min=-100.0, max=100.0, subtype='VELOCITY')
|
||||
|
||||
show_flows = BoolProperty(name="Render Fluid Objects",
|
||||
description="Keep the fluid objects visible during rendering.",
|
||||
default=False)
|
||||
|
||||
start_baking = BoolProperty(name="Start Fluid Bake",
|
||||
description="Start baking the fluid immediately after creating the domain object.",
|
||||
default=False)
|
||||
default='BASIC',
|
||||
)
|
||||
initial_velocity = FloatVectorProperty(
|
||||
name="Initial Velocity",
|
||||
description="Initial velocity of the fluid",
|
||||
default=(0.0, 0.0, 0.0),
|
||||
min=-100.0,
|
||||
max=100.0,
|
||||
subtype='VELOCITY',
|
||||
)
|
||||
show_flows = BoolProperty(
|
||||
name="Render Fluid Objects",
|
||||
description="Keep the fluid objects visible during rendering.",
|
||||
default=False,
|
||||
)
|
||||
start_baking = BoolProperty(
|
||||
name="Start Fluid Bake",
|
||||
description=("Start baking the fluid immediately "
|
||||
"after creating the domain object"),
|
||||
default=False,
|
||||
)
|
||||
|
||||
def execute(self, context):
|
||||
fake_context = bpy.context.copy()
|
||||
mesh_objects = [obj for obj in context.selected_objects if (obj.type == 'MESH' and not 0 in obj.dimensions)]
|
||||
mesh_objects = [obj for obj in context.selected_objects
|
||||
if (obj.type == 'MESH' and not 0.0 in obj.dimensions)]
|
||||
min_co = Vector((100000, 100000, 100000))
|
||||
max_co = Vector((-100000, -100000, -100000))
|
||||
|
||||
@@ -405,7 +432,8 @@ class QuickFluid(bpy.types.Operator):
|
||||
# make each selected object a fluid
|
||||
bpy.ops.object.modifier_add(fake_context, type='FLUID_SIMULATION')
|
||||
|
||||
# fluid has to be before constructive modifiers, so it might not be the last modifier
|
||||
# fluid has to be before constructive modifiers,
|
||||
# so it might not be the last modifier
|
||||
for mod in obj.modifiers:
|
||||
if mod.type == 'FLUID_SIMULATION':
|
||||
break
|
||||
@@ -429,10 +457,14 @@ class QuickFluid(bpy.types.Operator):
|
||||
obj = context.active_object
|
||||
obj.name = "Fluid Domain"
|
||||
|
||||
# give the fluid some room below the flows and scale with initial velocity
|
||||
# give the fluid some room below the flows
|
||||
# and scale with initial velocity
|
||||
v = 0.5 * self.initial_velocity
|
||||
obj.location = 0.5 * (max_co + min_co) + Vector((0.0, 0.0, -1.0)) + v
|
||||
obj.scale = 0.5 * (max_co - min_co) + Vector((1.0, 1.0, 2.0)) + Vector((abs(v[0]), abs(v[1]), abs(v[2])))
|
||||
obj.scale = (0.5 * (max_co - min_co) +
|
||||
Vector((1.0, 1.0, 2.0)) +
|
||||
Vector((abs(v[0]), abs(v[1]), abs(v[2])))
|
||||
)
|
||||
|
||||
# setup smoke domain
|
||||
bpy.ops.object.modifier_add(type='FLUID_SIMULATION')
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
|
||||
import bpy
|
||||
|
||||
@@ -93,40 +93,69 @@ class RandomizeLocRotSize(bpy.types.Operator):
|
||||
bl_label = "Randomize Transform"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
random_seed = IntProperty(name="Random Seed",
|
||||
description="Seed value for the random generator",
|
||||
default=0, min=0, max=1000)
|
||||
|
||||
use_delta = BoolProperty(name="Transform Delta",
|
||||
description="Randomize delta transform values instead of regular transform", default=False)
|
||||
|
||||
use_loc = BoolProperty(name="Randomize Location",
|
||||
description="Randomize the location values", default=True)
|
||||
|
||||
loc = FloatVectorProperty(name="Location",
|
||||
description="Maximun distance the objects can spread over each axis",
|
||||
default=(0.0, 0.0, 0.0), min=-100.0, max=100.0, subtype='TRANSLATION')
|
||||
|
||||
use_rot = BoolProperty(name="Randomize Rotation",
|
||||
description="Randomize the rotation values", default=True)
|
||||
|
||||
rot = FloatVectorProperty(name="Rotation",
|
||||
description="Maximun rotation over each axis",
|
||||
default=(0.0, 0.0, 0.0), min=-180.0, max=180.0, subtype='TRANSLATION')
|
||||
|
||||
use_scale = BoolProperty(name="Randomize Scale",
|
||||
description="Randomize the scale values", default=True)
|
||||
|
||||
scale_even = BoolProperty(name="Scale Even",
|
||||
description="Use the same scale value for all axis", default=False)
|
||||
random_seed = IntProperty(
|
||||
name="Random Seed",
|
||||
description="Seed value for the random generator",
|
||||
min=0,
|
||||
max=1000,
|
||||
default=0,
|
||||
)
|
||||
use_delta = BoolProperty(
|
||||
name="Transform Delta",
|
||||
description=("Randomize delta transform values "
|
||||
"instead of regular transform"),
|
||||
default=False,
|
||||
)
|
||||
use_loc = BoolProperty(
|
||||
name="Randomize Location",
|
||||
description="Randomize the location values",
|
||||
default=True,
|
||||
)
|
||||
loc = FloatVectorProperty(
|
||||
name="Location",
|
||||
description=("Maximun distance the objects "
|
||||
"can spread over each axis"),
|
||||
min=-100.0,
|
||||
max=100.0,
|
||||
default=(0.0, 0.0, 0.0),
|
||||
subtype='TRANSLATION',
|
||||
)
|
||||
use_rot = BoolProperty(
|
||||
name="Randomize Rotation",
|
||||
description="Randomize the rotation values",
|
||||
default=True,
|
||||
)
|
||||
rot = FloatVectorProperty(
|
||||
name="Rotation",
|
||||
description="Maximun rotation over each axis",
|
||||
min=-180.0,
|
||||
max=180.0,
|
||||
default=(0.0, 0.0, 0.0),
|
||||
subtype='TRANSLATION',
|
||||
)
|
||||
use_scale = BoolProperty(
|
||||
name="Randomize Scale",
|
||||
description="Randomize the scale values",
|
||||
default=True,
|
||||
)
|
||||
scale_even = BoolProperty(
|
||||
name="Scale Even",
|
||||
description="Use the same scale value for all axis",
|
||||
default=False,
|
||||
)
|
||||
|
||||
'''scale_min = FloatProperty(name="Minimun Scale Factor",
|
||||
description="Lowest scale percentage possible",
|
||||
default=0.15, min=-1.0, max=1.0, precision=3)'''
|
||||
|
||||
scale = FloatVectorProperty(name="Scale",
|
||||
description="Maximum scale randomization over each axis",
|
||||
default=(0.0, 0.0, 0.0), min=-100.0, max=100.0, subtype='TRANSLATION')
|
||||
scale = FloatVectorProperty(
|
||||
name="Scale",
|
||||
description="Maximum scale randomization over each axis",
|
||||
min=-100.0,
|
||||
max=100.0,
|
||||
default=(0.0, 0.0, 0.0),
|
||||
subtype='TRANSLATION',
|
||||
)
|
||||
|
||||
def execute(self, context):
|
||||
from math import radians
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
|
||||
import bpy
|
||||
|
||||
@@ -30,8 +30,15 @@ class AddPresetBase():
|
||||
# bl_label = "Add a Python Preset"
|
||||
bl_options = {'REGISTER'} # only because invoke_props_popup requires.
|
||||
|
||||
name = bpy.props.StringProperty(name="Name", description="Name of the preset, used to make the path name", maxlen=64, default="")
|
||||
remove_active = bpy.props.BoolProperty(default=False, options={'HIDDEN'})
|
||||
name = bpy.props.StringProperty(
|
||||
name="Name",
|
||||
description="Name of the preset, used to make the path name",
|
||||
maxlen=64,
|
||||
)
|
||||
remove_active = bpy.props.BoolProperty(
|
||||
default=False,
|
||||
options={'HIDDEN'},
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def as_filename(name): # could reuse for other presets
|
||||
@@ -54,7 +61,10 @@ class AddPresetBase():
|
||||
|
||||
filename = self.as_filename(name)
|
||||
|
||||
target_path = bpy.utils.user_resource('SCRIPTS', os.path.join("presets", self.preset_subdir), create=True)
|
||||
target_path = os.path.join("presets", self.preset_subdir)
|
||||
target_path = bpy.utils.user_resource('SCRIPTS',
|
||||
target_path,
|
||||
create=True)
|
||||
|
||||
if not target_path:
|
||||
self.report({'WARNING'}, "Failed to create presets path")
|
||||
@@ -95,7 +105,9 @@ class AddPresetBase():
|
||||
filepath = bpy.utils.preset_find(preset_active, self.preset_subdir)
|
||||
|
||||
if not filepath:
|
||||
filepath = bpy.utils.preset_find(preset_active, self.preset_subdir, display_name=True)
|
||||
filepath = bpy.utils.preset_find(preset_active,
|
||||
self.preset_subdir,
|
||||
display_name=True)
|
||||
|
||||
if not filepath:
|
||||
return {'CANCELLED'}
|
||||
@@ -133,8 +145,15 @@ class ExecutePreset(bpy.types.Operator):
|
||||
bl_idname = "script.execute_preset"
|
||||
bl_label = "Execute a Python Preset"
|
||||
|
||||
filepath = bpy.props.StringProperty(name="Path", description="Path of the Python file to execute", maxlen=512, default="")
|
||||
menu_idname = bpy.props.StringProperty(name="Menu ID Name", description="ID name of the menu this was called from", default="")
|
||||
filepath = bpy.props.StringProperty(
|
||||
name="Path",
|
||||
description="Path of the Python file to execute",
|
||||
maxlen=512,
|
||||
)
|
||||
menu_idname = bpy.props.StringProperty(
|
||||
name="Menu ID Name",
|
||||
description="ID name of the menu this was called from",
|
||||
)
|
||||
|
||||
def execute(self, context):
|
||||
from os.path import basename
|
||||
@@ -182,7 +201,10 @@ class AddPresetSSS(AddPresetBase, bpy.types.Operator):
|
||||
preset_menu = "MATERIAL_MT_sss_presets"
|
||||
|
||||
preset_defines = [
|
||||
"material = (bpy.context.material.active_node_material if bpy.context.material.active_node_material else bpy.context.material)"
|
||||
("material = "
|
||||
"bpy.context.material.active_node_material "
|
||||
"if bpy.context.material.active_node_material "
|
||||
"else bpy.context.material")
|
||||
]
|
||||
|
||||
preset_values = [
|
||||
@@ -306,7 +328,11 @@ class AddPresetOperator(AddPresetBase, bpy.types.Operator):
|
||||
bl_label = "Operator Preset"
|
||||
preset_menu = "WM_MT_operator_presets"
|
||||
|
||||
operator = bpy.props.StringProperty(name="Operator", maxlen=64, options={'HIDDEN'})
|
||||
operator = bpy.props.StringProperty(
|
||||
name="Operator",
|
||||
maxlen=64,
|
||||
options={'HIDDEN'},
|
||||
)
|
||||
|
||||
# XXX, not ideal
|
||||
preset_defines = [
|
||||
@@ -322,12 +348,15 @@ class AddPresetOperator(AddPresetBase, bpy.types.Operator):
|
||||
properties_blacklist = bpy.types.Operator.bl_rna.properties.keys()
|
||||
|
||||
prefix, suffix = self.operator.split("_OT_", 1)
|
||||
operator_rna = getattr(getattr(bpy.ops, prefix.lower()), suffix).get_rna().bl_rna
|
||||
op = getattr(getattr(bpy.ops, prefix.lower()), suffix)
|
||||
operator_rna = op.get_rna().bl_rna
|
||||
del op
|
||||
|
||||
ret = []
|
||||
for prop_id, prop in operator_rna.properties.items():
|
||||
if (not (prop.is_hidden or prop.is_skip_save)) and prop_id not in properties_blacklist:
|
||||
ret.append("op.%s" % prop_id)
|
||||
if not (prop.is_hidden or prop.is_skip_save):
|
||||
if prop_id not in properties_blacklist:
|
||||
ret.append("op.%s" % prop_id)
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
@@ -1,27 +1,23 @@
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
# ##### BEGIN GPL LICENSE BLOCK #####
|
||||
#
|
||||
# Script copyright (C) Campbell J Barton
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# ***** END GPL LICENCE BLOCK *****
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
|
||||
# History
|
||||
#
|
||||
# Originally written by Matt Ebb
|
||||
|
||||
import bpy
|
||||
@@ -46,8 +42,10 @@ def guess_player_path(preset):
|
||||
player_path = "djv_view"
|
||||
|
||||
if sys.platform == "darwin":
|
||||
# TODO, crummy supporting only 1 version, could find the newest installed version
|
||||
test_path = '/Applications/djv-0.8.2.app/Contents/Resources/bin/djv_view'
|
||||
# TODO, crummy supporting only 1 version,
|
||||
# could find the newest installed version
|
||||
test_path = ("/Applications/djv-0.8.2.app"
|
||||
"/Contents/Resources/bin/djv_view")
|
||||
if os.path.exists(test_path):
|
||||
player_path = test_path
|
||||
|
||||
@@ -60,6 +58,9 @@ def guess_player_path(preset):
|
||||
elif preset == 'MPLAYER':
|
||||
player_path = "mplayer"
|
||||
|
||||
else:
|
||||
player_path = ""
|
||||
|
||||
return player_path
|
||||
|
||||
|
||||
@@ -82,10 +83,10 @@ class PlayRenderedAnim(bpy.types.Operator):
|
||||
is_movie = rd.is_movie_format
|
||||
|
||||
# try and guess a command line if it doesn't exist
|
||||
if player_path == '':
|
||||
if player_path == "":
|
||||
player_path = guess_player_path(preset)
|
||||
|
||||
if is_movie == False and preset in ('FRAMECYCLER', 'RV', 'MPLAYER'):
|
||||
if is_movie == False and preset in {'FRAMECYCLER', 'RV', 'MPLAYER'}:
|
||||
# replace the number with '#'
|
||||
file_a = rd.frame_path(frame=0)
|
||||
|
||||
@@ -95,11 +96,11 @@ class PlayRenderedAnim(bpy.types.Operator):
|
||||
|
||||
while len(file_a) == len(file_b):
|
||||
frame_tmp = (frame_tmp * 10) + 9
|
||||
print(frame_tmp)
|
||||
file_b = rd.frame_path(frame=frame_tmp)
|
||||
file_b = rd.frame_path(frame=int(frame_tmp / 10))
|
||||
|
||||
file = "".join((c if file_b[i] == c else "#") for i, c in enumerate(file_a))
|
||||
file = ("".join((c if file_b[i] == c else "#")
|
||||
for i, c in enumerate(file_a)))
|
||||
else:
|
||||
# works for movies and images
|
||||
file = rd.frame_path(frame=scene.frame_start)
|
||||
@@ -112,7 +113,7 @@ class PlayRenderedAnim(bpy.types.Operator):
|
||||
opts = ["-a", "-f", str(rd.fps), str(rd.fps_base), file]
|
||||
cmd.extend(opts)
|
||||
elif preset == 'DJV':
|
||||
opts = [file, "-playback_speed", str(rd.fps)]
|
||||
opts = [file, "-playback_speed", "%d" % int(rd.fps / rd.fps_base)]
|
||||
cmd.extend(opts)
|
||||
elif preset == 'FRAMECYCLER':
|
||||
opts = [file, "%d-%d" % (scene.frame_start, scene.frame_end)]
|
||||
@@ -125,18 +126,25 @@ class PlayRenderedAnim(bpy.types.Operator):
|
||||
if is_movie:
|
||||
opts.append(file)
|
||||
else:
|
||||
opts.append("mf://%s" % file.replace("#", "?"))
|
||||
opts += ["-mf", "fps=%.4f" % (rd.fps / rd.fps_base)]
|
||||
opts += [("mf://%s" % file.replace("#", "?")),
|
||||
"-mf",
|
||||
"fps=%.4f" % (rd.fps / rd.fps_base),
|
||||
]
|
||||
|
||||
opts += ["-loop", "0", "-really-quiet", "-fs"]
|
||||
cmd.extend(opts)
|
||||
else: # 'CUSTOM'
|
||||
cmd.append(file)
|
||||
|
||||
# launch it
|
||||
print("Executing command:\n %r" % " ".join(cmd))
|
||||
|
||||
try:
|
||||
process = subprocess.Popen(cmd)
|
||||
except:
|
||||
pass
|
||||
#raise OSError("Couldn't find an external animation player.")
|
||||
except Exception as e:
|
||||
import traceback
|
||||
self.report({'ERROR'},
|
||||
"Couldn't run external animation player with command "
|
||||
"%r\n%s" % (" ".join(cmd), str(e)))
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
@@ -243,7 +243,7 @@ def testNewVecLs2DRotIsBetter(vecs, mat=-1, bestAreaSoFar = -1):
|
||||
|
||||
# Do this allong the way
|
||||
if mat != -1:
|
||||
v = vecs[i] = v*mat
|
||||
v = vecs[i] = mat * v
|
||||
x= v.x
|
||||
y= v.y
|
||||
if x<minx: minx= x
|
||||
@@ -1064,7 +1064,7 @@ def main(context,
|
||||
f_uv = f.uv
|
||||
for j, v in enumerate(f.v):
|
||||
# XXX - note, between mathutils in 2.4 and 2.5 the order changed.
|
||||
f_uv[j][:] = (v.co * MatQuat).xy
|
||||
f_uv[j][:] = (MatQuat * v.co).xy
|
||||
|
||||
|
||||
if USER_SHARE_SPACE:
|
||||
|
||||
@@ -20,8 +20,6 @@
|
||||
import bpy
|
||||
from rna_prop_ui import PropertyPanel
|
||||
|
||||
# TODO, "color_range" not in the UI
|
||||
|
||||
|
||||
class WorldButtonsPanel():
|
||||
bl_space_type = 'PROPERTIES'
|
||||
@@ -95,6 +93,10 @@ class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel):
|
||||
col.prop(world, "zenith_color")
|
||||
col.active = world.use_sky_blend
|
||||
row.column().prop(world, "ambient_color")
|
||||
|
||||
row = layout.row()
|
||||
row.prop(world, "exposure")
|
||||
row.prop(world, "color_range")
|
||||
|
||||
|
||||
class WORLD_PT_ambient_occlusion(WorldButtonsPanel, bpy.types.Panel):
|
||||
|
||||
@@ -60,8 +60,10 @@ class INFO_HT_header(bpy.types.Header):
|
||||
layout.template_running_jobs()
|
||||
|
||||
layout.template_reports_banner()
|
||||
|
||||
layout.label(text=scene.statistics())
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.operator("wm.splash", text="", icon='BLENDER', emboss=False)
|
||||
row.label(text=scene.statistics())
|
||||
|
||||
# XXX: this should be right-aligned to the RHS of the region
|
||||
layout.operator("wm.window_fullscreen_toggle", icon='FULLSCREEN_ENTER', text="")
|
||||
|
||||
@@ -54,21 +54,13 @@ class VIEW3D_HT_header(bpy.types.Header):
|
||||
sub.menu("VIEW3D_MT_object")
|
||||
|
||||
row = layout.row()
|
||||
row.template_header_3D()
|
||||
|
||||
# do in C for now since these buttons cant be both toggle AND exclusive.
|
||||
'''
|
||||
if obj and obj.mode == 'EDIT' and obj.type == 'MESH':
|
||||
row_sub = row.row(align=True)
|
||||
row_sub.prop(toolsettings, "mesh_select_mode", text="", index=0, icon='VERTEXSEL')
|
||||
row_sub.prop(toolsettings, "mesh_select_mode", text="", index=1, icon='EDGESEL')
|
||||
row_sub.prop(toolsettings, "mesh_select_mode", text="", index=2, icon='FACESEL')
|
||||
'''
|
||||
# Contains buttons like Mode, Pivot, Manipulator, Layer, Mesh Select Mode...
|
||||
row.template_header_3D()
|
||||
|
||||
if obj:
|
||||
# Particle edit
|
||||
if obj.mode == 'PARTICLE_EDIT':
|
||||
row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True, toggle=True)
|
||||
row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True)
|
||||
|
||||
# Occlude geometry
|
||||
if view.viewport_shade in {'SOLID', 'SHADED', 'TEXTURED'} and (obj.mode == 'PARTICLE_EDIT' or (obj.mode == 'EDIT' and obj.type == 'MESH')):
|
||||
|
||||
@@ -116,7 +116,8 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, bpy.types.Panel):
|
||||
col.operator("transform.translate")
|
||||
col.operator("transform.rotate")
|
||||
col.operator("transform.resize", text="Scale")
|
||||
col.operator("transform.shrink_fatten", text="Along Normal")
|
||||
col.operator("transform.shrink_fatten", text="Shrink/Fatten")
|
||||
col.operator("transform.push_pull", text="Push/Pull")
|
||||
|
||||
col = layout.column(align=True)
|
||||
col.label(text="Deform:")
|
||||
|
||||
@@ -105,6 +105,7 @@ typedef struct EffectorCache {
|
||||
/* precalculated for guides */
|
||||
struct GuideEffectorData *guide_data;
|
||||
float guide_loc[4], guide_dir[3], guide_radius;
|
||||
float velocity[3];
|
||||
|
||||
float frame;
|
||||
int flag;
|
||||
|
||||
@@ -241,6 +241,16 @@ static void precalculate_effector(EffectorCache *eff)
|
||||
}
|
||||
else if(eff->psys)
|
||||
psys_update_particle_tree(eff->psys, eff->scene->r.cfra);
|
||||
|
||||
/* Store object velocity */
|
||||
if(eff->ob) {
|
||||
float old_vel[3];
|
||||
|
||||
where_is_object_time(eff->scene, eff->ob, cfra - 1.0f);
|
||||
copy_v3_v3(old_vel, eff->ob->obmat[3]);
|
||||
where_is_object_time(eff->scene, eff->ob, cfra);
|
||||
sub_v3_v3v3(eff->velocity, eff->ob->obmat[3], old_vel);
|
||||
}
|
||||
}
|
||||
static EffectorCache *new_effector_cache(Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd)
|
||||
{
|
||||
@@ -680,10 +690,6 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
|
||||
Object *ob = eff->ob;
|
||||
Object obcopy = *ob;
|
||||
|
||||
/* XXX this is not thread-safe, but used from multiple threads by
|
||||
particle system */
|
||||
where_is_object_time(eff->scene, ob, cfra);
|
||||
|
||||
/* use z-axis as normal*/
|
||||
normalize_v3_v3(efd->nor, ob->obmat[2]);
|
||||
|
||||
@@ -702,13 +708,8 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
|
||||
VECCOPY(efd->loc, ob->obmat[3]);
|
||||
}
|
||||
|
||||
if(real_velocity) {
|
||||
VECCOPY(efd->vel, ob->obmat[3]);
|
||||
|
||||
where_is_object_time(eff->scene, ob, cfra - 1.0f);
|
||||
|
||||
sub_v3_v3v3(efd->vel, efd->vel, ob->obmat[3]);
|
||||
}
|
||||
if(real_velocity)
|
||||
copy_v3_v3(efd->vel, eff->velocity);
|
||||
|
||||
*eff->ob = obcopy;
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ struct Tex;
|
||||
struct bContext;
|
||||
struct bNode;
|
||||
struct ID;
|
||||
struct ScrArea;
|
||||
|
||||
/* drawnode.c */
|
||||
void ED_init_node_butfuncs(void);
|
||||
@@ -51,6 +52,8 @@ void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct
|
||||
void ED_node_shader_default(struct Material *ma);
|
||||
void ED_node_composit_default(struct Scene *sce);
|
||||
void ED_node_texture_default(struct Tex *tex);
|
||||
void ED_node_link_intersect_test(struct ScrArea *sa, int test);
|
||||
void ED_node_link_insert(struct ScrArea *sa);
|
||||
|
||||
/* node ops.c */
|
||||
void ED_operatormacros_node(void);
|
||||
|
||||
@@ -851,7 +851,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
|
||||
/* verify we have valid data */
|
||||
if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) {
|
||||
RNA_warning("uiTemplateModifier: expected modifier on object.\n");
|
||||
RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -859,7 +859,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
md= ptr->data;
|
||||
|
||||
if(!ob || !(GS(ob->id.name) == ID_OB)) {
|
||||
RNA_warning("uiTemplateModifier: expected modifier on object.\n");
|
||||
RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -976,9 +976,6 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
|
||||
block= uiLayoutGetBlock(box);
|
||||
|
||||
/* Draw constraint header */
|
||||
|
||||
/* rounded header */
|
||||
// rb_col= (con->flag & CONSTRAINT_ACTIVE)?50:20; // UNUSED
|
||||
|
||||
/* open/close */
|
||||
uiBlockSetEmboss(block, UI_EMBOSSN);
|
||||
@@ -1083,7 +1080,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
|
||||
|
||||
/* verify we have valid data */
|
||||
if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
|
||||
RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
|
||||
RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1091,7 +1088,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
|
||||
con= ptr->data;
|
||||
|
||||
if(!ob || !(GS(ob->id.name) == ID_OB)) {
|
||||
RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
|
||||
RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1137,7 +1134,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
|
||||
PointerRNA texture_ptr;
|
||||
|
||||
if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) {
|
||||
RNA_warning("uiTemplatePreview: expected ID of type material, texture, lamp or world.\n");
|
||||
RNA_warning("uiTemplatePreview: Expected ID of type material, texture, lamp or world.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2171,14 +2168,14 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
|
||||
if(prop) {
|
||||
type= RNA_property_type(prop);
|
||||
if(type != PROP_COLLECTION) {
|
||||
RNA_warning("uiTemplateList: expected collection property.\n");
|
||||
RNA_warning("uiTemplateList: Expected collection property.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
activetype= RNA_property_type(activeprop);
|
||||
if(activetype != PROP_INT) {
|
||||
RNA_warning("uiTemplateList: expected integer property.\n");
|
||||
RNA_warning("uiTemplateList: Expected integer property.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -2170,16 +2170,20 @@ static int game_property_copy_exec(bContext *C, wmOperator *op)
|
||||
} CTX_DATA_END;
|
||||
}
|
||||
}
|
||||
else if (ELEM(type, COPY_PROPERTIES_REPLACE, COPY_PROPERTIES_MERGE)) {
|
||||
|
||||
else {
|
||||
CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
|
||||
if (ob != ob_iter) {
|
||||
if (ob->data != ob_iter->data){
|
||||
if (type == 2) {/* merge */
|
||||
if (type == COPY_PROPERTIES_REPLACE)
|
||||
copy_properties( &ob_iter->prop, &ob->prop );
|
||||
|
||||
/* merge - the default when calling with no argument */
|
||||
else {
|
||||
for(prop = ob->prop.first; prop; prop= prop->next ) {
|
||||
set_ob_property(ob_iter, prop);
|
||||
}
|
||||
} else /* replace */
|
||||
copy_properties( &ob_iter->prop, &ob->prop );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1869,10 +1869,17 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
|
||||
else {
|
||||
/* check cyclic */
|
||||
if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
|
||||
if(link->fromnode->flag & SELECT)
|
||||
th_col1= TH_EDGE_SELECT;
|
||||
if(link->tonode->flag & SELECT)
|
||||
th_col2= TH_EDGE_SELECT;
|
||||
/* special indicated link, on drop-node */
|
||||
if(link->flag & NODE_LINKFLAG_HILITE) {
|
||||
th_col1= th_col2= TH_ACTIVE;
|
||||
}
|
||||
else {
|
||||
/* regular link */
|
||||
if(link->fromnode->flag & SELECT)
|
||||
th_col1= TH_EDGE_SELECT;
|
||||
if(link->tonode->flag & SELECT)
|
||||
th_col2= TH_EDGE_SELECT;
|
||||
}
|
||||
do_shaded= 1;
|
||||
do_triple= 1;
|
||||
}
|
||||
|
||||
@@ -2492,6 +2492,151 @@ void NODE_OT_links_cut(wmOperatorType *ot)
|
||||
RNA_def_int(ot->srna, "cursor", BC_KNIFECURSOR, 0, INT_MAX, "Cursor", "", 0, INT_MAX);
|
||||
}
|
||||
|
||||
/* ********************* automatic node insert on dragging ******************* */
|
||||
|
||||
/* assumes sockets in list */
|
||||
static bNodeSocket *socket_best_match(ListBase *sockets, int type)
|
||||
{
|
||||
bNodeSocket *sock;
|
||||
|
||||
/* first, match type */
|
||||
for(sock= sockets->first; sock; sock= sock->next)
|
||||
if(!(sock->flag & SOCK_HIDDEN))
|
||||
if(type == sock->type)
|
||||
return sock;
|
||||
|
||||
/* then just use first unhidden socket */
|
||||
for(sock= sockets->first; sock; sock= sock->next)
|
||||
if(!(sock->flag & SOCK_HIDDEN))
|
||||
return sock;
|
||||
|
||||
/* OK, let's unhide proper one */
|
||||
for(sock= sockets->first; sock; sock= sock->next) {
|
||||
if(type == sock->type) {
|
||||
sock->flag &= ~SOCK_HIDDEN;
|
||||
return sock;
|
||||
}
|
||||
}
|
||||
|
||||
/* just the first */
|
||||
sock= sockets->first;
|
||||
sock->flag &= ~SOCK_HIDDEN;
|
||||
|
||||
return sockets->first;
|
||||
}
|
||||
|
||||
/* prevent duplicate testing code below */
|
||||
static SpaceNode *ed_node_link_conditions(ScrArea *sa, bNode **select)
|
||||
{
|
||||
SpaceNode *snode= sa?sa->spacedata.first:NULL;
|
||||
bNode *node;
|
||||
bNodeLink *link;
|
||||
|
||||
/* no unlucky accidents */
|
||||
if(sa==NULL || sa->spacetype!=SPACE_NODE) return NULL;
|
||||
|
||||
*select= NULL;
|
||||
|
||||
for(node= snode->edittree->nodes.first; node; node= node->next) {
|
||||
if(node->flag & SELECT) {
|
||||
if(*select)
|
||||
break;
|
||||
else
|
||||
*select= node;
|
||||
}
|
||||
}
|
||||
/* only one selected */
|
||||
if(node || *select==NULL) return NULL;
|
||||
|
||||
/* correct node */
|
||||
if((*select)->inputs.first==NULL || (*select)->outputs.first==NULL) return NULL;
|
||||
|
||||
/* test node for links */
|
||||
for(link= snode->edittree->links.first; link; link=link->next) {
|
||||
if(link->tonode == *select || link->fromnode == *select)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return snode;
|
||||
}
|
||||
|
||||
/* assumes link with NODE_LINKFLAG_HILITE set */
|
||||
void ED_node_link_insert(ScrArea *sa)
|
||||
{
|
||||
bNode *node, *select;
|
||||
SpaceNode *snode= ed_node_link_conditions(sa, &select);
|
||||
bNodeLink *link;
|
||||
bNodeSocket *sockto;
|
||||
|
||||
if(snode==NULL) return;
|
||||
|
||||
/* get the link */
|
||||
for(link= snode->edittree->links.first; link; link=link->next)
|
||||
if(link->flag & NODE_LINKFLAG_HILITE)
|
||||
break;
|
||||
|
||||
if(link) {
|
||||
node= link->tonode;
|
||||
sockto= link->tosock;
|
||||
|
||||
link->tonode= select;
|
||||
link->tosock= socket_best_match(&select->inputs, link->fromsock->type);
|
||||
link->flag &= ~NODE_LINKFLAG_HILITE;
|
||||
|
||||
nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto);
|
||||
ntreeSolveOrder(snode->edittree); /* needed for pointers */
|
||||
snode_tag_changed(snode, select);
|
||||
ED_node_changed_update(snode->id, select);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* test == 0, clear all intersect flags */
|
||||
void ED_node_link_intersect_test(ScrArea *sa, int test)
|
||||
{
|
||||
bNode *select;
|
||||
SpaceNode *snode= ed_node_link_conditions(sa, &select);
|
||||
bNodeLink *link, *selink=NULL;
|
||||
float mcoords[6][2];
|
||||
|
||||
if(snode==NULL) return;
|
||||
|
||||
/* clear flags */
|
||||
for(link= snode->edittree->links.first; link; link=link->next)
|
||||
link->flag &= ~NODE_LINKFLAG_HILITE;
|
||||
|
||||
if(test==0) return;
|
||||
|
||||
/* okay, there's 1 node, without links, now intersect */
|
||||
mcoords[0][0]= select->totr.xmin;
|
||||
mcoords[0][1]= select->totr.ymin;
|
||||
mcoords[1][0]= select->totr.xmax;
|
||||
mcoords[1][1]= select->totr.ymin;
|
||||
mcoords[2][0]= select->totr.xmax;
|
||||
mcoords[2][1]= select->totr.ymax;
|
||||
mcoords[3][0]= select->totr.xmin;
|
||||
mcoords[3][1]= select->totr.ymax;
|
||||
mcoords[4][0]= select->totr.xmin;
|
||||
mcoords[4][1]= select->totr.ymin;
|
||||
mcoords[5][0]= select->totr.xmax;
|
||||
mcoords[5][1]= select->totr.ymax;
|
||||
|
||||
/* we only tag a single link for intersect now */
|
||||
/* idea; use header dist when more? */
|
||||
for(link= snode->edittree->links.first; link; link=link->next) {
|
||||
|
||||
if(cut_links_intersect(link, mcoords, 5)) { /* intersect code wants edges */
|
||||
if(selink)
|
||||
break;
|
||||
selink= link;
|
||||
}
|
||||
}
|
||||
|
||||
if(link==NULL && selink)
|
||||
selink->flag |= NODE_LINKFLAG_HILITE;
|
||||
}
|
||||
|
||||
|
||||
/* ******************************** */
|
||||
// XXX some code needing updating to operators...
|
||||
|
||||
@@ -2914,7 +3059,8 @@ void NODE_OT_delete(wmOperatorType *ot)
|
||||
|
||||
/* note: in cmp_util.c is similar code, for node_compo_pass_on() */
|
||||
/* used for disabling node (similar code in node_draw.c for disable line) */
|
||||
static void node_delete_reconnect(bNodeTree* tree, bNode* node) {
|
||||
static void node_delete_reconnect(bNodeTree* tree, bNode* node)
|
||||
{
|
||||
bNodeLink *link, *next;
|
||||
bNodeSocket *valsocket= NULL, *colsocket= NULL, *vecsocket= NULL;
|
||||
bNodeSocket *deliveringvalsocket= NULL, *deliveringcolsocket= NULL, *deliveringvecsocket= NULL;
|
||||
@@ -3142,3 +3288,5 @@ void NODE_OT_add_file(wmOperatorType *ot)
|
||||
RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Datablock name to assign.");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -506,17 +506,6 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
|
||||
uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
|
||||
uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
|
||||
|
||||
/* NDOF */
|
||||
/* Not implemented yet
|
||||
if (G.ndofdevice ==0 ) {
|
||||
uiDefIconTextButC(block, ICONTEXTROW,B_NDOF, ICON_NDOF_TURN, ndof_pup(), 0,0,UI_UNIT_X+10,UI_UNIT_Y, &(v3d->ndofmode), 0, 3.0, 0, 0, "Ndof mode");
|
||||
|
||||
uiDefIconButC(block, TOG, B_NDOF, ICON_NDOF_DOM,
|
||||
0,0,UI_UNIT_X,UI_UNIT_Y,
|
||||
&v3d->ndoffilter, 0, 1, 0, 0, "dominant axis");
|
||||
}
|
||||
*/
|
||||
|
||||
/* Transform widget / manipulators */
|
||||
row= uiLayoutRow(layout, 1);
|
||||
uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
|
||||
|
||||
@@ -88,6 +88,7 @@
|
||||
#include "ED_object.h"
|
||||
#include "ED_markers.h"
|
||||
#include "ED_mesh.h"
|
||||
#include "ED_node.h"
|
||||
#include "ED_types.h"
|
||||
#include "ED_uvedit.h"
|
||||
#include "ED_curve.h" /* for ED_curve_editnurbs */
|
||||
@@ -2313,6 +2314,12 @@ void flushTransNodes(TransInfo *t)
|
||||
td->loc2d[0]= td->loc[0];
|
||||
td->loc2d[1]= td->loc[1];
|
||||
}
|
||||
|
||||
/* handle intersection with noodles */
|
||||
if(t->total==1) {
|
||||
ED_node_link_intersect_test(t->sa, 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* *** SEQUENCE EDITOR *** */
|
||||
@@ -4889,7 +4896,12 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
|
||||
|
||||
}
|
||||
else if (t->spacetype == SPACE_NODE) {
|
||||
/* pass */
|
||||
if(cancelled == 0)
|
||||
ED_node_link_insert(t->sa);
|
||||
|
||||
/* clear link line */
|
||||
ED_node_link_intersect_test(t->sa, 0);
|
||||
|
||||
}
|
||||
else if (t->spacetype == SPACE_ACTION) {
|
||||
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
|
||||
|
||||
@@ -1072,7 +1072,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
|
||||
}
|
||||
}
|
||||
// Need stuff to take it from edit mesh or whatnot here
|
||||
else
|
||||
else if (t->spacetype == SPACE_VIEW3D)
|
||||
{
|
||||
if (t->obedit && t->obedit->type == OB_MESH && (((Mesh *)t->obedit->data)->editflag & ME_EDIT_MIRROR_X))
|
||||
{
|
||||
|
||||
@@ -252,7 +252,7 @@ void IMB_filter(struct ImBuf *ibuf);
|
||||
void IMB_filterN(struct ImBuf *out, struct ImBuf *in);
|
||||
void IMB_mask_filter_extend(char *mask, int width, int height);
|
||||
void IMB_mask_clear(struct ImBuf *ibuf, char *mask, int val);
|
||||
void IMB_filter_extend(struct ImBuf *ibuf, char *mask);
|
||||
void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter);
|
||||
void IMB_makemipmap(struct ImBuf *ibuf, int use_filter);
|
||||
void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter);
|
||||
struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level);
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
* Contributor(s): Morten Mikkelsen.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* filter.c
|
||||
@@ -326,121 +326,132 @@ void IMB_mask_clear(ImBuf *ibuf, char *mask, int val)
|
||||
}
|
||||
}
|
||||
|
||||
#define EXTEND_PIXEL(color, w) if((color)[3]) {r+= w*(color)[0]; g+= w*(color)[1]; b+= w*(color)[2]; a+= w*(color)[3]; tot+=w;}
|
||||
static int filter_make_index(const int x, const int y, const int w, const int h)
|
||||
{
|
||||
if(x<0 || x>=w || y<0 || y>=h) return -1; /* return bad index */
|
||||
else return y*w+x;
|
||||
}
|
||||
|
||||
static int check_pixel_assigned(const void *buffer, const char *mask, const int index, const int depth, const int is_float)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
if(index>=0) {
|
||||
const int alpha_index = depth*index+(depth-1);
|
||||
|
||||
if(mask!=NULL) {
|
||||
res = mask[index]!=0 ? 1 : 0;
|
||||
}
|
||||
else if( (is_float && ((const float *) buffer)[alpha_index]!=0.0f) ||
|
||||
(!is_float && ((const unsigned char *) buffer)[alpha_index]!=0) ) {
|
||||
res=1;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/* if alpha is zero, it checks surrounding pixels and averages color. sets new alphas to 1.0
|
||||
*
|
||||
* When a mask is given, only effect pixels with a mask value of 1, defined as BAKE_MASK_MARGIN in rendercore.c
|
||||
* */
|
||||
void IMB_filter_extend(struct ImBuf *ibuf, char *mask)
|
||||
void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter)
|
||||
{
|
||||
register char *row1, *row2, *row3;
|
||||
register char *cp;
|
||||
int rowlen, x, y;
|
||||
|
||||
rowlen= ibuf->x;
|
||||
|
||||
|
||||
if (ibuf->rect_float) {
|
||||
float *temprect;
|
||||
float *row1f, *row2f, *row3f;
|
||||
float *fp;
|
||||
temprect= MEM_dupallocN(ibuf->rect_float);
|
||||
|
||||
for(y=1; y<=ibuf->y; y++) {
|
||||
/* setup rows */
|
||||
row1f= (float *)(temprect + (y-2)*rowlen*4);
|
||||
row2f= row1f + 4*rowlen;
|
||||
row3f= row2f + 4*rowlen;
|
||||
if(y==1)
|
||||
row1f= row2f;
|
||||
else if(y==ibuf->y)
|
||||
row3f= row2f;
|
||||
|
||||
fp= (float *)(ibuf->rect_float + (y-1)*rowlen*4);
|
||||
|
||||
for(x=0; x<rowlen; x++) {
|
||||
if((mask==NULL && fp[3]==0.0f) || (mask && mask[((y-1)*rowlen)+x]==1)) {
|
||||
int tot= 0;
|
||||
float r=0.0f, g=0.0f, b=0.0f, a=0.0f;
|
||||
|
||||
EXTEND_PIXEL(row1f, 1);
|
||||
EXTEND_PIXEL(row2f, 2);
|
||||
EXTEND_PIXEL(row3f, 1);
|
||||
EXTEND_PIXEL(row1f+4, 2);
|
||||
EXTEND_PIXEL(row3f+4, 2);
|
||||
if(x!=rowlen-1) {
|
||||
EXTEND_PIXEL(row1f+8, 1);
|
||||
EXTEND_PIXEL(row2f+8, 2);
|
||||
EXTEND_PIXEL(row3f+8, 1);
|
||||
}
|
||||
if(tot) {
|
||||
fp[0]= r/tot;
|
||||
fp[1]= g/tot;
|
||||
fp[2]= b/tot;
|
||||
fp[3]= a/tot;
|
||||
const int width= ibuf->x;
|
||||
const int height= ibuf->y;
|
||||
const int depth= 4; /* always 4 channels */
|
||||
const int chsize= ibuf->rect_float ? sizeof(float) : sizeof(unsigned char);
|
||||
const int bsize= width*height*depth*chsize;
|
||||
const int is_float= ibuf->rect_float!=NULL;
|
||||
void *dstbuf= (void *) MEM_dupallocN(ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect);
|
||||
char *dstmask= mask==NULL ? NULL : (char *) MEM_dupallocN(mask);
|
||||
void *srcbuf= ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect;
|
||||
char *srcmask= mask;
|
||||
int cannot_early_out= 1, r, n, k, i, j, c;
|
||||
float weight[25];
|
||||
|
||||
/* build a weights buffer */
|
||||
n= 2;
|
||||
k= 0;
|
||||
for(i = -n; i <= n; i++)
|
||||
for(j = -n; j <= n; j++)
|
||||
weight[k++] = sqrt((float) i * i + j * j);
|
||||
|
||||
/* run passes */
|
||||
for(r = 0; cannot_early_out == 1 && r < filter; r++) {
|
||||
int x, y;
|
||||
cannot_early_out = 0;
|
||||
|
||||
for(y= 0; y<height; y++) {
|
||||
for(x= 0; x<width; x++) {
|
||||
const int index= filter_make_index(x, y, width, height);
|
||||
|
||||
/* only update unassigned pixels */
|
||||
if(!check_pixel_assigned(srcbuf, srcmask, index, depth, is_float)) {
|
||||
float tmp[4];
|
||||
float wsum=0;
|
||||
float acc[4]={0,0,0,0};
|
||||
k = 0;
|
||||
|
||||
if (check_pixel_assigned(srcbuf, srcmask, filter_make_index(x-1, y, width, height), depth, is_float) ||
|
||||
check_pixel_assigned(srcbuf, srcmask, filter_make_index(x+1, y, width, height), depth, is_float) ||
|
||||
check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y-1, width, height), depth, is_float) ||
|
||||
check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y+1, width, height), depth, is_float)) {
|
||||
for(i= -n; i<=n; i++) {
|
||||
for(j=-n; j<=n; j++) {
|
||||
if(i != 0 || j != 0) {
|
||||
const int tmpindex= filter_make_index(x+i, y+j, width, height);
|
||||
|
||||
if(check_pixel_assigned(srcbuf, srcmask, tmpindex, depth, is_float)) {
|
||||
if(is_float) {
|
||||
for(c=0; c<depth; c++)
|
||||
tmp[c] = ((const float *) srcbuf)[depth*tmpindex+c];
|
||||
}
|
||||
else {
|
||||
for(c=0; c<depth; c++)
|
||||
tmp[c] = (float) ((const unsigned char *) srcbuf)[depth*tmpindex+c];
|
||||
}
|
||||
|
||||
wsum+= weight[k];
|
||||
|
||||
for(c=0; c<depth; c++)
|
||||
acc[c]+= weight[k] * tmp[c];
|
||||
}
|
||||
}
|
||||
k++;
|
||||
}
|
||||
}
|
||||
|
||||
if(wsum!=0) {
|
||||
for(c=0; c<depth; c++)
|
||||
acc[c]/= wsum;
|
||||
|
||||
if(is_float) {
|
||||
for(c=0; c<depth; c++)
|
||||
((float *) dstbuf)[depth*index+c] = acc[c];
|
||||
}
|
||||
else {
|
||||
for(c=0; c<depth; c++) {
|
||||
((unsigned char *) dstbuf)[depth*index+c]= acc[c] > 255 ? 255 : (acc[c] < 0 ? 0 : ((unsigned char) (acc[c]+0.5f)));
|
||||
}
|
||||
}
|
||||
|
||||
if(dstmask!=NULL) dstmask[index]=FILTER_MASK_MARGIN; /* assigned */
|
||||
cannot_early_out = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
fp+=4;
|
||||
|
||||
if(x!=0) {
|
||||
row1f+=4; row2f+=4; row3f+=4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MEM_freeN(temprect);
|
||||
}
|
||||
else if(ibuf->rect) {
|
||||
int *temprect;
|
||||
|
||||
/* make a copy, to prevent flooding */
|
||||
temprect= MEM_dupallocN(ibuf->rect);
|
||||
|
||||
for(y=1; y<=ibuf->y; y++) {
|
||||
/* setup rows */
|
||||
row1= (char *)(temprect + (y-2)*rowlen);
|
||||
row2= row1 + 4*rowlen;
|
||||
row3= row2 + 4*rowlen;
|
||||
if(y==1)
|
||||
row1= row2;
|
||||
else if(y==ibuf->y)
|
||||
row3= row2;
|
||||
|
||||
cp= (char *)(ibuf->rect + (y-1)*rowlen);
|
||||
|
||||
for(x=0; x<rowlen; x++) {
|
||||
/*if(cp[3]==0) {*/
|
||||
if((mask==NULL && cp[3]==0) || (mask && mask[((y-1)*rowlen)+x]==1)) {
|
||||
int tot= 0, r=0, g=0, b=0, a=0;
|
||||
|
||||
EXTEND_PIXEL(row1, 1);
|
||||
EXTEND_PIXEL(row2, 2);
|
||||
EXTEND_PIXEL(row3, 1);
|
||||
EXTEND_PIXEL(row1+4, 2);
|
||||
EXTEND_PIXEL(row3+4, 2);
|
||||
if(x!=rowlen-1) {
|
||||
EXTEND_PIXEL(row1+8, 1);
|
||||
EXTEND_PIXEL(row2+8, 2);
|
||||
EXTEND_PIXEL(row3+8, 1);
|
||||
}
|
||||
if(tot) {
|
||||
cp[0]= r/tot;
|
||||
cp[1]= g/tot;
|
||||
cp[2]= b/tot;
|
||||
cp[3]= a/tot;
|
||||
}
|
||||
}
|
||||
cp+=4;
|
||||
|
||||
if(x!=0) {
|
||||
row1+=4; row2+=4; row3+=4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MEM_freeN(temprect);
|
||||
/* keep the original buffer up to date. */
|
||||
memcpy(srcbuf, dstbuf, bsize);
|
||||
if(dstmask!=NULL) memcpy(srcmask, dstmask, width*height);
|
||||
}
|
||||
|
||||
/* free memory */
|
||||
MEM_freeN(dstbuf);
|
||||
if(dstmask!=NULL) MEM_freeN(dstmask);
|
||||
}
|
||||
|
||||
/* threadsafe version, only recreates existing maps */
|
||||
|
||||
@@ -179,6 +179,10 @@ typedef struct bNodeLink {
|
||||
|
||||
} bNodeLink;
|
||||
|
||||
|
||||
/* link->flag */
|
||||
#define NODE_LINKFLAG_HILITE 1
|
||||
|
||||
/* the basis for a Node tree, all links and nodes reside internal here */
|
||||
/* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
|
||||
typedef struct bNodeTree {
|
||||
|
||||
@@ -2817,7 +2817,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
|
||||
|
||||
prop= RNA_def_property(srna, "bake_margin", PROP_INT, PROP_NONE);
|
||||
RNA_def_property_int_sdna(prop, NULL, "bake_filter");
|
||||
RNA_def_property_range(prop, 0, 32);
|
||||
RNA_def_property_range(prop, 0, 64);
|
||||
RNA_def_property_ui_text(prop, "Margin", "Amount of pixels to extend the baked result with, as post process filter");
|
||||
|
||||
prop= RNA_def_property(srna, "bake_distance", PROP_FLOAT, PROP_NONE);
|
||||
|
||||
@@ -108,4 +108,6 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index);
|
||||
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix);
|
||||
int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix);
|
||||
|
||||
int column_vector_multiplication(float rvec[4], VectorObject *vec, MatrixObject *mat);
|
||||
|
||||
#endif /* MATHUTILS_H */
|
||||
|
||||
@@ -1612,8 +1612,20 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
|
||||
}
|
||||
}
|
||||
else if(mat1) {
|
||||
/*VEC * MATRIX */
|
||||
if(VectorObject_Check(m2)) {
|
||||
VectorObject *vec2= (VectorObject *)m2;
|
||||
float tvec[4];
|
||||
if(BaseMath_ReadCallback(vec2) == -1)
|
||||
return NULL;
|
||||
if(column_vector_multiplication(tvec, vec2, mat1) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return newVectorObject(tvec, vec2->size, Py_NEW, Py_TYPE(m2));
|
||||
}
|
||||
/*FLOAT/INT * MATRIX */
|
||||
if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) {
|
||||
else if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) {
|
||||
return matrix_mul_float(mat1, scalar);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -753,8 +753,30 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
|
||||
return quat_mul_float(quat2, scalar);
|
||||
}
|
||||
}
|
||||
else if (quat1) { /* QUAT*FLOAT */
|
||||
if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
|
||||
else if (quat1) {
|
||||
/* QUAT * VEC */
|
||||
if (VectorObject_Check(q2)) {
|
||||
VectorObject *vec2 = (VectorObject *)q2;
|
||||
float tvec[3];
|
||||
|
||||
if(vec2->size != 3) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"Vector multiplication: "
|
||||
"only 3D vector rotations (with quats) "
|
||||
"currently supported");
|
||||
return NULL;
|
||||
}
|
||||
if(BaseMath_ReadCallback(vec2) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
copy_v3_v3(tvec, vec2->vec);
|
||||
mul_qt_v3(quat1->quat, tvec);
|
||||
|
||||
return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec2));
|
||||
}
|
||||
/* QUAT * FLOAT */
|
||||
else if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
|
||||
return quat_mul_float(quat1, scalar);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
#include "BLI_math.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
extern void PyC_LineSpit(void);
|
||||
|
||||
#define MAX_DIMENSIONS 4
|
||||
|
||||
/* Swizzle axes get packed into a single value that is used as a closure. Each
|
||||
@@ -1081,7 +1083,7 @@ static PyObject *Vector_isub(PyObject *v1, PyObject *v2)
|
||||
* note: vector/matrix multiplication IS NOT COMMUTATIVE!!!!
|
||||
* note: assume read callbacks have been done first.
|
||||
*/
|
||||
static int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
|
||||
int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
|
||||
{
|
||||
float vec_cpy[MAX_DIMENSIONS];
|
||||
double dot = 0.0f;
|
||||
@@ -1159,8 +1161,29 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
|
||||
}
|
||||
else if (vec1) {
|
||||
if (MatrixObject_Check(v2)) {
|
||||
extern void PyC_LineSpit(void);
|
||||
|
||||
/* VEC * MATRIX */
|
||||
/* this is deprecated!, use the reverse instead */
|
||||
float tvec[MAX_DIMENSIONS];
|
||||
|
||||
|
||||
/* ------ to be removed ------*/
|
||||
#ifndef MATH_STANDALONE
|
||||
#ifdef WITH_ASSERT_ABORT
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"(Vector * Matrix) is now removed, reverse the "
|
||||
"order (promoted to an Error for Debug builds)");
|
||||
return NULL;
|
||||
#else
|
||||
printf("Warning: (Vector * Matrix) is now deprecated, "
|
||||
"reverse the multiplication order in the script.\n");
|
||||
PyC_LineSpit();
|
||||
#endif
|
||||
#endif /* ifndef MATH_STANDALONE */
|
||||
/* ------ to be removed ------*/
|
||||
|
||||
|
||||
if(BaseMath_ReadCallback((MatrixObject *)v2) == -1)
|
||||
return NULL;
|
||||
if(column_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1) {
|
||||
@@ -1183,6 +1206,24 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
|
||||
if(BaseMath_ReadCallback(quat2) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* ------ to be removed ------*/
|
||||
#ifndef MATH_STANDALONE
|
||||
#ifdef WITH_ASSERT_ABORT
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"(Vector * Quat) is now removed, reverse the "
|
||||
"order (promoted to an Error for Debug builds)");
|
||||
return NULL;
|
||||
#else
|
||||
printf("Warning: (Vector * Quat) is now deprecated, "
|
||||
"reverse the multiplication order in the script.\n");
|
||||
PyC_LineSpit();
|
||||
#endif
|
||||
#endif /* ifndef MATH_STANDALONE */
|
||||
/* ------ to be removed ------*/
|
||||
|
||||
|
||||
copy_v3_v3(tvec, vec1->vec);
|
||||
mul_qt_v3(quat2->quat, tvec);
|
||||
return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec1));
|
||||
@@ -1226,6 +1267,24 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
|
||||
if(column_vector_multiplication(rvec, vec, (MatrixObject*)v2) == -1)
|
||||
return NULL;
|
||||
|
||||
|
||||
/* ------ to be removed ------*/
|
||||
#ifndef MATH_STANDALONE
|
||||
#ifdef WITH_ASSERT_ABORT
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"(Vector *= Matrix) is now removed, reverse the "
|
||||
"order (promoted to an Error for Debug builds) "
|
||||
"and uses the non in-place multiplication.");
|
||||
return NULL;
|
||||
#else
|
||||
printf("Warning: (Vector *= Matrix) is now deprecated, "
|
||||
"reverse the (non in-place) multiplication order in the script.\n");
|
||||
PyC_LineSpit();
|
||||
#endif
|
||||
#endif /* ifndef MATH_STANDALONE */
|
||||
/* ------ to be removed ------*/
|
||||
|
||||
|
||||
memcpy(vec->vec, rvec, sizeof(float) * vec->size);
|
||||
}
|
||||
else if (QuaternionObject_Check(v2)) {
|
||||
@@ -1242,6 +1301,25 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
|
||||
if(BaseMath_ReadCallback(quat2) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* ------ to be removed ------*/
|
||||
#ifndef MATH_STANDALONE
|
||||
#ifdef WITH_ASSERT_ABORT
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"(Vector *= Quat) is now removed, reverse the "
|
||||
"order (promoted to an Error for Debug builds) "
|
||||
"and uses the non in-place multiplication.");
|
||||
return NULL;
|
||||
#else
|
||||
printf("Warning: (Vector *= Quat) is now deprecated, "
|
||||
"reverse the (non in-place) multiplication order in the script.\n");
|
||||
PyC_LineSpit();
|
||||
#endif
|
||||
#endif /* ifndef MATH_STANDALONE */
|
||||
/* ------ to be removed ------*/
|
||||
|
||||
|
||||
mul_qt_v3(quat2->quat, vec->vec);
|
||||
}
|
||||
else if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* VEC *= FLOAT */
|
||||
|
||||
@@ -5778,6 +5778,14 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
|
||||
if(re->r.mode & R_RAYTRACE)
|
||||
makeraytree(re);
|
||||
|
||||
/* point density texture */
|
||||
if(!re->test_break(re->tbh))
|
||||
make_pointdensities(re);
|
||||
|
||||
/* voxel data texture */
|
||||
if(!re->test_break(re->tbh))
|
||||
make_voxeldata(re);
|
||||
|
||||
/* occlusion */
|
||||
if((re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && !re->test_break(re->tbh))
|
||||
if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
|
||||
|
||||
@@ -2577,27 +2577,7 @@ void RE_bake_ibuf_filter(ImBuf *ibuf, char *mask, const int filter)
|
||||
|
||||
/* Margin */
|
||||
if(filter) {
|
||||
char *temprect;
|
||||
int i;
|
||||
|
||||
/* extend the mask +2 pixels from the image,
|
||||
* this is so colors dont blend in from outside */
|
||||
|
||||
for(i=0; i< filter; i++)
|
||||
IMB_mask_filter_extend(mask, ibuf->x, ibuf->y);
|
||||
|
||||
temprect = MEM_dupallocN(mask);
|
||||
|
||||
/* expand twice to clear this many pixels, so they blend back in */
|
||||
IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y);
|
||||
IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y);
|
||||
|
||||
/* clear all pixels in the margin */
|
||||
IMB_mask_clear(ibuf, temprect, FILTER_MASK_MARGIN);
|
||||
MEM_freeN(temprect);
|
||||
|
||||
for(i= 0; i < filter; i++)
|
||||
IMB_filter_extend(ibuf, mask);
|
||||
IMB_filter_extend(ibuf, mask, filter);
|
||||
}
|
||||
|
||||
/* if the bake results in new alpha then change the image setting */
|
||||
|
||||
@@ -1184,46 +1184,10 @@ void PyObjectPlus::SetDeprecationWarnings(bool ignoreDeprecationWarnings)
|
||||
m_ignore_deprecation_warnings = ignoreDeprecationWarnings;
|
||||
}
|
||||
|
||||
void PyDebugLine()
|
||||
{
|
||||
// import sys; print '\t%s:%d' % (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno)
|
||||
|
||||
PyObject *getframe, *frame;
|
||||
PyObject *f_lineno, *f_code, *co_filename;
|
||||
|
||||
getframe = PySys_GetObject((char *)"_getframe"); // borrowed
|
||||
if (getframe) {
|
||||
frame = PyObject_CallObject(getframe, NULL);
|
||||
if (frame) {
|
||||
f_lineno= PyObject_GetAttrString(frame, "f_lineno");
|
||||
f_code= PyObject_GetAttrString(frame, "f_code");
|
||||
if (f_lineno && f_code) {
|
||||
co_filename= ((PyCodeObject *)f_code)->co_filename; /* borrow */
|
||||
if (co_filename) {
|
||||
|
||||
printf("\t%s:%d\n", _PyUnicode_AsString(co_filename), (int)PyLong_AsSsize_t(f_lineno));
|
||||
|
||||
Py_DECREF(f_lineno);
|
||||
Py_DECREF(f_code);
|
||||
Py_DECREF(frame);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Py_XDECREF(f_lineno);
|
||||
Py_XDECREF(f_code);
|
||||
Py_DECREF(frame);
|
||||
}
|
||||
|
||||
}
|
||||
PyErr_Clear();
|
||||
printf("\tERROR - Could not access sys._getframe(0).f_lineno or sys._getframe().f_code.co_filename\n");
|
||||
}
|
||||
|
||||
void PyObjectPlus::ShowDeprecationWarning_func(const char* old_way,const char* new_way)
|
||||
{
|
||||
printf("Method %s is deprecated, please use %s instead.\n", old_way, new_way);
|
||||
PyDebugLine();
|
||||
PyC_LineSpit();
|
||||
}
|
||||
|
||||
void PyObjectPlus::ClearDeprecationWarning()
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
#ifdef USE_MATHUTILS
|
||||
extern "C" {
|
||||
#include "../../blender/python/mathutils/mathutils.h" /* so we can have mathutils callbacks */
|
||||
#include "../../blender/python/generic/py_capi_utils.h" /* for PyC_LineSpit only */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ SCA_Joystick *SCA_Joystick::GetInstance( short int joyindex )
|
||||
{
|
||||
int i;
|
||||
// do this once only
|
||||
if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1 ){
|
||||
if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO) == -1 ){
|
||||
echo("Error-Initializing-SDL: " << SDL_GetError());
|
||||
return NULL;
|
||||
}
|
||||
@@ -124,7 +124,7 @@ void SCA_Joystick::ReleaseInstance()
|
||||
m_instance[i]= NULL;
|
||||
}
|
||||
|
||||
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
|
||||
SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1220,7 +1220,7 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
|
||||
projmat.setValue(m_overrideCamProjMat.getPointer());
|
||||
cam->SetProjectionMatrix(projmat);
|
||||
}
|
||||
} else if (cam->hasValidProjectionMatrix() && !cam->GetViewport() )
|
||||
} else if (cam->hasValidProjectionMatrix())
|
||||
{
|
||||
m_rasterizer->SetProjectionMatrix(cam->GetProjectionMatrix());
|
||||
} else
|
||||
|
||||
@@ -196,7 +196,7 @@ add_test(export_x3d_cube ${TEST_BLENDER_EXE}
|
||||
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
|
||||
--run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_cube.x3d',use_selection=False\)
|
||||
--md5_source=${TEST_OUT_DIR}/export_x3d_cube.x3d
|
||||
--md5=6ae36be272d6f84c697e84a8b6463273 --md5_method=FILE
|
||||
--md5=5e804c689896116331fa190a9fabbad4 --md5_method=FILE
|
||||
)
|
||||
|
||||
add_test(export_x3d_nurbs ${TEST_BLENDER_EXE}
|
||||
@@ -212,7 +212,7 @@ add_test(export_x3d_all_objects ${TEST_BLENDER_EXE}
|
||||
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
|
||||
--run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_all_objects.x3d',use_selection=False\)
|
||||
--md5_source=${TEST_OUT_DIR}/export_x3d_all_objects.x3d
|
||||
--md5=bba48ca191e8891adb27c59ed4ce4735 --md5_method=FILE
|
||||
--md5=2809ec13a4cab55d265ce7525c5db1b7 --md5_method=FILE
|
||||
)
|
||||
|
||||
|
||||
@@ -261,7 +261,7 @@ add_test(export_3ds_all_objects ${TEST_BLENDER_EXE}
|
||||
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
|
||||
--run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_all_objects.3ds',use_selection=False\)
|
||||
--md5_source=${TEST_OUT_DIR}/export_3ds_all_objects.3ds
|
||||
--md5=cdf8fa8475fda0b9ef565ac09339254b --md5_method=FILE
|
||||
--md5=0940ea889498cd437d503670738639ae --md5_method=FILE
|
||||
)
|
||||
|
||||
|
||||
@@ -273,7 +273,7 @@ add_test(export_fbx_cube ${TEST_BLENDER_EXE}
|
||||
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
|
||||
--run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_cube.fbx',use_selection=False,use_metadata=False\)
|
||||
--md5_source=${TEST_OUT_DIR}/export_fbx_cube.fbx
|
||||
--md5=642a5a1fa199d5b9bbf1643519ae974d --md5_method=FILE
|
||||
--md5=83dca99a0cb338852b8c85951a44c68a --md5_method=FILE
|
||||
)
|
||||
|
||||
add_test(export_fbx_nurbs ${TEST_BLENDER_EXE}
|
||||
@@ -281,7 +281,7 @@ add_test(export_fbx_nurbs ${TEST_BLENDER_EXE}
|
||||
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
|
||||
--run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_nurbs.fbx',use_selection=False,use_metadata=False\)
|
||||
--md5_source=${TEST_OUT_DIR}/export_fbx_nurbs.fbx
|
||||
--md5=ec1e8965bdbc3bf70707d77f82c2cb9c --md5_method=FILE
|
||||
--md5=c7d9491ffa6264e820ed1e12df63f871 --md5_method=FILE
|
||||
)
|
||||
|
||||
add_test(export_fbx_all_objects ${TEST_BLENDER_EXE}
|
||||
@@ -289,5 +289,5 @@ add_test(export_fbx_all_objects ${TEST_BLENDER_EXE}
|
||||
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
|
||||
--run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_all_objects.fbx',use_selection=False,use_metadata=False\)
|
||||
--md5_source=${TEST_OUT_DIR}/export_fbx_all_objects.fbx
|
||||
--md5=af3b65665687ac92e4aba07b017d87fe --md5_method=FILE
|
||||
--md5=22867f82e1615fd1eae18cfaac8ba035 --md5_method=FILE
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user