[Bf-blender-cvs] [4e4c1a0] wiggly-widgets: Support undo. Scale stays same for non-3D widgets
Antony Riakiotakis
noreply at git.blender.org
Fri Nov 7 18:13:07 CET 2014
Commit: 4e4c1a0ea05d31680c5c4ea2dfdc863d3cb06157
Author: Antony Riakiotakis
Date: Thu Nov 6 12:11:38 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB4e4c1a0ea05d31680c5c4ea2dfdc863d3cb06157
Support undo. Scale stays same for non-3D widgets
===================================================================
M source/blender/blenkernel/intern/blender.c
M source/blender/editors/include/ED_transform.h
M source/blender/editors/space_view3d/space_view3d.c
M source/blender/editors/transform/transform_manipulator.c
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/intern/wm_generic_widgets.c
M source/blender/windowmanager/intern/wm_widgets.c
M source/blender/windowmanager/wm.h
===================================================================
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index adfe43c..af641460 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -616,6 +616,9 @@ static int read_undosave(bContext *C, UndoElem *uel)
else
success = BKE_read_file_from_memfile(C, &uel->memfile, NULL);
+ /* when reading from memory all references get invalidated so invalidate all widgets */
+ WM_widgetgroups_invalidate();
+
/* restore */
BLI_strncpy(G.main->name, mainstr, sizeof(G.main->name)); /* restore */
G.fileflags = fileflags;
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index c650f24..c66e04d 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -170,8 +170,8 @@ int WIDGET_manipulator_handler(struct bContext *C, const struct wmEvent *event,
int WIDGET_manipulator_handler_trans(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *ptr);
int WIDGET_manipulator_handler_rot(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *ptr);
-void WIDGET_manipulator_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, float scale, int selectionbase);
-void WIDGET_manipulator_draw(struct wmWidget *widget, const struct bContext *C, float scale);
+void WIDGET_manipulator_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, int selectionbase);
+void WIDGET_manipulator_draw(struct wmWidget *widget, const struct bContext *C);
bool WIDGETGROUP_manipulator_poll(struct wmWidgetGroup *wgroup, const struct bContext *C);
void WIDGETGROUP_manipulator_update(struct wmWidgetGroup *wgroup, const struct bContext *C);
void WIDGETGROUP_manipulator_free(struct wmWidgetGroup *wgroup);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index c15b406..925bbe2 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -741,7 +741,7 @@ static void view3d_widgets(void)
WIDGET_dial_set_color(manipulator->rotate_z, color_blue);
WM_widget_register(wgroup_manipulator, manipulator->rotate_z);
- widget = WIDGET_arrow_new(0, NULL, NULL, NULL, NULL);
+ widget = WIDGET_arrow_new(UI_ARROW_STYLE_INVERTED, NULL, NULL, NULL, NULL);
WM_widget_register(wgroup_light, widget);
WIDGET_arrow_set_color(widget, color_lamp);
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index a2fe94b..68311b8 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1655,7 +1655,7 @@ static int manipulator_flags_from_active(int active)
return val;
}
-void WIDGET_manipulator_draw(wmWidget *UNUSED(widget), const bContext *C, float UNUSED(scale))
+void WIDGET_manipulator_draw(wmWidget *UNUSED(widget), const bContext *C)
{
ScrArea *sa = CTX_wm_area(C);
ARegion *ar = CTX_wm_region(C);
@@ -1813,7 +1813,7 @@ bool WIDGETGROUP_manipulator_poll(wmWidgetGroup *UNUSED(wgroup), const struct bC
return ((v3d->twflag & V3D_USE_MANIPULATOR) != 0);
}
-void WIDGET_manipulator_render_3d_intersect(const bContext *C, wmWidget *UNUSED(widget), float UNUSED(scale), int selectionbase)
+void WIDGET_manipulator_render_3d_intersect(const bContext *C, wmWidget *UNUSED(widget), int selectionbase)
{
ScrArea *sa = CTX_wm_area(C);
View3D *v3d = sa->spacedata.first;
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 4794292..6a8f2d3 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -471,8 +471,8 @@ struct wmWidgetGroup *WM_widgetgroup_new(bool (*poll)(struct wmWidgetGroup *, co
void (*free)(struct wmWidgetGroup *),
void *customdata);
-struct wmWidget *WM_widget_new(void (*draw)(struct wmWidget *, const struct bContext *, float scale),
- void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, float, int),
+struct wmWidget *WM_widget_new(void (*draw)(struct wmWidget *, const struct bContext *),
+ void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, int),
int (*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget *customdata),
int (*initialize_op)(struct bContext *, const struct wmEvent *, struct wmWidget *, struct PointerRNA *),
int (*handler)(struct bContext *, const struct wmEvent *, struct wmWidget *, struct wmOperator *op),
@@ -495,6 +495,8 @@ ListBase *WM_widgetgroup_widgets(struct wmWidgetGroup *wgroup);
bool WM_widgetgroup_register(struct wmWidgetMap *wmap, struct wmWidgetGroup *wgroup);
void WM_widgetgroup_unregister(struct wmWidgetMap *wmap, struct wmWidgetGroup *wgroup);
+void WM_widgetgroups_invalidate(void);
+
struct wmWidgetMap *WM_widgetmap_find(const char *idname, int spaceid, int regionid, bool is_3d);
void WM_widgetmaps_free(void);
@@ -503,6 +505,7 @@ void WM_widgetmaps_free(void);
enum {
UI_ARROW_STYLE_NORMAL = 0,
UI_ARROW_STYLE_NO_AXIS = 1,
+ UI_ARROW_STYLE_INVERTED = 2,
};
enum {
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 760f30c..f7fca23 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -81,7 +81,7 @@ typedef struct WidgetDrawInfo {
} WidgetDrawInfo;
-WidgetDrawInfo arraw_draw_info = {0};
+WidgetDrawInfo arraw_head_draw_info = {0};
WidgetDrawInfo dial_draw_info = {0};
static void widget_draw_intern(WidgetDrawInfo *info, bool select)
@@ -161,7 +161,7 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
if (arrow->widget.prop) {
copy_v3_v3(final_pos, arrow->direction);
- mul_v3_fl(final_pos, RNA_property_float_get(arrow->widget.ptr, arrow->widget.prop));
+ mul_v3_fl(final_pos, scale * RNA_property_float_get(arrow->widget.ptr, arrow->widget.prop));
add_v3_v3(final_pos, arrow->widget.origin);
}
else {
@@ -181,15 +181,23 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
else
glColor4fv(arrow->color);
- widget_draw_intern(&arraw_draw_info, select);
+ widget_draw_intern(&arraw_head_draw_info, select);
glPopMatrix();
if (arrow->widget.interaction_data) {
ArrowInteraction *data = arrow->widget.interaction_data;
+ if (arrow->widget.prop) {
+ copy_v3_v3(final_pos, arrow->direction);
+ mul_v3_fl(final_pos, scale * data->orig_value);
+ add_v3_v3(final_pos, arrow->widget.origin);
+ }
+ else {
+ copy_v3_v3(final_pos, arrow->widget.origin);
+ }
copy_m4_m3(mat, rot);
- copy_v3_v3(mat[3], data->orig_origin);
+ copy_v3_v3(mat[3], final_pos);
mul_mat3_m4_fl(mat, scale);
glPushMatrix();
@@ -197,22 +205,22 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
glEnable(GL_BLEND);
glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
- widget_draw_intern(&arraw_draw_info, select);
+ widget_draw_intern(&arraw_head_draw_info, select);
glDisable(GL_BLEND);
glPopMatrix();
}
}
-static void widget_arrow_render_3d_intersect(const struct bContext *UNUSED(C), struct wmWidget *widget, float scale, int selectionbase)
+static void widget_arrow_render_3d_intersect(const struct bContext *UNUSED(C), struct wmWidget *widget, int selectionbase)
{
GPU_select_load_id(selectionbase);
- arrow_draw_intern((ArrowWidget *)widget, true, false, scale);
+ arrow_draw_intern((ArrowWidget *)widget, true, false, widget->scale);
}
-static void widget_arrow_draw(struct wmWidget *widget, const struct bContext *UNUSED(C), float scale)
+static void widget_arrow_draw(struct wmWidget *widget, const struct bContext *UNUSED(C))
{
- arrow_draw_intern((ArrowWidget *)widget, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0, scale);
+ arrow_draw_intern((ArrowWidget *)widget, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0, widget->scale);
}
static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct wmOperator *op)
@@ -297,25 +305,16 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event,
static int widget_arrow_activate(struct bContext *UNUSED(C), const struct wmEvent *event, struct wmWidget *widget, int state)
{
if (state == WIDGET_ACTIVATE) {
- ArrowWidget *arrow = (ArrowWidget *)widget;
ArrowInteraction *data = MEM_callocN(sizeof (ArrowInteraction), "arrow_interaction");
- float final_pos[3];
if (widget->prop) {
- float val = RNA_property_float_get(widget->ptr, widget->prop);
- copy_v3_v3(final_pos, arrow->direction);
- mul_v3_fl(final_pos, RNA_property_float_get(widget->ptr, widget->prop));
- add_v3_v3(final_pos, widget->origin);
- data->orig_value = val;
- }
- else {
- copy_v3_v3(final_pos, widget->origin);
+ data->orig_value = RNA_property_float_get(widget->ptr, widget->prop);
}
data->orig_mouse[0] = event->mval[0];
data->orig_mouse[1] = event->mval[1];
- copy_v3_v3(data->orig_origin, final_pos);
+ copy_v3_v3(data->orig_origin, widget->origin);
widget->interaction_data = data;
}
@@ -334,13 +333,13 @@ wmWidget *WIDGET_arrow_new(int style,
float dir_default[3] = {0.0f, 0.0f, 1.0f};
ArrowWidget *arrow;
- if (!arraw_draw_info.init) {
- arraw_draw_info.nverts = _WIDGET_nverts_arrow,
- arraw_draw_info.ntris = _WIDGET_ntris_arrow,
- arraw_draw_info.verts = _WIDGET_verts_arrow,
- arraw_draw_info.normals = _WIDGET_normals_arrow,
- arraw_draw_info.indices = _WIDGET_indices_arrow,
- arraw_draw_info.init = true;
+ if (!arraw_head_draw_info.init) {
+ arraw_head_draw_info.nverts = _WIDGET_nverts_arrow,
+ arraw_head_draw_info.ntris = _WIDGET_ntris_arrow,
+ ar
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list