forked from bartvdbraak/blender
svn merge ^/trunk/blender -r41200:41226 .
This commit is contained in:
commit
70bf00a74c
@ -213,9 +213,6 @@ mark_as_advanced(WITH_CXX_GUARDEDALLOC)
|
||||
option(WITH_ASSERT_ABORT "Call abort() when raising an assertion through BLI_assert()" OFF)
|
||||
mark_as_advanced(WITH_ASSERT_ABORT)
|
||||
|
||||
option(WITH_PYTHON_UI_INFO "Allow navigating to UI source from the context menu" OFF)
|
||||
mark_as_advanced(WITH_PYTHON_UI_INFO)
|
||||
|
||||
|
||||
if(APPLE)
|
||||
if(NOT CMAKE_OSX_ARCHITECTURES)
|
||||
@ -1330,10 +1327,6 @@ if(WITH_ASSERT_ABORT)
|
||||
add_definitions(-DWITH_ASSERT_ABORT)
|
||||
endif()
|
||||
|
||||
if(WITH_PYTHON_UI_INFO)
|
||||
add_definitions(-DWITH_PYTHON_UI_INFO)
|
||||
endif()
|
||||
|
||||
# message(STATUS "Using CFLAGS: ${CMAKE_C_FLAGS}")
|
||||
# message(STATUS "Using CXXFLAGS: ${CMAKE_CXX_FLAGS}")
|
||||
|
||||
|
@ -107,8 +107,14 @@ void AUD_SequencerReader::read(int& length, bool& eos, sample_t* buffer)
|
||||
|
||||
if(result < 0)
|
||||
{
|
||||
handle = new AUD_SequencerHandle(entry, m_device);
|
||||
handles.push_front(handle);
|
||||
try
|
||||
{
|
||||
handle = new AUD_SequencerHandle(entry, m_device);
|
||||
handles.push_front(handle);
|
||||
}
|
||||
catch(AUD_Exception&)
|
||||
{
|
||||
}
|
||||
eit++;
|
||||
}
|
||||
else if(result == 0)
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
/* check our ffmpeg is new enough, avoids user complaints */
|
||||
#if (LIBAVFORMAT_VERSION_MAJOR < 52) || ((LIBAVFORMAT_VERSION_MAJOR == 52) && (LIBAVFORMAT_VERSION_MINOR <= 64))
|
||||
# error "FFmpeg 0.7 or newer is needed, Upgrade you're FFmpeg or disable it"
|
||||
# error "FFmpeg 0.7 or newer is needed, Upgrade your FFmpeg or disable it"
|
||||
#endif
|
||||
/* end sanity check */
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
|
||||
from _bpy import types as bpy_types
|
||||
import _bpy
|
||||
@ -34,7 +34,8 @@ class Context(StructRNA):
|
||||
def copy(self):
|
||||
from types import BuiltinMethodType
|
||||
new_context = {}
|
||||
generic_attrs = list(StructRNA.__dict__.keys()) + ["bl_rna", "rna_type", "copy"]
|
||||
generic_attrs = (list(StructRNA.__dict__.keys()) +
|
||||
["bl_rna", "rna_type", "copy"])
|
||||
for attr in dir(self):
|
||||
if not (attr.startswith("_") or attr in generic_attrs):
|
||||
value = getattr(self, attr)
|
||||
@ -52,14 +53,19 @@ class Library(bpy_types.ID):
|
||||
"""ID data blocks which use this library"""
|
||||
import bpy
|
||||
|
||||
# See: readblenentry.c, IDTYPE_FLAGS_ISLINKABLE, we could make this an attribute in rna.
|
||||
attr_links = "actions", "armatures", "brushes", "cameras", \
|
||||
"curves", "grease_pencil", "groups", "images", \
|
||||
"lamps", "lattices", "materials", "metaballs", \
|
||||
"meshes", "node_groups", "objects", "scenes", \
|
||||
"sounds", "speakers", "textures", "texts", "fonts", "worlds"
|
||||
# See: readblenentry.c, IDTYPE_FLAGS_ISLINKABLE,
|
||||
# we could make this an attribute in rna.
|
||||
attr_links = ("actions", "armatures", "brushes", "cameras",
|
||||
"curves", "grease_pencil", "groups", "images",
|
||||
"lamps", "lattices", "materials", "metaballs",
|
||||
"meshes", "node_groups", "objects", "scenes",
|
||||
"sounds", "speakers", "textures", "texts",
|
||||
"fonts", "worlds")
|
||||
|
||||
return tuple(id_block for attr in attr_links for id_block in getattr(bpy.data, attr) if id_block.library == self)
|
||||
return tuple(id_block
|
||||
for attr in attr_links
|
||||
for id_block in getattr(bpy.data, attr)
|
||||
if id_block.library == self)
|
||||
|
||||
|
||||
class Texture(bpy_types.ID):
|
||||
@ -69,13 +75,21 @@ class Texture(bpy_types.ID):
|
||||
def users_material(self):
|
||||
"""Materials that use this texture"""
|
||||
import bpy
|
||||
return tuple(mat for mat in bpy.data.materials if self in [slot.texture for slot in mat.texture_slots if slot])
|
||||
return tuple(mat for mat in bpy.data.materials
|
||||
if self in [slot.texture
|
||||
for slot in mat.texture_slots
|
||||
if slot]
|
||||
)
|
||||
|
||||
@property
|
||||
def users_object_modifier(self):
|
||||
"""Object modifiers that use this texture"""
|
||||
import bpy
|
||||
return tuple(obj for obj in bpy.data.objects if self in [mod.texture for mod in obj.modifiers if mod.type == 'DISPLACE'])
|
||||
return tuple(obj for obj in bpy.data.objects if
|
||||
self in [mod.texture
|
||||
for mod in obj.modifiers
|
||||
if mod.type == 'DISPLACE']
|
||||
)
|
||||
|
||||
|
||||
class Group(bpy_types.ID):
|
||||
@ -85,7 +99,8 @@ class Group(bpy_types.ID):
|
||||
def users_dupli_group(self):
|
||||
"""The dupli group this group is used in"""
|
||||
import bpy
|
||||
return tuple(obj for obj in bpy.data.objects if self == obj.dupli_group)
|
||||
return tuple(obj for obj in bpy.data.objects
|
||||
if self == obj.dupli_group)
|
||||
|
||||
|
||||
class Object(bpy_types.ID):
|
||||
@ -95,19 +110,22 @@ class Object(bpy_types.ID):
|
||||
def children(self):
|
||||
"""All the children of this object"""
|
||||
import bpy
|
||||
return tuple(child for child in bpy.data.objects if child.parent == self)
|
||||
return tuple(child for child in bpy.data.objects
|
||||
if child.parent == self)
|
||||
|
||||
@property
|
||||
def users_group(self):
|
||||
"""The groups this object is in"""
|
||||
import bpy
|
||||
return tuple(group for group in bpy.data.groups if self in group.objects[:])
|
||||
return tuple(group for group in bpy.data.groups
|
||||
if self in group.objects[:])
|
||||
|
||||
@property
|
||||
def users_scene(self):
|
||||
"""The scenes this object is in"""
|
||||
import bpy
|
||||
return tuple(scene for scene in bpy.data.scenes if self in scene.objects[:])
|
||||
return tuple(scene for scene in bpy.data.scenes
|
||||
if self in scene.objects[:])
|
||||
|
||||
|
||||
class _GenericBone:
|
||||
@ -118,13 +136,14 @@ class _GenericBone:
|
||||
__slots__ = ()
|
||||
|
||||
def translate(self, vec):
|
||||
"""Utility function to add *vec* to the head and tail of this bone."""
|
||||
"""Utility function to add *vec* to the head and tail of this bone"""
|
||||
self.head += vec
|
||||
self.tail += vec
|
||||
|
||||
def parent_index(self, parent_test):
|
||||
"""
|
||||
The same as 'bone in other_bone.parent_recursive' but saved generating a list.
|
||||
The same as 'bone in other_bone.parent_recursive'
|
||||
but saved generating a list.
|
||||
"""
|
||||
# use the name so different types can be tested.
|
||||
name = parent_test.name
|
||||
@ -187,7 +206,9 @@ class _GenericBone:
|
||||
|
||||
@property
|
||||
def length(self):
|
||||
"""The distance from head to tail, when set the head is moved to fit the length."""
|
||||
""" The distance from head to tail,
|
||||
when set the head is moved to fit the length.
|
||||
"""
|
||||
return self.vector.length
|
||||
|
||||
@length.setter
|
||||
@ -196,7 +217,9 @@ class _GenericBone:
|
||||
|
||||
@property
|
||||
def vector(self):
|
||||
"""The direction this bone is pointing. Utility function for (tail - head)"""
|
||||
""" The direction this bone is pointing.
|
||||
Utility function for (tail - head)
|
||||
"""
|
||||
return (self.tail - self.head)
|
||||
|
||||
@property
|
||||
@ -222,7 +245,8 @@ class _GenericBone:
|
||||
"""
|
||||
Returns a chain of children with the same base name as this bone.
|
||||
Only direct chains are supported, forks caused by multiple children
|
||||
with matching base names will terminate the function and not be returned.
|
||||
with matching base names will terminate the function
|
||||
and not be returned.
|
||||
"""
|
||||
basename = self.basename
|
||||
chain = []
|
||||
@ -241,7 +265,9 @@ class _GenericBone:
|
||||
chain.append(child)
|
||||
else:
|
||||
if len(children_basename):
|
||||
print("multiple basenames found, this is probably not what you want!", self.name, children_basename)
|
||||
print("multiple basenames found, "
|
||||
"this is probably not what you want!",
|
||||
self.name, children_basename)
|
||||
|
||||
break
|
||||
|
||||
@ -284,13 +310,18 @@ class EditBone(StructRNA, _GenericBone, metaclass=StructMetaPropGroup):
|
||||
|
||||
def transform(self, matrix, scale=True, roll=True):
|
||||
"""
|
||||
Transform the the bones head, tail, roll and envelope (when the matrix has a scale component).
|
||||
Transform the the bones head, tail, roll and envelope
|
||||
(when the matrix has a scale component).
|
||||
|
||||
:arg matrix: 3x3 or 4x4 transformation matrix.
|
||||
:type matrix: :class:`mathutils.Matrix`
|
||||
:arg scale: Scale the bone envelope by the matrix.
|
||||
:type scale: bool
|
||||
:arg roll: Correct the roll to point in the same relative direction to the head and tail.
|
||||
:arg roll:
|
||||
|
||||
Correct the roll to point in the same relative
|
||||
direction to the head and tail.
|
||||
|
||||
:type roll: bool
|
||||
"""
|
||||
from mathutils import Vector
|
||||
@ -321,11 +352,23 @@ class Mesh(bpy_types.ID):
|
||||
Make a mesh from a list of vertices/edges/faces
|
||||
Until we have a nicer way to make geometry, use this.
|
||||
|
||||
:arg vertices: float triplets each representing (X, Y, Z) eg: [(0.0, 1.0, 0.5), ...].
|
||||
:arg vertices:
|
||||
|
||||
float triplets each representing (X, Y, Z)
|
||||
eg: [(0.0, 1.0, 0.5), ...].
|
||||
|
||||
:type vertices: iterable object
|
||||
:arg edges: int pairs, each pair contains two indices to the *vertices* argument. eg: [(1, 2), ...]
|
||||
:arg edges:
|
||||
|
||||
int pairs, each pair contains two indices to the
|
||||
*vertices* argument. eg: [(1, 2), ...]
|
||||
|
||||
:type edges: iterable object
|
||||
:arg faces: iterator of faces, each faces contains three or four indices to the *vertices* argument. eg: [(5, 6, 8, 9), (1, 2, 3), ...]
|
||||
:arg faces:
|
||||
|
||||
iterator of faces, each faces contains three or four indices to
|
||||
the *vertices* argument. eg: [(5, 6, 8, 9), (1, 2, 3), ...]
|
||||
|
||||
:type faces: iterable object
|
||||
"""
|
||||
self.vertices.add(len(vertices))
|
||||
@ -416,7 +459,10 @@ class Text(bpy_types.ID):
|
||||
def users_logic(self):
|
||||
"""Logic bricks that use this text"""
|
||||
import bpy
|
||||
return tuple(obj for obj in bpy.data.objects if self in [cont.text for cont in obj.game.controllers if cont.type == 'PYTHON'])
|
||||
return tuple(obj for obj in bpy.data.objects
|
||||
if self in [cont.text for cont in obj.game.controllers
|
||||
if cont.type == 'PYTHON']
|
||||
)
|
||||
|
||||
# values are module: [(cls, path, line), ...]
|
||||
TypeMap = {}
|
||||
@ -507,10 +553,11 @@ class Operator(StructRNA, metaclass=OrderedMeta):
|
||||
return super().__delattr__(attr)
|
||||
|
||||
def as_keywords(self, ignore=()):
|
||||
""" Return a copy of the properties as a dictionary.
|
||||
"""
|
||||
"""Return a copy of the properties as a dictionary"""
|
||||
ignore = ignore + ("rna_type",)
|
||||
return {attr: getattr(self, attr) for attr in self.properties.rna_type.properties.keys() if attr not in ignore}
|
||||
return {attr: getattr(self, attr)
|
||||
for attr in self.properties.rna_type.properties.keys()
|
||||
if attr not in ignore}
|
||||
|
||||
|
||||
class Macro(StructRNA, metaclass=OrderedMeta):
|
||||
@ -550,7 +597,8 @@ class _GenericUI:
|
||||
operator_context_default = self.layout.operator_context
|
||||
|
||||
for func in draw_ls._draw_funcs:
|
||||
# so bad menu functions don't stop the entire menu from drawing
|
||||
# so bad menu functions don't stop
|
||||
# the entire menu from drawing
|
||||
try:
|
||||
func(self, context)
|
||||
except:
|
||||
@ -566,13 +614,19 @@ class _GenericUI:
|
||||
|
||||
@classmethod
|
||||
def append(cls, draw_func):
|
||||
"""Append a draw function to this menu, takes the same arguments as the menus draw function."""
|
||||
"""
|
||||
Append a draw function to this menu,
|
||||
takes the same arguments as the menus draw function
|
||||
"""
|
||||
draw_funcs = cls._dyn_ui_initialize()
|
||||
draw_funcs.append(draw_func)
|
||||
|
||||
@classmethod
|
||||
def prepend(cls, draw_func):
|
||||
"""Prepend a draw function to this menu, takes the same arguments as the menus draw function."""
|
||||
"""
|
||||
Prepend a draw function to this menu, takes the same arguments as
|
||||
the menus draw function
|
||||
"""
|
||||
draw_funcs = cls._dyn_ui_initialize()
|
||||
draw_funcs.insert(0, draw_func)
|
||||
|
||||
@ -612,7 +666,8 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta):
|
||||
# collect paths
|
||||
files = []
|
||||
for directory in searchpaths:
|
||||
files.extend([(f, os.path.join(directory, f)) for f in os.listdir(directory)])
|
||||
files.extend([(f, os.path.join(directory, f))
|
||||
for f in os.listdir(directory)])
|
||||
|
||||
files.sort()
|
||||
|
||||
@ -632,9 +687,11 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta):
|
||||
props.menu_idname = self.bl_idname
|
||||
|
||||
def draw_preset(self, context):
|
||||
"""Define these on the subclass
|
||||
- preset_operator
|
||||
- preset_subdir
|
||||
"""
|
||||
Define these on the subclass
|
||||
- preset_operator
|
||||
- preset_subdir
|
||||
"""
|
||||
import bpy
|
||||
self.path_menu(bpy.utils.preset_paths(self.preset_subdir), self.preset_operator)
|
||||
self.path_menu(bpy.utils.preset_paths(self.preset_subdir),
|
||||
self.preset_operator)
|
||||
|
@ -16,11 +16,11 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
import sys
|
||||
import bpy
|
||||
|
||||
language_id = 'python'
|
||||
language_id = "python"
|
||||
|
||||
# store our own __main__ module, not 100% needed
|
||||
# but python expects this in some places
|
||||
@ -28,8 +28,8 @@ _BPY_MAIN_OWN = True
|
||||
|
||||
|
||||
def add_scrollback(text, text_type):
|
||||
for l in text.split('\n'):
|
||||
bpy.ops.console.scrollback_append(text=l.replace('\t', ' '),
|
||||
for l in text.split("\n"):
|
||||
bpy.ops.console.scrollback_append(text=l.replace("\t", " "),
|
||||
type=text_type)
|
||||
|
||||
|
||||
@ -81,7 +81,8 @@ def get_console(console_id):
|
||||
console, stdout, stderr = console_data
|
||||
|
||||
# XXX, bug in python 3.1.2, 3.2 ? (worked in 3.1.1)
|
||||
# seems there is no way to clear StringIO objects for writing, have to make new ones each time.
|
||||
# seems there is no way to clear StringIO objects for writing, have to
|
||||
# make new ones each time.
|
||||
import io
|
||||
stdout = io.StringIO()
|
||||
stderr = io.StringIO()
|
||||
@ -99,7 +100,8 @@ def get_console(console_id):
|
||||
|
||||
replace_help(namespace)
|
||||
|
||||
console = InteractiveConsole(locals=namespace, filename="<blender_console>")
|
||||
console = InteractiveConsole(locals=namespace,
|
||||
filename="<blender_console>")
|
||||
|
||||
console.push("from mathutils import *")
|
||||
console.push("from math import *")
|
||||
@ -265,7 +267,8 @@ def autocomplete(context):
|
||||
|
||||
# Separate autocomplete output by command prompts
|
||||
if scrollback != '':
|
||||
bpy.ops.console.scrollback_append(text=sc.prompt + current_line.body, type='INPUT')
|
||||
bpy.ops.console.scrollback_append(text=sc.prompt + current_line.body,
|
||||
type='INPUT')
|
||||
|
||||
# Now we need to copy back the line from blender back into the
|
||||
# text editor. This will change when we don't use the text editor
|
||||
@ -296,10 +299,15 @@ def banner(context):
|
||||
add_scrollback("Execute: Enter", 'OUTPUT')
|
||||
add_scrollback("Autocomplete: Ctrl+Space", 'OUTPUT')
|
||||
add_scrollback("Ctrl +/- Wheel: Zoom", 'OUTPUT')
|
||||
add_scrollback("Builtin Modules: bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bpy.utils, bgl, blf, mathutils", 'OUTPUT')
|
||||
add_scrollback("Convenience Imports: from mathutils import *; from math import *", 'OUTPUT')
|
||||
add_scrollback("Builtin Modules: bpy, bpy.data, bpy.ops, "
|
||||
"bpy.props, bpy.types, bpy.context, bpy.utils, "
|
||||
"bgl, blf, mathutils",
|
||||
'OUTPUT')
|
||||
add_scrollback("Convenience Imports: from mathutils import *; "
|
||||
"from math import *", 'OUTPUT')
|
||||
add_scrollback("", 'OUTPUT')
|
||||
# add_scrollback(" WARNING!!! Blender 2.5 API is subject to change, see API reference for more info", 'ERROR')
|
||||
# add_scrollback(" WARNING!!! Blender 2.5 API is subject to change, "
|
||||
# "see API reference for more info", 'ERROR')
|
||||
# add_scrollback("", 'OUTPUT')
|
||||
sc.prompt = PROMPT
|
||||
|
||||
|
@ -51,8 +51,7 @@ class MESH_MT_shape_key_specials(Menu):
|
||||
layout.operator("object.shape_key_transfer", icon='COPY_ID') # icon is not ideal
|
||||
layout.operator("object.join_shapes", icon='COPY_ID') # icon is not ideal
|
||||
layout.operator("object.shape_key_mirror", icon='ARROW_LEFTRIGHT')
|
||||
op = layout.operator("object.shape_key_add", icon='ZOOMIN', text="New Shape From Mix")
|
||||
op.from_mix = True
|
||||
layout.operator("object.shape_key_add", icon='ZOOMIN', text="New Shape From Mix").from_mix = True
|
||||
|
||||
|
||||
class MeshButtonsPanel():
|
||||
@ -207,8 +206,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel):
|
||||
col = row.column()
|
||||
|
||||
sub = col.column(align=True)
|
||||
op = sub.operator("object.shape_key_add", icon='ZOOMIN', text="")
|
||||
op.from_mix = False
|
||||
sub.operator("object.shape_key_add", icon='ZOOMIN', text="").from_mix = False
|
||||
sub.operator("object.shape_key_remove", icon='ZOOMOUT', text="")
|
||||
sub.menu("MESH_MT_shape_key_specials", icon='DOWNARROW_HLT', text="")
|
||||
|
||||
|
@ -115,8 +115,7 @@ class SCENE_PT_keying_sets(SceneButtonsPanel, Panel):
|
||||
|
||||
subcol = col.column()
|
||||
subcol.operator_context = 'INVOKE_DEFAULT'
|
||||
op = subcol.operator("anim.keying_set_export", text="Export to File")
|
||||
op.filepath = "keyingset.py"
|
||||
subcol.operator("anim.keying_set_export", text="Export to File").filepath = "keyingset.py"
|
||||
|
||||
col = row.column()
|
||||
col.label(text="Keyframing Settings:")
|
||||
|
@ -157,24 +157,24 @@ class IMAGE_MT_image_invert(Menu):
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
op = layout.operator("image.invert", text="Invert Image Colors")
|
||||
op.invert_r = True
|
||||
op.invert_g = True
|
||||
op.invert_b = True
|
||||
props = layout.operator("image.invert", text="Invert Image Colors")
|
||||
props.invert_r = True
|
||||
props.invert_g = True
|
||||
props.invert_b = True
|
||||
|
||||
layout.separator()
|
||||
|
||||
op = layout.operator("image.invert", text="Invert Red Channel")
|
||||
op.invert_r = True
|
||||
props = layout.operator("image.invert", text="Invert Red Channel")
|
||||
props.invert_r = True
|
||||
|
||||
op = layout.operator("image.invert", text="Invert Green Channel")
|
||||
op.invert_g = True
|
||||
props = layout.operator("image.invert", text="Invert Green Channel")
|
||||
props.invert_g = True
|
||||
|
||||
op = layout.operator("image.invert", text="Invert Blue Channel")
|
||||
op.invert_b = True
|
||||
props = layout.operator("image.invert", text="Invert Blue Channel")
|
||||
props.invert_b = True
|
||||
|
||||
op = layout.operator("image.invert", text="Invert Alpha Channel")
|
||||
op.invert_a = True
|
||||
props = layout.operator("image.invert", text="Invert Alpha Channel")
|
||||
props.invert_a = True
|
||||
|
||||
|
||||
class IMAGE_MT_uvs_showhide(Menu):
|
||||
|
@ -164,11 +164,9 @@ class InputKeyMapPanel:
|
||||
row.label()
|
||||
|
||||
if (not kmi.is_user_defined) and kmi.is_user_modified:
|
||||
op = row.operator("wm.keyitem_restore", text="", icon='BACK')
|
||||
op.item_id = kmi.id
|
||||
row.operator("wm.keyitem_restore", text="", icon='BACK').item_id = kmi.id
|
||||
else:
|
||||
op = row.operator("wm.keyitem_remove", text="", icon='X')
|
||||
op.item_id = kmi.id
|
||||
row.operator("wm.keyitem_remove", text="", icon='X').item_id = kmi.id
|
||||
|
||||
# Expanded, additional event settings
|
||||
if kmi.show_expanded:
|
||||
|
@ -54,11 +54,10 @@ class VIEW3D_HT_header(Header):
|
||||
else:
|
||||
sub.menu("VIEW3D_MT_object")
|
||||
|
||||
|
||||
# Contains buttons like Mode, Pivot, Manipulator, Layer, Mesh Select Mode...
|
||||
row = layout.row() #XXX Narrowed down vert/edge/face selector in edit mode/solid drawmode. -DingTo
|
||||
row = layout.row() # XXX Narrowed down vert/edge/face selector in edit mode/solid drawmode. -DingTo
|
||||
row.template_header_3D()
|
||||
|
||||
|
||||
if obj:
|
||||
# Particle edit
|
||||
if obj.mode == 'PARTICLE_EDIT':
|
||||
|
@ -16,6 +16,7 @@ def invert(f):
|
||||
|
||||
uuid_store = {}
|
||||
|
||||
|
||||
def slow_value(value, fac, uuid):
|
||||
""" Delay the value by a factor, use a unique string to allow
|
||||
use in multiple drivers without conflict:
|
||||
|
@ -51,7 +51,7 @@ extern "C" {
|
||||
|
||||
/* used by packaging tools */
|
||||
/* can be left blank, otherwise a,b,c... etc with no quotes */
|
||||
#define BLENDER_VERSION_CHAR
|
||||
#define BLENDER_VERSION_CHAR a
|
||||
/* alpha/beta/rc/release, docs use this */
|
||||
#define BLENDER_VERSION_CYCLE alpha
|
||||
|
||||
|
@ -930,7 +930,7 @@ void brush_jitter_pos(Brush *brush, float pos[2], float jitterpos[2])
|
||||
{
|
||||
int use_jitter= brush->jitter != 0;
|
||||
|
||||
/* jitter-ed brush gives wierd and unpredictable result for this
|
||||
/* jitter-ed brush gives weird and unpredictable result for this
|
||||
kinds of stroke, so manyally disable jitter usage (sergey) */
|
||||
use_jitter&= (brush->flag & (BRUSH_RESTORE_MESH|BRUSH_ANCHORED)) == 0;
|
||||
|
||||
|
@ -37,6 +37,7 @@ char *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy);
|
||||
int BLI_utf8_invalid_byte(const char *str, int length);
|
||||
int BLI_utf8_invalid_strip(char *str, int length);
|
||||
|
||||
int BLI_str_utf8_size(const char *p); /* warning, can return -1 on bad chars */
|
||||
/* copied from glib */
|
||||
unsigned int BLI_str_utf8_as_unicode(const char *p);
|
||||
unsigned int BLI_str_utf8_as_unicode_and_size(const char *p, size_t *index);
|
||||
|
@ -1258,9 +1258,18 @@ void BLI_make_file_string(const char *relabase, char *string, const char *dir,
|
||||
{
|
||||
int sl;
|
||||
|
||||
if (!string || !dir || !file) return; /* We don't want any NULLs */
|
||||
|
||||
string[0]= 0; /* ton */
|
||||
if (string) {
|
||||
/* ensure this is always set even if dir/file are NULL */
|
||||
string[0]= '\0';
|
||||
|
||||
if (ELEM(NULL, dir, file)) {
|
||||
return; /* We don't want any NULLs */
|
||||
}
|
||||
}
|
||||
else {
|
||||
return; /* string is NULL, probably shouldnt happen but return anyway */
|
||||
}
|
||||
|
||||
|
||||
/* we first push all slashes into unix mode, just to make sure we don't get
|
||||
any mess with slashes later on. -jesterKing */
|
||||
|
@ -312,6 +312,18 @@ size_t BLI_strncpy_wchar_from_utf8(wchar_t *dst_w, const char *src_c, const size
|
||||
}
|
||||
|
||||
|
||||
/* uses glib functions but not from glib */
|
||||
/* gets the size of a single utf8 char */
|
||||
int BLI_str_utf8_size(const char *p)
|
||||
{
|
||||
int mask = 0, len;
|
||||
unsigned char c = (unsigned char) *p;
|
||||
|
||||
UTF8_COMPUTE (c, mask, len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
/* was g_utf8_get_char */
|
||||
/**
|
||||
* BLI_str_utf8_as_unicode:
|
||||
|
@ -2702,7 +2702,6 @@ int BLO_write_file(Main *mainvar, const char *filepath, int write_flags, ReportL
|
||||
}
|
||||
}
|
||||
|
||||
userfilename[0]= '\0'; /* ensure its initialized */
|
||||
BLI_make_file_string(G.main->name, userfilename, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE);
|
||||
write_user_block= (BLI_path_cmp(filepath, userfilename) == 0);
|
||||
|
||||
|
@ -552,7 +552,12 @@ KeyingSet *ANIM_builtin_keyingset_get_named (KeyingSet *prevKS, const char name[
|
||||
if (strcmp(name, ks->name) == 0)
|
||||
return ks;
|
||||
}
|
||||
|
||||
|
||||
/* complain about missing keying sets on debug builds */
|
||||
#ifndef NDEBUG
|
||||
printf("%s: '%s' not found\n", __func__, name);
|
||||
#endif
|
||||
|
||||
/* no matches found */
|
||||
return NULL;
|
||||
}
|
||||
@ -687,7 +692,7 @@ KeyingSet *ANIM_get_keyingset_for_autokeying(Scene *scene, const char *tranformK
|
||||
if (IS_AUTOKEY_FLAG(scene, ONLYKEYINGSET) && (scene->active_keyingset))
|
||||
return ANIM_scene_get_active_keyingset(scene);
|
||||
else if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL))
|
||||
return ANIM_builtin_keyingset_get_named(NULL, "Available");
|
||||
return ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_AVAILABLE_ID);
|
||||
else
|
||||
return ANIM_builtin_keyingset_get_named(NULL, tranformKSName);
|
||||
}
|
||||
|
@ -4949,7 +4949,7 @@ static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op,
|
||||
|
||||
static int pose_clear_scale_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
return pose_clear_transform_generic_exec(C, op, pchan_clear_scale, "Scaling");
|
||||
return pose_clear_transform_generic_exec(C, op, pchan_clear_scale, ANIM_KS_SCALING_ID);
|
||||
}
|
||||
|
||||
void POSE_OT_scale_clear(wmOperatorType *ot)
|
||||
@ -4970,7 +4970,7 @@ void POSE_OT_scale_clear(wmOperatorType *ot)
|
||||
|
||||
static int pose_clear_rot_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
return pose_clear_transform_generic_exec(C, op, pchan_clear_rot, "Rotation");
|
||||
return pose_clear_transform_generic_exec(C, op, pchan_clear_rot, ANIM_KS_ROTATION_ID);
|
||||
}
|
||||
|
||||
void POSE_OT_rot_clear(wmOperatorType *ot)
|
||||
@ -4991,7 +4991,7 @@ void POSE_OT_rot_clear(wmOperatorType *ot)
|
||||
|
||||
static int pose_clear_loc_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
return pose_clear_transform_generic_exec(C, op, pchan_clear_loc, "Location");
|
||||
return pose_clear_transform_generic_exec(C, op, pchan_clear_loc, ANIM_KS_LOCATION_ID);
|
||||
}
|
||||
|
||||
void POSE_OT_loc_clear(wmOperatorType *ot)
|
||||
@ -5012,7 +5012,7 @@ void POSE_OT_loc_clear(wmOperatorType *ot)
|
||||
|
||||
static int pose_clear_transforms_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
return pose_clear_transform_generic_exec(C, op, pchan_clear_transforms, "LocRotScale");
|
||||
return pose_clear_transform_generic_exec(C, op, pchan_clear_transforms, ANIM_KS_LOC_ROT_SCALE_ID);
|
||||
}
|
||||
|
||||
void POSE_OT_transforms_clear(wmOperatorType *ot)
|
||||
|
@ -223,7 +223,7 @@ void poseAnim_mapping_autoKeyframe (bContext *C, Scene *scene, Object *ob, ListB
|
||||
{
|
||||
/* insert keyframes as necessary if autokeyframing */
|
||||
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
|
||||
KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "Whole Character");
|
||||
KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_WHOLE_CHARACTER_ID);
|
||||
ListBase dsources = {NULL, NULL};
|
||||
tPChanFCurveLink *pfl;
|
||||
|
||||
|
@ -433,7 +433,7 @@ static int poselib_add_exec (bContext *C, wmOperator *op)
|
||||
bAction *act = poselib_validate(ob);
|
||||
bPose *pose= (ob) ? ob->pose : NULL;
|
||||
TimeMarker *marker;
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Whole Character"); /* this includes custom props :)*/
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_WHOLE_CHARACTER_ID); /* this includes custom props :)*/
|
||||
int frame= RNA_int_get(op->ptr, "frame");
|
||||
char name[64];
|
||||
|
||||
@ -903,7 +903,7 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData
|
||||
bAction *act= pld->act;
|
||||
bActionGroup *agrp;
|
||||
|
||||
KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "Whole Character");
|
||||
KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_WHOLE_CHARACTER_ID);
|
||||
ListBase dsources = {NULL, NULL};
|
||||
short autokey = autokeyframe_cfra_can_key(scene, &pld->ob->id);
|
||||
|
||||
|
@ -1151,7 +1151,7 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
|
||||
int selOnly= RNA_boolean_get(op->ptr, "selected_mask");
|
||||
|
||||
/* get KeyingSet to use */
|
||||
KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "LocRotScale");
|
||||
KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOC_ROT_SCALE_ID);
|
||||
|
||||
/* sanity checks */
|
||||
if ELEM(NULL, ob, ob->pose)
|
||||
@ -2165,7 +2165,7 @@ static int pose_flip_quats_exec (bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
Object *ob= object_pose_armature_get(CTX_data_active_object(C));
|
||||
KeyingSet *ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
|
||||
KeyingSet *ks = ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_LOC_ROT_SCALE_ID);
|
||||
|
||||
/* loop through all selected pchans, flipping and keying (as needed) */
|
||||
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
|
||||
|
@ -778,7 +778,7 @@ void draw_gpencil_view2d (bContext *C, short onlyv2d)
|
||||
* Note: this gets called twice - first time with only3d=1 to draw 3d-strokes, second time with only3d=0 for screen-aligned strokes
|
||||
*/
|
||||
|
||||
void draw_gpencil_view3d_ext (Scene *scene, View3D *v3d, ARegion *ar, short only3d)
|
||||
void draw_gpencil_view3d (Scene *scene, View3D *v3d, ARegion *ar, short only3d)
|
||||
{
|
||||
bGPdata *gpd;
|
||||
int dflag = 0;
|
||||
@ -809,12 +809,4 @@ void draw_gpencil_view3d_ext (Scene *scene, View3D *v3d, ARegion *ar, short only
|
||||
gp_draw_data(gpd, rect.xmin, rect.ymin, rect.xmax, rect.ymax, CFRA, dflag);
|
||||
}
|
||||
|
||||
void draw_gpencil_view3d (bContext *C, short only3d)
|
||||
{
|
||||
ARegion *ar= CTX_wm_region(C);
|
||||
View3D *v3d= CTX_wm_view3d(C);
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
draw_gpencil_view3d_ext(scene, v3d, ar, only3d);
|
||||
}
|
||||
|
||||
/* ************************************************** */
|
||||
|
@ -78,8 +78,7 @@ void ED_operatortypes_gpencil(void);
|
||||
|
||||
void draw_gpencil_2dimage(struct bContext *C, struct ImBuf *ibuf);
|
||||
void draw_gpencil_view2d(struct bContext *C, short onlyv2d);
|
||||
void draw_gpencil_view3d(struct bContext *C, short only3d);
|
||||
void draw_gpencil_view3d_ext(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, short only3d);
|
||||
void draw_gpencil_view3d(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, short only3d);
|
||||
|
||||
void gpencil_panel_standard(const struct bContext *C, struct Panel *pa);
|
||||
|
||||
|
@ -317,6 +317,14 @@ typedef enum eAnimFilterFlags {
|
||||
int ED_autokeyframe_object(struct bContext *C, struct Scene *scene, struct Object *ob, struct KeyingSet *ks);
|
||||
int ED_autokeyframe_pchan(struct bContext *C, struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, struct KeyingSet *ks);
|
||||
|
||||
/* Names for builtin keying sets so we don't confuse these with labels/text,
|
||||
* defined in python script: keyingsets_builtins.py */
|
||||
#define ANIM_KS_LOCATION_ID "Location"
|
||||
#define ANIM_KS_ROTATION_ID "Rotation"
|
||||
#define ANIM_KS_SCALING_ID "Scaling"
|
||||
#define ANIM_KS_LOC_ROT_SCALE_ID "LocRotScale"
|
||||
#define ANIM_KS_AVAILABLE_ID "Available"
|
||||
#define ANIM_KS_WHOLE_CHARACTER_ID "Whole Character"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -787,6 +787,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propn
|
||||
void UI_buttons_operatortypes(void);
|
||||
|
||||
/* Helpers for Operators */
|
||||
uiBut *uiContextActiveButton(const struct bContext *C);
|
||||
void uiContextActiveProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index);
|
||||
void uiContextActivePropertyHandle(struct bContext *C);
|
||||
void uiContextAnimUpdate(const struct bContext *C);
|
||||
@ -817,5 +818,9 @@ const char *UI_translate_do_tooltip(const char *msgid);
|
||||
#define IFACE_(msgid) UI_translate_do_iface(msgid)
|
||||
#define TIP_(msgid) UI_translate_do_tooltip(msgid)
|
||||
|
||||
/* UI_OT_editsource helpers */
|
||||
int UI_editsource_enable_check(void);
|
||||
void UI_editsource_active_but_test(uiBut *but);
|
||||
|
||||
#endif /* UI_INTERFACE_H */
|
||||
|
||||
|
@ -2562,23 +2562,10 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str,
|
||||
if(block->curlayout)
|
||||
ui_layout_add_but(block->curlayout, but);
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
{
|
||||
extern void PyC_FileAndNum_Safe(const char **filename, int *lineno);
|
||||
|
||||
const char *fn;
|
||||
int lineno= -1;
|
||||
PyC_FileAndNum_Safe(&fn, &lineno);
|
||||
if (lineno != -1) {
|
||||
BLI_strncpy(but->py_dbg_fn, fn, sizeof(but->py_dbg_fn));
|
||||
but->py_dbg_ln= lineno;
|
||||
}
|
||||
else {
|
||||
but->py_dbg_fn[0]= '\0';
|
||||
but->py_dbg_ln= -1;
|
||||
}
|
||||
/* if the 'UI_OT_editsource' is running, extract the source info from the button */
|
||||
if (UI_editsource_enable_check()) {
|
||||
UI_editsource_active_but_test(but);
|
||||
}
|
||||
#endif /* WITH_PYTHON_UI_INFO */
|
||||
|
||||
return but;
|
||||
}
|
||||
|
@ -1447,7 +1447,7 @@ static int ui_textedit_type_utf8(uiBut *but, uiHandleButtonData *data, const cha
|
||||
len= strlen(str);
|
||||
|
||||
if(len-(but->selend - but->selsta)+1 <= data->maxlen) {
|
||||
int step= BLI_strnlen(utf8_buf, sizeof(utf8_buf));
|
||||
int step= BLI_str_utf8_size(utf8_buf);
|
||||
|
||||
/* type over the current selection */
|
||||
if ((but->selend - but->selsta) > 0) {
|
||||
@ -4443,16 +4443,8 @@ static int ui_but_menu(bContext *C, uiBut *but)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
if (but->py_dbg_ln != -1) {
|
||||
PointerRNA ptr_props;
|
||||
|
||||
WM_operator_properties_create(&ptr_props, "WM_OT_text_edit");
|
||||
RNA_string_set(&ptr_props, "filepath", but->py_dbg_fn);
|
||||
RNA_int_set(&ptr_props, "line", but->py_dbg_ln);
|
||||
uiItemFullO(layout, "WM_OT_text_edit", "Edit Source", ICON_NONE, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
|
||||
}
|
||||
#endif /* WITH_PYTHON_UI_INFO */
|
||||
/* perhaps we should move this into (G.f & G_DEBUG) - campbell */
|
||||
uiItemFullO(layout, "UI_OT_editsource", "Edit Source", ICON_NONE, NULL, WM_OP_INVOKE_DEFAULT, 0);
|
||||
|
||||
uiPupMenuEnd(C, pup);
|
||||
|
||||
@ -5146,9 +5138,10 @@ void ui_button_active_free(const bContext *C, uiBut *but)
|
||||
}
|
||||
}
|
||||
|
||||
static uiBut *ui_context_rna_button_active(const bContext *C)
|
||||
/* returns the active button with an optional checking function */
|
||||
static uiBut *ui_context_button_active(const bContext *C, int (*but_check_cb)(uiBut *))
|
||||
{
|
||||
uiBut *rnabut= NULL;
|
||||
uiBut *but_found= NULL;
|
||||
|
||||
ARegion *ar= CTX_wm_region(C);
|
||||
|
||||
@ -5166,26 +5159,40 @@ static uiBut *ui_context_rna_button_active(const bContext *C)
|
||||
}
|
||||
}
|
||||
|
||||
if(activebut && activebut->rnapoin.data) {
|
||||
if(activebut && (but_check_cb == NULL || but_check_cb(activebut))) {
|
||||
uiHandleButtonData *data= activebut->active;
|
||||
|
||||
rnabut= activebut;
|
||||
but_found= activebut;
|
||||
|
||||
/* recurse into opened menu, like colorpicker case */
|
||||
if(data && data->menu && (ar != data->menu->region)) {
|
||||
ar = data->menu->region;
|
||||
}
|
||||
else {
|
||||
return rnabut;
|
||||
return but_found;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* no active button */
|
||||
return rnabut;
|
||||
return but_found;
|
||||
}
|
||||
}
|
||||
|
||||
return rnabut;
|
||||
return but_found;
|
||||
}
|
||||
|
||||
static int ui_context_rna_button_active_test(uiBut *but)
|
||||
{
|
||||
return (but->rnapoin.data != NULL);
|
||||
}
|
||||
static uiBut *ui_context_rna_button_active(const bContext *C)
|
||||
{
|
||||
return ui_context_button_active(C, ui_context_rna_button_active_test);
|
||||
}
|
||||
|
||||
uiBut *uiContextActiveButton(const struct bContext *C)
|
||||
{
|
||||
return ui_context_button_active(C, NULL);
|
||||
}
|
||||
|
||||
/* helper function for insert keyframe, reset to default, etc operators */
|
||||
|
@ -252,11 +252,6 @@ struct uiBut {
|
||||
|
||||
/* pointer back */
|
||||
uiBlock *block;
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
char py_dbg_fn[240];
|
||||
int py_dbg_ln;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct uiBlock {
|
||||
|
@ -61,6 +61,10 @@
|
||||
#include "WM_api.h"
|
||||
#include "WM_types.h"
|
||||
|
||||
/* only for UI_OT_editsource */
|
||||
#include "ED_screen.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BLI_ghash.h"
|
||||
|
||||
|
||||
/* ********************************************************** */
|
||||
@ -474,6 +478,242 @@ static void UI_OT_reports_to_textblock(wmOperatorType *ot)
|
||||
ot->exec= reports_to_text_exec;
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
/* EditSource Utility funcs and operator,
|
||||
* note, this includes itility functions and button matching checks */
|
||||
|
||||
struct uiEditSourceStore {
|
||||
uiBut but_orig;
|
||||
GHash *hash;
|
||||
} uiEditSourceStore;
|
||||
|
||||
struct uiEditSourceButStore {
|
||||
char py_dbg_fn[240];
|
||||
int py_dbg_ln;
|
||||
} uiEditSourceButStore;
|
||||
|
||||
/* should only ever be set while the edit source operator is running */
|
||||
struct uiEditSourceStore *ui_editsource_info= NULL;
|
||||
|
||||
int UI_editsource_enable_check(void)
|
||||
{
|
||||
return (ui_editsource_info != NULL);
|
||||
}
|
||||
|
||||
static void ui_editsource_active_but_set(uiBut *but)
|
||||
{
|
||||
BLI_assert(ui_editsource_info == NULL);
|
||||
|
||||
ui_editsource_info= MEM_callocN(sizeof(uiEditSourceStore), __func__);
|
||||
memcpy(&ui_editsource_info->but_orig, but, sizeof(uiBut));
|
||||
|
||||
ui_editsource_info->hash = BLI_ghash_new(BLI_ghashutil_ptrhash,
|
||||
BLI_ghashutil_ptrcmp,
|
||||
__func__);
|
||||
}
|
||||
|
||||
static void ui_editsource_active_but_clear(void)
|
||||
{
|
||||
BLI_ghash_free(ui_editsource_info->hash, NULL, (GHashValFreeFP)MEM_freeN);
|
||||
MEM_freeN(ui_editsource_info);
|
||||
ui_editsource_info= NULL;
|
||||
}
|
||||
|
||||
static int ui_editsource_uibut_match(uiBut *but_a, uiBut *but_b)
|
||||
{
|
||||
#if 0
|
||||
printf("matching buttons: '%s' == '%s'\n",
|
||||
but_a->drawstr, but_b->drawstr);
|
||||
#endif
|
||||
|
||||
/* this just needs to be a 'good-enough' comparison so we can know beyond
|
||||
* reasonable doubt that these buttons are the same between redraws.
|
||||
* if this fails it only means edit-source fails - campbell */
|
||||
if( (but_a->x1 == but_b->x1) &&
|
||||
(but_a->x2 == but_b->x2) &&
|
||||
(but_a->y1 == but_b->y1) &&
|
||||
(but_a->y2 == but_b->y2) &&
|
||||
(but_a->type == but_b->type) &&
|
||||
(but_a->rnaprop == but_b->rnaprop) &&
|
||||
(but_a->optype == but_b->optype) &&
|
||||
(but_a->unit_type == but_b->unit_type) &&
|
||||
strncmp(but_a->drawstr, but_b->drawstr, UI_MAX_DRAW_STR) == 0
|
||||
) {
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void UI_editsource_active_but_test(uiBut *but)
|
||||
{
|
||||
extern void PyC_FileAndNum_Safe(const char **filename, int *lineno);
|
||||
|
||||
struct uiEditSourceButStore *but_store= MEM_callocN(sizeof(uiEditSourceButStore), __func__);
|
||||
|
||||
const char *fn;
|
||||
int lineno= -1;
|
||||
|
||||
#if 0
|
||||
printf("comparing buttons: '%s' == '%s'\n",
|
||||
but->drawstr, ui_editsource_info->but_orig.drawstr);
|
||||
#endif
|
||||
|
||||
PyC_FileAndNum_Safe(&fn, &lineno);
|
||||
|
||||
if (lineno != -1) {
|
||||
BLI_strncpy(but_store->py_dbg_fn, fn,
|
||||
sizeof(but_store->py_dbg_fn));
|
||||
but_store->py_dbg_ln= lineno;
|
||||
}
|
||||
else {
|
||||
but_store->py_dbg_fn[0]= '\0';
|
||||
but_store->py_dbg_ln= -1;
|
||||
}
|
||||
|
||||
BLI_ghash_insert(ui_editsource_info->hash, but, but_store);
|
||||
}
|
||||
|
||||
/* editsource operator component */
|
||||
|
||||
static ScrArea *biggest_text_view(bContext *C)
|
||||
{
|
||||
bScreen *sc= CTX_wm_screen(C);
|
||||
ScrArea *sa, *big= NULL;
|
||||
int size, maxsize= 0;
|
||||
|
||||
for(sa= sc->areabase.first; sa; sa= sa->next) {
|
||||
if(sa->spacetype==SPACE_TEXT) {
|
||||
size= sa->winx * sa->winy;
|
||||
if(size > maxsize) {
|
||||
maxsize= size;
|
||||
big= sa;
|
||||
}
|
||||
}
|
||||
}
|
||||
return big;
|
||||
}
|
||||
|
||||
static int editsource_text_edit(bContext *C, wmOperator *op,
|
||||
char filepath[240], int line)
|
||||
{
|
||||
struct Main *bmain= CTX_data_main(C);
|
||||
Text *text;
|
||||
|
||||
for (text=bmain->text.first; text; text=text->id.next) {
|
||||
if (text->name && BLI_path_cmp(text->name, filepath) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (text == NULL) {
|
||||
text= add_text(filepath, bmain->name);
|
||||
}
|
||||
|
||||
if (text == NULL) {
|
||||
BKE_reportf(op->reports, RPT_WARNING,
|
||||
"file: '%s' can't be opened", filepath);
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
else {
|
||||
/* naughty!, find text area to set, not good behavior
|
||||
* but since this is a dev tool lets allow it - campbell */
|
||||
ScrArea *sa= biggest_text_view(C);
|
||||
if(sa) {
|
||||
SpaceText *st= sa->spacedata.first;
|
||||
st->text= text;
|
||||
}
|
||||
else {
|
||||
BKE_reportf(op->reports, RPT_INFO,
|
||||
"See '%s' in the text editor", text->id.name + 2);
|
||||
}
|
||||
|
||||
txt_move_toline(text, line - 1, FALSE);
|
||||
WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, text);
|
||||
}
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static int editsource_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
uiBut *but= uiContextActiveButton(C);
|
||||
|
||||
if (but) {
|
||||
GHashIterator ghi;
|
||||
struct uiEditSourceButStore *but_store= NULL;
|
||||
|
||||
ARegion *ar= CTX_wm_region(C);
|
||||
int ret;
|
||||
|
||||
/* needed else the active button does not get tested */
|
||||
uiFreeActiveButtons(C, CTX_wm_screen(C));
|
||||
|
||||
// printf("%s: begin\n", __func__);
|
||||
|
||||
/* take care not to return before calling ui_editsource_active_but_clear */
|
||||
ui_editsource_active_but_set(but);
|
||||
|
||||
/* redraw and get active button python info */
|
||||
ED_region_do_draw(C, ar);
|
||||
|
||||
for(BLI_ghashIterator_init(&ghi, ui_editsource_info->hash);
|
||||
!BLI_ghashIterator_isDone(&ghi);
|
||||
BLI_ghashIterator_step(&ghi))
|
||||
{
|
||||
uiBut *but= BLI_ghashIterator_getKey(&ghi);
|
||||
if (but && ui_editsource_uibut_match(&ui_editsource_info->but_orig, but)) {
|
||||
but_store= BLI_ghashIterator_getValue(&ghi);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (but_store) {
|
||||
if (but_store->py_dbg_ln != -1) {
|
||||
ret= editsource_text_edit(C, op,
|
||||
but_store->py_dbg_fn,
|
||||
but_store->py_dbg_ln);
|
||||
}
|
||||
else {
|
||||
BKE_report(op->reports, RPT_ERROR,
|
||||
"Active button isn't from a script, cant edit source.");
|
||||
ret= OPERATOR_CANCELLED;
|
||||
}
|
||||
}
|
||||
else {
|
||||
BKE_report(op->reports, RPT_ERROR,
|
||||
"Active button match can't be found.");
|
||||
ret= OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
|
||||
ui_editsource_active_but_clear();
|
||||
|
||||
// printf("%s: end\n", __func__);
|
||||
|
||||
return ret;
|
||||
}
|
||||
else {
|
||||
BKE_report(op->reports, RPT_ERROR, "Active button not found");
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
}
|
||||
|
||||
static void UI_OT_editsource(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name= "Reports to Text Block";
|
||||
ot->idname= "UI_OT_editsource";
|
||||
ot->description= "Edit source code for a button";
|
||||
|
||||
/* callbacks */
|
||||
ot->exec= editsource_exec;
|
||||
}
|
||||
|
||||
|
||||
/* ********************************************************* */
|
||||
/* Registration */
|
||||
|
||||
@ -485,5 +725,6 @@ void UI_buttons_operatortypes(void)
|
||||
WM_operatortype_append(UI_OT_reset_default_button);
|
||||
WM_operatortype_append(UI_OT_copy_to_selected_button);
|
||||
WM_operatortype_append(UI_OT_reports_to_textblock); // XXX: temp?
|
||||
WM_operatortype_append(UI_OT_editsource);
|
||||
}
|
||||
|
||||
|
@ -253,7 +253,7 @@ static int object_clear_transform_generic_exec(bContext *C, wmOperator *op,
|
||||
|
||||
static int object_location_clear_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
return object_clear_transform_generic_exec(C, op, object_clear_loc, "Location");
|
||||
return object_clear_transform_generic_exec(C, op, object_clear_loc, ANIM_KS_LOCATION_ID);
|
||||
}
|
||||
|
||||
void OBJECT_OT_location_clear(wmOperatorType *ot)
|
||||
@ -273,7 +273,7 @@ void OBJECT_OT_location_clear(wmOperatorType *ot)
|
||||
|
||||
static int object_rotation_clear_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
return object_clear_transform_generic_exec(C, op, object_clear_rot, "Rotation");
|
||||
return object_clear_transform_generic_exec(C, op, object_clear_rot, ANIM_KS_ROTATION_ID);
|
||||
}
|
||||
|
||||
void OBJECT_OT_rotation_clear(wmOperatorType *ot)
|
||||
@ -293,7 +293,7 @@ void OBJECT_OT_rotation_clear(wmOperatorType *ot)
|
||||
|
||||
static int object_scale_clear_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
return object_clear_transform_generic_exec(C, op, object_clear_scale, "Scaling");
|
||||
return object_clear_transform_generic_exec(C, op, object_clear_scale, ANIM_KS_SCALING_ID);
|
||||
}
|
||||
|
||||
void OBJECT_OT_scale_clear(wmOperatorType *ot)
|
||||
|
@ -122,8 +122,6 @@ ImBuf* get_brush_icon(Brush *brush)
|
||||
if (!(brush->icon_imbuf)) {
|
||||
folder= BLI_get_folder(BLENDER_DATAFILES, "brushicons");
|
||||
|
||||
path[0]= 0;
|
||||
|
||||
BLI_make_file_string(G.main->name, path, folder, brush->icon_filepath);
|
||||
|
||||
if (path[0])
|
||||
|
@ -58,7 +58,6 @@
|
||||
#include "BKE_property.h"
|
||||
#include "BKE_tessmesh.h"
|
||||
|
||||
|
||||
#include "BIF_gl.h"
|
||||
#include "BIF_glutil.h"
|
||||
|
||||
|
@ -1917,7 +1917,7 @@ void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d)
|
||||
v3d->zbuf= TRUE;
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
draw_gpencil_view3d_ext(scene, v3d, ar, 1);
|
||||
draw_gpencil_view3d(scene, v3d, ar, 1);
|
||||
|
||||
v3d->zbuf= zbuf;
|
||||
|
||||
@ -2151,6 +2151,7 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
|
||||
CustomDataMask ED_view3d_datamask(Scene *scene, View3D *v3d)
|
||||
{
|
||||
CustomDataMask mask= 0;
|
||||
|
||||
if((v3d->drawtype == OB_TEXTURE) || ((v3d->drawtype == OB_SOLID) && (v3d->flag2 & V3D_SOLID_TEX))) {
|
||||
mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
|
||||
|
||||
@ -2331,7 +2332,7 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
|
||||
|
||||
/* must be before xray draw which clears the depth buffer */
|
||||
if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
|
||||
draw_gpencil_view3d_ext(scene, v3d, ar, 1);
|
||||
draw_gpencil_view3d(scene, v3d, ar, 1);
|
||||
if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
|
||||
|
||||
/* transp and X-ray afterdraw stuff */
|
||||
@ -2352,7 +2353,7 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
|
||||
ED_region_pixelspace(ar);
|
||||
|
||||
/* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */
|
||||
draw_gpencil_view3d_ext(scene, v3d, ar, 0);
|
||||
draw_gpencil_view3d(scene, v3d, ar, 0);
|
||||
|
||||
/* freeing the images again here could be done after the operator runs, leaving for now */
|
||||
GPU_free_images_anim();
|
||||
@ -2513,16 +2514,14 @@ static void draw_viewport_fps(Scene *scene, ARegion *ar)
|
||||
}
|
||||
|
||||
/* warning: this function has duplicate drawing in ED_view3d_draw_offscreen() */
|
||||
void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const char **grid_unit)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
RegionView3D *rv3d= CTX_wm_region_view3d(C);
|
||||
Base *base;
|
||||
Object *ob;
|
||||
float backcol[3];
|
||||
unsigned int lay_used;
|
||||
const char *grid_unit= NULL;
|
||||
|
||||
/* shadow buffers, before we setup matrices */
|
||||
if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
|
||||
@ -2572,7 +2571,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
|
||||
if((rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO)) {
|
||||
if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
|
||||
drawfloor(scene, v3d, &grid_unit);
|
||||
drawfloor(scene, v3d, grid_unit);
|
||||
}
|
||||
if(rv3d->persp==RV3D_CAMOB) {
|
||||
if(scene->world) {
|
||||
@ -2589,7 +2588,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
else {
|
||||
if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
|
||||
ED_region_pixelspace(ar);
|
||||
drawgrid(&scene->unit, ar, v3d, &grid_unit);
|
||||
drawgrid(&scene->unit, ar, v3d, grid_unit);
|
||||
/* XXX make function? replaces persp(1) */
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadMatrixf(rv3d->winmat);
|
||||
@ -2664,7 +2663,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
|
||||
/* must be before xray draw which clears the depth buffer */
|
||||
if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
|
||||
draw_gpencil_view3d((bContext *)C, 1);
|
||||
draw_gpencil_view3d(scene, v3d, ar, 1);
|
||||
if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
@ -2697,13 +2696,16 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
// TODO: draw something else (but not this) during fly mode
|
||||
draw_rotation_guide(rv3d);
|
||||
|
||||
ED_region_pixelspace(ar);
|
||||
|
||||
// retopo_paint_view_update(v3d);
|
||||
// retopo_draw_paint_lines();
|
||||
|
||||
/* Draw particle edit brush XXX (removed) */
|
||||
|
||||
}
|
||||
|
||||
static void view3d_main_area_draw_info(const bContext *C, ARegion *ar, const char *grid_unit)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
RegionView3D *rv3d= CTX_wm_region_view3d(C);
|
||||
bScreen *screen= CTX_wm_screen(C);
|
||||
|
||||
Object *ob;
|
||||
|
||||
if(rv3d->persp==RV3D_CAMOB)
|
||||
drawviewborder(scene, ar, v3d);
|
||||
@ -2711,7 +2713,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
|
||||
/* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */
|
||||
// if (v3d->flag2 & V3D_DISPGP)
|
||||
draw_gpencil_view3d((bContext *)C, 0);
|
||||
draw_gpencil_view3d(scene, v3d, ar, 0);
|
||||
|
||||
drawcursor(scene, ar, v3d);
|
||||
}
|
||||
@ -2721,7 +2723,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
else
|
||||
draw_view_icon(rv3d);
|
||||
|
||||
if((U.uiflag & USER_SHOW_FPS) && (CTX_wm_screen(C)->animtimer)) {
|
||||
if((U.uiflag & USER_SHOW_FPS) && screen->animtimer) {
|
||||
draw_viewport_fps(scene, ar);
|
||||
}
|
||||
else if(U.uiflag & USER_SHOW_VIEWPORTNAME) {
|
||||
@ -2741,8 +2743,18 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
ob= OBACT;
|
||||
if(U.uiflag & USER_DRAWVIEWINFO)
|
||||
draw_selected_name(scene, ob);
|
||||
}
|
||||
|
||||
void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
{
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
const char *grid_unit= NULL;
|
||||
|
||||
view3d_main_area_draw_objects(C, ar, &grid_unit);
|
||||
|
||||
ED_region_pixelspace(ar);
|
||||
|
||||
/* XXX here was the blockhandlers for floating panels */
|
||||
view3d_main_area_draw_info(C, ar, grid_unit);
|
||||
|
||||
v3d->flag |= V3D_INVALID_BACKBUF;
|
||||
}
|
||||
|
@ -699,11 +699,11 @@ static void move_camera(bContext* C, RegionView3D* rv3d, FlyInfo* fly, int orien
|
||||
* TODO: need to check in future that frame changed before doing this
|
||||
*/
|
||||
if (orientationChanged) {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_ROTATION_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
|
||||
}
|
||||
if (positionChanged) {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_LOCATION_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
|
||||
}
|
||||
|
||||
|
@ -546,7 +546,7 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
|
||||
|
||||
}
|
||||
else {
|
||||
struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "Location");
|
||||
struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID);
|
||||
|
||||
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
|
||||
if(ob->mode & OB_MODE_POSE) {
|
||||
@ -676,7 +676,7 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op))
|
||||
|
||||
}
|
||||
else {
|
||||
struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "Location");
|
||||
struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID);
|
||||
|
||||
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
|
||||
if(ob->mode & OB_MODE_POSE) {
|
||||
|
@ -4718,21 +4718,21 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob,
|
||||
|
||||
/* insert keyframes for the affected sets of channels using the builtin KeyingSets found */
|
||||
if (doLoc) {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_LOCATION_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
|
||||
}
|
||||
if (doRot) {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_ROTATION_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
|
||||
}
|
||||
if (doScale) {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Scale");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_SCALING_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
|
||||
}
|
||||
}
|
||||
/* insert keyframe in all (transform) channels */
|
||||
else {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_LOC_ROT_SCALE_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
|
||||
}
|
||||
|
||||
@ -4833,21 +4833,21 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
|
||||
}
|
||||
|
||||
if (doLoc) {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_LOCATION_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
|
||||
}
|
||||
if (doRot) {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_ROTATION_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
|
||||
}
|
||||
if (doScale) {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Scale");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_SCALING_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
|
||||
}
|
||||
}
|
||||
/* insert keyframe in all (transform) channels */
|
||||
else {
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
|
||||
KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_LOC_ROT_SCALE_ID);
|
||||
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
|
||||
}
|
||||
|
||||
|
@ -2662,6 +2662,11 @@ static const char *cpp_classes = ""
|
||||
"class Array {\n"
|
||||
"public:\n"
|
||||
" T data[Tsize];\n"
|
||||
"\n"
|
||||
" Array() {}\n"
|
||||
" Array(const Array<T, Tsize>& other) { memcpy(data, other.data, sizeof(T)*Tsize); }\n"
|
||||
" const Array<T, Tsize>& operator=(const Array<T, Tsize>& other) { memcpy(data, other.data, sizeof(T)*Tsize); return *this; }\n"
|
||||
"\n"
|
||||
" operator T*() { return data; }\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
@ -2678,8 +2683,6 @@ static const char *cpp_classes = ""
|
||||
" operator bool(void)\n"
|
||||
" { return iter.valid != 0; }\n"
|
||||
" const CollectionIterator<T, Tbegin, Tnext, Tend>& operator++() { Tnext(&iter); t = T(iter.ptr); return *this; }\n"
|
||||
" const CollectionIterator<T, Tbegin, Tnext, Tend>& operator=(const CollectionIterator<T, Tbegin, Tnext, Tend>& copy)\n"
|
||||
" { if(init) Tend(&iter); iter= copy.iter; if(iter.internal) iter.internal= MEM_dupallocN(iter.internal); t= copy.t; init= copy.init; return *this; }\n"
|
||||
"\n"
|
||||
" T& operator*(void) { return t; }\n"
|
||||
" T* operator->(void) { return &t; }\n"
|
||||
@ -2690,6 +2693,8 @@ static const char *cpp_classes = ""
|
||||
" { if(init) Tend(&iter); Tbegin(&iter, (PointerRNA*)&ptr.ptr); t = T(iter.ptr); init = true; }\n"
|
||||
"\n"
|
||||
"private:\n"
|
||||
" const CollectionIterator<T, Tbegin, Tnext, Tend>& operator=(const CollectionIterator<T, Tbegin, Tnext, Tend>& copy) {}\n"
|
||||
""
|
||||
" CollectionPropertyIterator iter;\n"
|
||||
" T t;\n"
|
||||
" bool init;\n"
|
||||
@ -2700,8 +2705,8 @@ static const char *cpp_classes = ""
|
||||
"public:\n"
|
||||
" Collection(const PointerRNA& p) : ptr(p) {}\n"
|
||||
"\n"
|
||||
" CollectionIterator<T, Tbegin, Tnext, Tend> begin()\n"
|
||||
" { CollectionIterator<T, Tbegin, Tnext, Tend> iter; iter.begin(ptr); return iter; }\n"
|
||||
" void begin(CollectionIterator<T, Tbegin, Tnext, Tend>& iter)\n"
|
||||
" { iter.begin(ptr); }\n"
|
||||
" CollectionIterator<T, Tbegin, Tnext, Tend> end()\n"
|
||||
" { return CollectionIterator<T, Tbegin, Tnext, Tend>(); } /* test */ \n"
|
||||
"\n"
|
||||
|
@ -52,41 +52,6 @@
|
||||
|
||||
/* RenderEngine */
|
||||
|
||||
static RenderEngineType internal_render_type = {
|
||||
NULL, NULL, "BLENDER_RENDER", "Blender Render", RE_INTERNAL, NULL, {NULL, NULL, NULL, NULL}};
|
||||
#ifdef WITH_GAMEENGINE
|
||||
static RenderEngineType internal_game_type = {
|
||||
NULL, NULL, "BLENDER_GAME", "Blender Game", RE_INTERNAL|RE_GAME, NULL, {NULL, NULL, NULL, NULL}};
|
||||
#endif
|
||||
|
||||
ListBase R_engines = {NULL, NULL};
|
||||
|
||||
void RE_engines_init(void)
|
||||
{
|
||||
BLI_addtail(&R_engines, &internal_render_type);
|
||||
#ifdef WITH_GAMEENGINE
|
||||
BLI_addtail(&R_engines, &internal_game_type);
|
||||
#endif
|
||||
}
|
||||
|
||||
void RE_engines_exit(void)
|
||||
{
|
||||
RenderEngineType *type, *next;
|
||||
|
||||
for(type=R_engines.first; type; type=next) {
|
||||
next= type->next;
|
||||
|
||||
BLI_remlink(&R_engines, type);
|
||||
|
||||
if(!(type->flag & RE_INTERNAL)) {
|
||||
if(type->ext.free)
|
||||
type->ext.free(type->ext.data);
|
||||
|
||||
MEM_freeN(type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void engine_render(RenderEngine *engine, struct Scene *scene)
|
||||
{
|
||||
extern FunctionRNA rna_RenderEngine_render_func;
|
||||
@ -96,7 +61,7 @@ static void engine_render(RenderEngine *engine, struct Scene *scene)
|
||||
FunctionRNA *func;
|
||||
|
||||
RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
|
||||
func= &rna_RenderEngine_render_func; /* RNA_struct_find_function(&ptr, "render"); */
|
||||
func= &rna_RenderEngine_render_func;
|
||||
|
||||
RNA_parameter_list_create(&list, &ptr, func);
|
||||
RNA_parameter_set_lookup(&list, "scene", &scene);
|
||||
@ -105,6 +70,8 @@ static void engine_render(RenderEngine *engine, struct Scene *scene)
|
||||
RNA_parameter_list_free(&list);
|
||||
}
|
||||
|
||||
/* RenderEngine registration */
|
||||
|
||||
static void rna_RenderEngine_unregister(Main *UNUSED(bmain), StructRNA *type)
|
||||
{
|
||||
RenderEngineType *et= RNA_struct_blender_type_get(type);
|
||||
@ -148,7 +115,7 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
|
||||
}
|
||||
|
||||
/* create a new engine type */
|
||||
et= MEM_callocN(sizeof(RenderEngineType), "python buttons engine");
|
||||
et= MEM_callocN(sizeof(RenderEngineType), "python render engine");
|
||||
memcpy(et, &dummyet, sizeof(dummyet));
|
||||
|
||||
et->ext.srna= RNA_def_struct(&BLENDER_RNA, et->idname, "RenderEngine");
|
||||
@ -276,6 +243,10 @@ static void rna_def_render_engine(BlenderRNA *brna)
|
||||
prop= RNA_def_string(func, "info", "", 0, "Info", "");
|
||||
RNA_def_property_flag(prop, PROP_REQUIRED);
|
||||
|
||||
func= RNA_def_function(srna, "update_progress", "RE_engine_update_progress");
|
||||
prop= RNA_def_float(func, "progress", 0, 0.0f, 1.0f, "", "Percentage of render that's done", 0.0f, 1.0f);
|
||||
RNA_def_property_flag(prop, PROP_REQUIRED);
|
||||
|
||||
func= RNA_def_function(srna, "report", "RE_engine_report");
|
||||
prop= RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
|
||||
RNA_def_property_flag(prop, PROP_REQUIRED);
|
||||
@ -294,11 +265,11 @@ static void rna_def_render_engine(BlenderRNA *brna)
|
||||
RNA_def_property_flag(prop, PROP_REGISTER);
|
||||
|
||||
prop= RNA_def_property(srna, "bl_use_preview", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_DO_PREVIEW);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_USE_PREVIEW);
|
||||
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
|
||||
|
||||
prop= RNA_def_property(srna, "bl_use_postprocess", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_negative_sdna(prop, NULL, "type->flag", RE_DO_ALL);
|
||||
RNA_def_property_boolean_negative_sdna(prop, NULL, "type->flag", RE_USE_POSTPROCESS);
|
||||
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
|
||||
|
||||
RNA_define_verify_sdna(1);
|
||||
|
@ -460,17 +460,45 @@ static PointerRNA rna_OperatorMacro_properties_get(PointerRNA *ptr)
|
||||
|
||||
static void rna_Event_ascii_get(PointerRNA *ptr, char *value)
|
||||
{
|
||||
wmEvent *event= (wmEvent*)ptr->id.data;
|
||||
wmEvent *event= (wmEvent*)ptr->data;
|
||||
value[0]= event->ascii;
|
||||
value[1]= '\0';
|
||||
}
|
||||
|
||||
static int rna_Event_ascii_length(PointerRNA *ptr)
|
||||
{
|
||||
wmEvent *event= (wmEvent*)ptr->id.data;
|
||||
wmEvent *event= (wmEvent*)ptr->data;
|
||||
return (event->ascii)? 1 : 0;
|
||||
}
|
||||
|
||||
static void rna_Event_unicode_get(PointerRNA *ptr, char *value)
|
||||
{
|
||||
/* utf8 buf isnt \0 terminated */
|
||||
wmEvent *event= (wmEvent*)ptr->data;
|
||||
size_t len= 0;
|
||||
|
||||
if (event->utf8_buf[0]) {
|
||||
BLI_str_utf8_as_unicode_and_size(event->utf8_buf, &len);
|
||||
if (len > 0) {
|
||||
memcpy(value, event->utf8_buf, len);
|
||||
}
|
||||
}
|
||||
|
||||
value[len]= '\0';
|
||||
}
|
||||
|
||||
static int rna_Event_unicode_length(PointerRNA *ptr)
|
||||
{
|
||||
|
||||
wmEvent *event= (wmEvent*)ptr->data;
|
||||
if (event->utf8_buf[0]) {
|
||||
return BLI_str_utf8_size(event->utf8_buf); /* invalid value is checked on assignment so we dont need to account for this */
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void rna_Window_screen_set(PointerRNA *ptr, PointerRNA value)
|
||||
{
|
||||
wmWindow *win= (wmWindow*)ptr->data;
|
||||
@ -1358,6 +1386,11 @@ static void rna_def_event(BlenderRNA *brna)
|
||||
RNA_def_property_ui_text(prop, "ASCII", "Single ASCII character for this event");
|
||||
|
||||
|
||||
prop= RNA_def_property(srna, "unicode", PROP_STRING, PROP_NONE);
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_string_funcs(prop, "rna_Event_unicode_get", "rna_Event_unicode_length", NULL);
|
||||
RNA_def_property_ui_text(prop, "Unicode", "Single unicode character for this event");
|
||||
|
||||
/* enums */
|
||||
prop= RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "val");
|
||||
|
@ -203,6 +203,13 @@ void BPY_python_start(int argc, const char **argv)
|
||||
/* allow to use our own included python */
|
||||
PyC_SetHomePath(BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL));
|
||||
|
||||
/* without this the sys.stdout may be set to 'ascii'
|
||||
* (it is on my system at least), where printing unicode values will raise
|
||||
* an error, this is highly annoying, another stumbling block for devs,
|
||||
* so use a more relaxed error handler and enforce utf-8 since the rest of
|
||||
* blender is utf-8 too - campbell */
|
||||
BLI_setenv("PYTHONIOENCODING", "utf-8:surrogateescape");
|
||||
|
||||
/* Python 3.2 now looks for '2.xx/python/include/python3.2d/pyconfig.h' to
|
||||
* parse from the 'sysconfig' module which is used by 'site',
|
||||
* so for now disable site. alternatively we could copy the file. */
|
||||
|
@ -118,6 +118,17 @@ set(SRC
|
||||
intern/raytrace/vbvh.h
|
||||
)
|
||||
|
||||
if(WITH_PYTHON)
|
||||
add_definitions(-DWITH_PYTHON)
|
||||
list(APPEND INC
|
||||
../python
|
||||
)
|
||||
|
||||
list(APPEND INC_SYS
|
||||
${PYTHON_INCLUDE_DIRS}
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WITH_IMAGE_OPENEXR)
|
||||
add_definitions(-DWITH_OPENEXR)
|
||||
endif()
|
||||
@ -136,6 +147,10 @@ if(WITH_CODEC_QUICKTIME)
|
||||
add_definitions(-DWITH_QUICKTIME)
|
||||
endif()
|
||||
|
||||
if(WITH_GAMEENGINE)
|
||||
add_definitions(-DWITH_GAMEENGINE)
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
if(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
|
||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mfpmath=sse")
|
||||
|
@ -16,6 +16,13 @@ defs_raytrace = []
|
||||
|
||||
defs.append('WITH_SMOKE') # TODO, make optional
|
||||
|
||||
if env['WITH_BF_PYTHON']:
|
||||
incs += ' ../python'
|
||||
incs += ' ' + env['BF_PYTHON_INC']
|
||||
defs.append('WITH_PYTHON')
|
||||
if env['BF_DEBUG']:
|
||||
defs.append('DEBUG')
|
||||
|
||||
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
|
||||
if env['WITH_BF_RAYOPTIMIZATION']:
|
||||
cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS']
|
||||
@ -49,6 +56,9 @@ if env['WITH_BF_QUICKTIME']:
|
||||
if env['WITH_BF_OPENEXR']:
|
||||
defs.append('WITH_OPENEXR')
|
||||
|
||||
if env['WITH_BF_GAMEENGINE']:
|
||||
defs.append('WITH_GAMEENGINE')
|
||||
|
||||
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
|
||||
incs += ' ' + env['BF_PTHREADS_INC']
|
||||
|
||||
|
15
source/blender/render/extern/include/RE_engine.h
vendored
15
source/blender/render/extern/include/RE_engine.h
vendored
@ -48,10 +48,10 @@ struct Scene;
|
||||
|
||||
/* External Engine */
|
||||
|
||||
#define RE_INTERNAL 1
|
||||
#define RE_GAME 2
|
||||
#define RE_DO_PREVIEW 4
|
||||
#define RE_DO_ALL 8
|
||||
#define RE_INTERNAL 1
|
||||
#define RE_GAME 2
|
||||
#define RE_USE_PREVIEW 4
|
||||
#define RE_USE_POSTPROCESS 8
|
||||
|
||||
extern ListBase R_engines;
|
||||
|
||||
@ -71,10 +71,14 @@ typedef struct RenderEngineType {
|
||||
|
||||
typedef struct RenderEngine {
|
||||
RenderEngineType *type;
|
||||
|
||||
struct Render *re;
|
||||
ListBase fullresult;
|
||||
} RenderEngine;
|
||||
|
||||
RenderEngine *RE_engine_create(RenderEngineType *type);
|
||||
void RE_engine_free(RenderEngine *engine);
|
||||
|
||||
void RE_layer_load_from_file(struct RenderLayer *layer, struct ReportList *reports, const char *filename, int x, int y);
|
||||
void RE_result_load_from_file(struct RenderResult *result, struct ReportList *reports, const char *filename);
|
||||
|
||||
@ -84,6 +88,7 @@ void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result);
|
||||
|
||||
int RE_engine_test_break(RenderEngine *engine);
|
||||
void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info);
|
||||
void RE_engine_update_progress(RenderEngine *engine, float progress);
|
||||
void RE_engine_report(RenderEngine *engine, int type, const char *msg);
|
||||
|
||||
int RE_engine_render(struct Render *re, int do_all);
|
||||
@ -93,5 +98,7 @@ int RE_engine_render(struct Render *re, int do_all);
|
||||
void RE_engines_init(void);
|
||||
void RE_engines_exit(void);
|
||||
|
||||
RenderEngineType *RE_engines_find(const char *idname);
|
||||
|
||||
#endif /* RE_ENGINE_H */
|
||||
|
||||
|
@ -47,13 +47,89 @@
|
||||
#include "IMB_imbuf.h"
|
||||
#include "IMB_imbuf_types.h"
|
||||
|
||||
#ifdef WITH_PYTHON
|
||||
#include "BPY_extern.h"
|
||||
#endif
|
||||
|
||||
#include "RE_engine.h"
|
||||
#include "RE_pipeline.h"
|
||||
|
||||
#include "render_types.h"
|
||||
#include "renderpipeline.h"
|
||||
|
||||
/************************** External Engines ***************************/
|
||||
/* Render Engine Types */
|
||||
|
||||
static RenderEngineType internal_render_type = {
|
||||
NULL, NULL,
|
||||
"BLENDER_RENDER", "Blender Render", RE_INTERNAL,
|
||||
NULL,
|
||||
{NULL, NULL, NULL}};
|
||||
|
||||
#ifdef WITH_GAMEENGINE
|
||||
|
||||
static RenderEngineType internal_game_type = {
|
||||
NULL, NULL,
|
||||
"BLENDER_GAME", "Blender Game", RE_INTERNAL|RE_GAME,
|
||||
NULL,
|
||||
{NULL, NULL, NULL}};
|
||||
|
||||
#endif
|
||||
|
||||
ListBase R_engines = {NULL, NULL};
|
||||
|
||||
void RE_engines_init(void)
|
||||
{
|
||||
BLI_addtail(&R_engines, &internal_render_type);
|
||||
#ifdef WITH_GAMEENGINE
|
||||
BLI_addtail(&R_engines, &internal_game_type);
|
||||
#endif
|
||||
}
|
||||
|
||||
void RE_engines_exit(void)
|
||||
{
|
||||
RenderEngineType *type, *next;
|
||||
|
||||
for(type=R_engines.first; type; type=next) {
|
||||
next= type->next;
|
||||
|
||||
BLI_remlink(&R_engines, type);
|
||||
|
||||
if(!(type->flag & RE_INTERNAL)) {
|
||||
if(type->ext.free)
|
||||
type->ext.free(type->ext.data);
|
||||
|
||||
MEM_freeN(type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RenderEngineType *RE_engines_find(const char *idname)
|
||||
{
|
||||
RenderEngineType *type;
|
||||
|
||||
type= BLI_findstring(&R_engines, idname, offsetof(RenderEngineType, idname));
|
||||
if(!type)
|
||||
type= &internal_render_type;
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Create, Free */
|
||||
|
||||
RenderEngine *RE_engine_create(RenderEngineType *type)
|
||||
{
|
||||
RenderEngine *engine = MEM_callocN(sizeof(RenderEngine), "RenderEngine");
|
||||
engine->type= type;
|
||||
|
||||
return engine;
|
||||
}
|
||||
|
||||
void RE_engine_free(RenderEngine *engine)
|
||||
{
|
||||
MEM_freeN(engine);
|
||||
}
|
||||
|
||||
/* Render Results */
|
||||
|
||||
RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h)
|
||||
{
|
||||
@ -133,11 +209,24 @@ void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char
|
||||
{
|
||||
Render *re= engine->re;
|
||||
|
||||
re->i.statstr= stats;
|
||||
re->i.infostr= info;
|
||||
re->stats_draw(re->sdh, &re->i);
|
||||
re->i.infostr= NULL;
|
||||
re->i.statstr= NULL;
|
||||
/* stats draw callback */
|
||||
if(re) {
|
||||
re->i.statstr= stats;
|
||||
re->i.infostr= info;
|
||||
re->stats_draw(re->sdh, &re->i);
|
||||
re->i.infostr= NULL;
|
||||
re->i.statstr= NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void RE_engine_update_progress(RenderEngine *engine, float progress)
|
||||
{
|
||||
Render *re= engine->re;
|
||||
|
||||
if(re) {
|
||||
CLAMP(progress, 0.0f, 1.0f);
|
||||
re->progress(re->prh, progress);
|
||||
}
|
||||
}
|
||||
|
||||
void RE_engine_report(RenderEngine *engine, int type, const char *msg)
|
||||
@ -149,16 +238,17 @@ void RE_engine_report(RenderEngine *engine, int type, const char *msg)
|
||||
|
||||
int RE_engine_render(Render *re, int do_all)
|
||||
{
|
||||
RenderEngineType *type= BLI_findstring(&R_engines, re->r.engine, offsetof(RenderEngineType, idname));
|
||||
RenderEngine engine;
|
||||
RenderEngineType *type= RE_engines_find(re->r.engine);
|
||||
RenderEngine *engine;
|
||||
|
||||
if(!(type && type->render))
|
||||
/* verify if we can render */
|
||||
if(!type->render)
|
||||
return 0;
|
||||
if((re->r.scemode & R_PREVIEWBUTS) && !(type->flag & RE_DO_PREVIEW))
|
||||
if((re->r.scemode & R_PREVIEWBUTS) && !(type->flag & RE_USE_PREVIEW))
|
||||
return 0;
|
||||
if(do_all && !(type->flag & RE_DO_ALL))
|
||||
if(do_all && !(type->flag & RE_USE_POSTPROCESS))
|
||||
return 0;
|
||||
if(!do_all && (type->flag & RE_DO_ALL))
|
||||
if(!do_all && (type->flag & RE_USE_POSTPROCESS))
|
||||
return 0;
|
||||
|
||||
/* create render result */
|
||||
@ -172,14 +262,19 @@ int RE_engine_render(Render *re, int do_all)
|
||||
if(re->result==NULL)
|
||||
return 1;
|
||||
|
||||
/* external */
|
||||
memset(&engine, 0, sizeof(engine));
|
||||
engine.type= type;
|
||||
engine.re= re;
|
||||
/* render */
|
||||
engine = RE_engine_create(type);
|
||||
engine->re= re;
|
||||
|
||||
type->render(&engine, re->scene);
|
||||
if((re->r.scemode & (R_NO_FRAME_UPDATE|R_PREVIEWBUTS))==0)
|
||||
scene_update_for_newframe(re->main, re->scene, re->lay);
|
||||
|
||||
free_render_result(&engine.fullresult, engine.fullresult.first);
|
||||
type->render(engine, re->scene);
|
||||
|
||||
|
||||
free_render_result(&engine->fullresult, engine->fullresult.first);
|
||||
|
||||
RE_engine_free(engine);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -1526,7 +1526,7 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
|
||||
do_tra= ((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP) && shr->alpha!=1.0f && (shi->depth <= shi->mat->ray_depth_tra));
|
||||
do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f && (shi->depth <= shi->mat->ray_depth));
|
||||
|
||||
/* raytrace mirror amd refract like to separate the spec color */
|
||||
/* raytrace mirror and refract like to separate the spec color */
|
||||
if(shi->combinedflag & SCE_PASS_SPEC)
|
||||
sub_v3_v3v3(diff, shr->combined, shr->spec);
|
||||
else
|
||||
|
@ -346,7 +346,9 @@ typedef struct wmEvent {
|
||||
short val; /* press, release, scrollvalue */
|
||||
int x, y; /* mouse pointer position, screen coord */
|
||||
int mval[2]; /* region mouse position, name convention pre 2.5 :) */
|
||||
char utf8_buf[6]; /* from, ghost if utf8 is enabled for the platform */
|
||||
char utf8_buf[6]; /* from, ghost if utf8 is enabled for the platform,
|
||||
* BLI_str_utf8_size() must _always_ be valid, check
|
||||
* when assigning s we dont need to check on every access after */
|
||||
char ascii; /* from ghost, fallback if utf8 isnt set */
|
||||
char pad;
|
||||
|
||||
|
@ -454,11 +454,12 @@ void WM_event_print(wmEvent *event)
|
||||
|
||||
printf("wmEvent - type:%d/%s, val:%d/%s, "
|
||||
"shift:%d, ctrl:%d, alt:%d, oskey:%d, keymodifier:%d, "
|
||||
"mouse:(%d,%d), ascii:'%c', utf8:'%.6s', "
|
||||
"mouse:(%d,%d), ascii:'%c', utf8:'%.*s', "
|
||||
"keymap_idname:%s, pointer:%p\n",
|
||||
event->type, type_id, event->val, val_id,
|
||||
event->shift, event->ctrl, event->alt, event->oskey, event->keymodifier,
|
||||
event->x, event->y, event->ascii, event->utf8_buf,
|
||||
event->x, event->y, event->ascii,
|
||||
BLI_str_utf8_size(event->utf8_buf), event->utf8_buf,
|
||||
event->keymap_idname, (void *)event);
|
||||
}
|
||||
else {
|
||||
@ -2616,16 +2617,25 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U
|
||||
|
||||
/* exclude arrow keys, esc, etc from text input */
|
||||
if(type==GHOST_kEventKeyUp) {
|
||||
if (event.ascii<32 && event.ascii > 0) {
|
||||
event.ascii= '\0';
|
||||
}
|
||||
event.ascii= '\0';
|
||||
|
||||
/* ghost should do this already for key up */
|
||||
if (event.utf8_buf[0]) {
|
||||
printf("%s: ghost on you're platform is misbehaving, utf8 events on key up!\n", __func__);
|
||||
printf("%s: ghost on your platform is misbehaving, utf8 events on key up!\n", __func__);
|
||||
}
|
||||
event.utf8_buf[0]= '\0';
|
||||
}
|
||||
else if (event.ascii<32 && event.ascii > 0) {
|
||||
event.ascii= '\0';
|
||||
/* TODO. should this also zero utf8?, dont for now, campbell */
|
||||
}
|
||||
|
||||
if (event.utf8_buf[0]) {
|
||||
if (BLI_str_utf8_size(event.utf8_buf) == -1) {
|
||||
printf("%s: ghost detected an invalid unicode character '%d'!\n", __func__, (int)(unsigned char)event.utf8_buf[0]);
|
||||
event.utf8_buf[0]= '\0';
|
||||
}
|
||||
}
|
||||
|
||||
/* modifiers */
|
||||
/* assigning both first and second is strange - campbell */
|
||||
|
@ -104,11 +104,6 @@
|
||||
|
||||
static GHash *global_ops_hash= NULL;
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
# include "DNA_text_types.h"
|
||||
# include "BKE_text.h"
|
||||
#endif
|
||||
|
||||
/* ************ operator API, exported ********** */
|
||||
|
||||
|
||||
@ -3509,79 +3504,6 @@ static void operatortype_ghash_free_cb(wmOperatorType *ot)
|
||||
MEM_freeN(ot);
|
||||
}
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
|
||||
static ScrArea *biggest_text_view(bContext *C)
|
||||
{
|
||||
bScreen *sc= CTX_wm_screen(C);
|
||||
ScrArea *sa, *big= NULL;
|
||||
int size, maxsize= 0;
|
||||
|
||||
for(sa= sc->areabase.first; sa; sa= sa->next) {
|
||||
if(sa->spacetype==SPACE_TEXT) {
|
||||
size= sa->winx * sa->winy;
|
||||
if(size > maxsize) {
|
||||
maxsize= size;
|
||||
big= sa;
|
||||
}
|
||||
}
|
||||
}
|
||||
return big;
|
||||
}
|
||||
|
||||
static int wm_text_edit_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain= CTX_data_main(C);
|
||||
Text *text;
|
||||
|
||||
char filepath[240];
|
||||
int line= RNA_int_get(op->ptr, "line");
|
||||
RNA_string_get(op->ptr, "filepath", filepath);
|
||||
|
||||
for (text=bmain->text.first; text; text=text->id.next) {
|
||||
if (text->name && BLI_path_cmp(text->name, filepath) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (text == NULL) {
|
||||
text= add_text(filepath, bmain->name);
|
||||
}
|
||||
|
||||
if (text == NULL) {
|
||||
BKE_reportf(op->reports, RPT_WARNING, "file: '%s' can't be opened", filepath);
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
else {
|
||||
/* naughty!, find text area to set, not good behavior
|
||||
* but since this is a dev tool lets allow it - campbell */
|
||||
ScrArea *sa= biggest_text_view(C);
|
||||
if(sa) {
|
||||
SpaceText *st= sa->spacedata.first;
|
||||
st->text= text;
|
||||
}
|
||||
|
||||
txt_move_toline(text, line - 1, FALSE);
|
||||
WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, text);
|
||||
}
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static void WM_OT_text_edit(wmOperatorType *ot)
|
||||
{
|
||||
ot->name= "Edit Text File";
|
||||
ot->idname= "WM_OT_text_edit";
|
||||
|
||||
ot->exec= wm_text_edit_exec;
|
||||
|
||||
RNA_def_string_file_path(ot->srna, "filepath", "", FILE_MAX, "Path", "");
|
||||
RNA_def_int(ot->srna, "line", 0, INT_MIN, INT_MAX, "Line", "", 0, INT_MAX);
|
||||
}
|
||||
|
||||
#endif /* WITH_PYTHON_UI_INFO */
|
||||
|
||||
|
||||
/* ******************************************************* */
|
||||
/* called on initialize WM_exit() */
|
||||
void wm_operatortype_free(void)
|
||||
@ -3624,11 +3546,6 @@ void wm_operatortype_init(void)
|
||||
WM_operatortype_append(WM_OT_collada_export);
|
||||
WM_operatortype_append(WM_OT_collada_import);
|
||||
#endif
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
WM_operatortype_append(WM_OT_text_edit);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/* circleselect-like modal operators */
|
||||
|
@ -394,6 +394,7 @@ struct RenderResult *RE_AcquireResultRead(struct Render *re){return (struct Rend
|
||||
struct RenderResult *RE_AcquireResultWrite(struct Render *re){return (struct RenderResult *) NULL;}
|
||||
struct RenderStats *RE_GetStats(struct Render *re){return (struct RenderStats *) NULL;}
|
||||
void RE_engine_update_result(struct RenderEngine *engine, struct RenderResult *result){}
|
||||
void RE_engine_update_progress(struct RenderEngine *engine, float progress) {}
|
||||
void RE_engine_end_result(struct RenderEngine *engine, struct RenderResult *result){}
|
||||
void RE_engine_update_stats(struct RenderEngine *engine, char *stats, char *info){}
|
||||
void RE_layer_load_from_file(struct RenderLayer *layer, struct ReportList *reports, char *filename){}
|
||||
@ -402,7 +403,11 @@ void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr){}
|
||||
void RE_ReleaseResult(struct Render *re){}
|
||||
void RE_ReleaseResultImage(struct Render *re){}
|
||||
int RE_engine_test_break(struct RenderEngine *engine){return 0;}
|
||||
void RE_engines_init() {}
|
||||
void RE_engines_exit() {}
|
||||
void RE_engine_report(struct RenderEngine *engine, int type, const char *msg) {}
|
||||
ListBase R_engines = {NULL, NULL};
|
||||
void RE_engine_free(struct RenderEngine *engine) {}
|
||||
|
||||
/* python */
|
||||
struct wmOperatorType *WM_operatortype_find(const char *idname, int quiet){return (struct wmOperatorType *) NULL;}
|
||||
|
@ -51,7 +51,7 @@ class PHY_IMotionState
|
||||
virtual void getWorldPosition(float& posX,float& posY,float& posZ)=0;
|
||||
virtual void getWorldScaling(float& scaleX,float& scaleY,float& scaleZ)=0;
|
||||
virtual void getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal)=0;
|
||||
// ori = array 12 floats, [0..3] = first column + 0, [4..7] = second colum, [8..11] = third column
|
||||
// ori = array 12 floats, [0..3] = first column + 0, [4..7] = second column, [8..11] = third column
|
||||
virtual void getWorldOrientation(float* ori)=0;
|
||||
virtual void setWorldOrientation(const float* ori)=0;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user