svn merge ^/trunk/blender -r41200:41226 .

This commit is contained in:
Campbell Barton 2011-10-24 08:45:55 +00:00
commit 70bf00a74c
51 changed files with 751 additions and 346 deletions

@ -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']

@ -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;