Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-10-24 12:45:55 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-10-24 12:45:55 +0400
commit70bf00a74c1688e857e3ca1b143b4d7a57a30655 (patch)
tree8015eb2525a1aeca9c77fcbdf8fe222fff67948d /source/blender
parentdbe2fe5043b99f8a5717bbe5b6a9e36a6519f8c7 (diff)
parentf1cea89d99f0c80bdccd2ba1359142b5ff14cdb9 (diff)
svn merge ^/trunk/blender -r41200:41226 .
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/intern/brush.c2
-rw-r--r--source/blender/blenlib/BLI_string_utf8.h1
-rw-r--r--source/blender/blenlib/intern/path_util.c15
-rw-r--r--source/blender/blenlib/intern/string_utf8.c12
-rw-r--r--source/blender/blenloader/intern/writefile.c1
-rw-r--r--source/blender/editors/animation/keyingsets.c9
-rw-r--r--source/blender/editors/armature/editarmature.c8
-rw-r--r--source/blender/editors/armature/poseUtils.c2
-rw-r--r--source/blender/editors/armature/poselib.c4
-rw-r--r--source/blender/editors/armature/poseobject.c4
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c10
-rw-r--r--source/blender/editors/include/ED_gpencil.h3
-rw-r--r--source/blender/editors/include/ED_keyframing.h8
-rw-r--r--source/blender/editors/include/UI_interface.h5
-rw-r--r--source/blender/editors/interface/interface.c19
-rw-r--r--source/blender/editors/interface/interface_handlers.c43
-rw-r--r--source/blender/editors/interface/interface_intern.h5
-rw-r--r--source/blender/editors/interface/interface_ops.c241
-rw-r--r--source/blender/editors/object/object_transform.c6
-rw-r--r--source/blender/editors/render/render_preview.c2
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c1
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c50
-rw-r--r--source/blender/editors/space_view3d/view3d_fly.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c4
-rw-r--r--source/blender/editors/transform/transform_conversions.c16
-rw-r--r--source/blender/makesrna/intern/makesrna.c13
-rw-r--r--source/blender/makesrna/intern/rna_render.c49
-rw-r--r--source/blender/makesrna/intern/rna_wm.c37
-rw-r--r--source/blender/python/intern/bpy_interface.c7
-rw-r--r--source/blender/render/CMakeLists.txt15
-rw-r--r--source/blender/render/SConscript10
-rw-r--r--source/blender/render/extern/include/RE_engine.h15
-rw-r--r--source/blender/render/intern/source/external_engine.c131
-rw-r--r--source/blender/render/intern/source/rayshade.c2
-rw-r--r--source/blender/windowmanager/WM_types.h4
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c22
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c83
38 files changed, 603 insertions, 262 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index d4b8ade7876..cff5719cd3e 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -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
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index c84a3cfc730..4ab9d085de3 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -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;
diff --git a/source/blender/blenlib/BLI_string_utf8.h b/source/blender/blenlib/BLI_string_utf8.h
index 765ae93828e..bcb641d79d8 100644
--- a/source/blender/blenlib/BLI_string_utf8.h
+++ b/source/blender/blenlib/BLI_string_utf8.h
@@ -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);
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 47afb60761f..202ea5b1a34 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -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 */
diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c
index b1ad04eb70d..b4c58d3bab4 100644
--- a/source/blender/blenlib/intern/string_utf8.c
+++ b/source/blender/blenlib/intern/string_utf8.c
@@ -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:
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index d216aaa75ba..7c0ac79545b 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -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);
diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c
index 7c2f969e187..95324554a06 100644
--- a/source/blender/editors/animation/keyingsets.c
+++ b/source/blender/editors/animation/keyingsets.c
@@ -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);
}
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 25d4874379d..34ec2605cdd 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -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)
diff --git a/source/blender/editors/armature/poseUtils.c b/source/blender/editors/armature/poseUtils.c
index 4b22d76ad0b..5c98fdc08bd 100644
--- a/source/blender/editors/armature/poseUtils.c
+++ b/source/blender/editors/armature/poseUtils.c
@@ -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;
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 8e9f5c7543c..064defb1aef 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -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);
diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c
index a978f327993..beae9c12bfe 100644
--- a/source/blender/editors/armature/poseobject.c
+++ b/source/blender/editors/armature/poseobject.c
@@ -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)
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 8e83b01fc2f..07858f7182c 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -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);
-}
-
/* ************************************************** */
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index bfd16487ae5..a640b5c911c 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -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);
diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h
index 8dd543d8f63..eda84d0e7a4 100644
--- a/source/blender/editors/include/ED_keyframing.h
+++ b/source/blender/editors/include/ED_keyframing.h
@@ -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
}
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 43f6b36f5eb..5e9e7c65f83 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -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 */
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index b7b572e7217..f9991079507 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -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;
}
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 32c4ec21e13..9f77317292c 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -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 */
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index b7a2227f98a..9d0383c8812 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -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 {
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 081b528d153..eee771cbd93 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -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);
}
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index c86cacc960d..13c8f27ee8f 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -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)
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 697cddfcee0..af2cd431a10 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -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])
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index ae9ef2c4dfd..e7f5dce14e9 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -58,7 +58,6 @@
#include "BKE_property.h"
#include "BKE_tessmesh.h"
-
#include "BIF_gl.h"
#include "BIF_glutil.h"
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index ba9faf7682e..291ef7a3bbf 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -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;
}
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
index b66440738b2..8e2a9c30193 100644
--- a/source/blender/editors/space_view3d/view3d_fly.c
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -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);
}
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 4db7f2085c9..41eb76eacfa 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -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) {
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 50cc825fb68..fb7d3a4d4b3 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -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);
}
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 871cbad6152..42b78e3ff7e 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -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"
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index aeff9240b27..f9b110912ad 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -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);
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 676fe1e092d..942c0d39c37 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -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");
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index cfd8d9f433b..a96b8209d91 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -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. */
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt
index e2222cad2ea..d5b3bd5e311 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -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")
diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript
index c5e21568220..99ff10d19eb 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -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']
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index 23b67854a83..8300582c173 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -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 */
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index b76a3e16513..9470101d455 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -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;
+
+ if((re->r.scemode & (R_NO_FRAME_UPDATE|R_PREVIEWBUTS))==0)
+ scene_update_for_newframe(re->main, re->scene, re->lay);
+
+ type->render(engine, re->scene);
+
- type->render(&engine, re->scene);
+ free_render_result(&engine->fullresult, engine->fullresult.first);
- free_render_result(&engine.fullresult, engine.fullresult.first);
+ RE_engine_free(engine);
return 1;
}
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 8fa90a51442..0fc00731d60 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -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
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 5048166c8b7..fc96c8804b2 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -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;
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index c798b284c7b..de2c593043c 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -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 */
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 5fee5fb2a57..49bb3132204 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -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 */