[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26590] trunk/blender/source/blender/ editors/transform: New Transform 3D view recalculate scheme.

Martin Poirier theeth at yahoo.com
Wed Feb 3 22:01:43 CET 2010


Revision: 26590
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26590
Author:   theeth
Date:     2010-02-03 22:01:41 +0100 (Wed, 03 Feb 2010)

Log Message:
-----------
New Transform 3D view recalculate scheme.

Only recalculate changes when absolutely necessary (mouse move triggers a soft recalc that will only happen before the next redraw other events trigger hard recalcs). The problem was that mouse moves are reported as lots of events (with small dx,dy) between each redraw which would trigger often heavy recalculations every time while only the last one was really important (the one before the redraw).

This makes snap project (retopo) much more manageable but induces a very small lag equal to one refresh cycle. Confirming transform does a hard refresh, so the final result is always consistent with mouse position.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/editors/transform/transform_input.c

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c	2010-02-03 20:49:05 UTC (rev 26589)
+++ trunk/blender/source/blender/editors/transform/transform.c	2010-02-03 21:01:41 UTC (rev 26590)
@@ -122,6 +122,8 @@
 
 #include "transform.h"
 
+void drawTransformApply(const struct bContext *C, struct ARegion *ar, void *arg);
+
 /* ************************** SPACE DEPENDANT CODE **************************** */
 
 void setTransformViewMatrices(TransInfo *t)
@@ -297,7 +299,7 @@
 	}
 }
 
-static void viewRedrawForce(bContext *C, TransInfo *t)
+static void viewRedrawForce(const bContext *C, TransInfo *t)
 {
 	if (t->spacetype == SPACE_VIEW3D)
 	{
@@ -546,7 +548,7 @@
 		t->mval[0] = event->x - t->ar->winrct.xmin;
 		t->mval[1] = event->y - t->ar->winrct.ymin;
 
-		t->redraw = 1;
+		t->redraw |= TREDRAW_SOFT;
 
 		if (t->state == TRANS_STARTING) {
 		    t->state = TRANS_RUNNING;
@@ -571,7 +573,7 @@
 					restoreTransObjects(t);
 					initTranslation(t);
 					initSnapping(t, NULL); // need to reinit after mode change
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case TFM_MODAL_ROTATE:
@@ -589,7 +591,7 @@
 						initRotation(t);
 					}
 					initSnapping(t, NULL); // need to reinit after mode change
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case TFM_MODAL_RESIZE:
@@ -599,21 +601,21 @@
 					restoreTransObjects(t);
 					initResize(t);
 					initSnapping(t, NULL); // need to reinit after mode change
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 				
 			case TFM_MODAL_SNAP_INV_ON:
 				t->modifiers |= MOD_SNAP_INVERT;
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 				break;
 			case TFM_MODAL_SNAP_INV_OFF:
 				t->modifiers &= ~MOD_SNAP_INVERT;
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 				break;
 			case TFM_MODAL_SNAP_TOGGLE:
 				t->modifiers ^= MOD_SNAP;
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 				break;
 			case TFM_MODAL_AXIS_X:
 				if ((t->flag & T_NO_CONSTRAINT)==0) {
@@ -628,7 +630,7 @@
 							setUserConstraint(t, t->current_orientation, (CON_AXIS0), "along %s X");
 						}
 					}
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case TFM_MODAL_AXIS_Y:
@@ -644,7 +646,7 @@
 							setUserConstraint(t, t->current_orientation, (CON_AXIS1), "along %s Y");
 						}
 					}
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case TFM_MODAL_AXIS_Z:
@@ -655,7 +657,7 @@
 					else {
 						setUserConstraint(t, t->current_orientation, (CON_AXIS2), "along %s Z");
 					}
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case TFM_MODAL_PLANE_X:
@@ -666,7 +668,7 @@
 					else {
 						setUserConstraint(t, t->current_orientation, (CON_AXIS1|CON_AXIS2), "locking %s X");
 					}
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case TFM_MODAL_PLANE_Y:
@@ -677,7 +679,7 @@
 					else {
 						setUserConstraint(t, t->current_orientation, (CON_AXIS0|CON_AXIS2), "locking %s Y");
 					}
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case TFM_MODAL_PLANE_Z:
@@ -688,22 +690,22 @@
 					else {
 						setUserConstraint(t, t->current_orientation, (CON_AXIS0|CON_AXIS1), "locking %s Z");
 					}
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case TFM_MODAL_CONS_OFF:
 				if ((t->flag & T_NO_CONSTRAINT)==0) {
 					stopConstraint(t);
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case TFM_MODAL_ADD_SNAP:
 				addSnapPoint(t);
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 				break;
 			case TFM_MODAL_REMOVE_SNAP:
 				removeSnapPoint(t);
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 				break;
 			default:
 				handled = 0;
@@ -723,7 +725,7 @@
 		case LEFTSHIFTKEY:
 		case RIGHTSHIFTKEY:
 			t->modifiers |= MOD_CONSTRAINT_PLANE;
-			t->redraw = 1;
+			t->redraw |= TREDRAW_HARD;
 			break;
 
 		case SPACEKEY:
@@ -771,7 +773,7 @@
 						postSelectConstraint(t);
 					}
 				}
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 		case ESCKEY:
@@ -788,7 +790,7 @@
 				restoreTransObjects(t);
 				initTranslation(t);
 				initSnapping(t, NULL); // need to reinit after mode change
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 		case SKEY:
@@ -798,7 +800,7 @@
 				restoreTransObjects(t);
 				initResize(t);
 				initSnapping(t, NULL); // need to reinit after mode change
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 		case RKEY:
@@ -816,7 +818,7 @@
 					initRotation(t);
 				}
 				initSnapping(t, NULL); // need to reinit after mode change
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 		case CKEY:
@@ -828,7 +830,7 @@
 			}
 			else {
 				stopConstraint(t);
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 		case XKEY:
@@ -857,7 +859,7 @@
 							setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS1|CON_AXIS2), "locking %s X");
 					}
 				}
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 		case YKEY:
@@ -886,7 +888,7 @@
 							setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0|CON_AXIS2), "locking %s Y");
 					}
 				}
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 		case ZKEY:
@@ -907,14 +909,14 @@
 					else if (t->modifiers & MOD_CONSTRAINT_PLANE)
 						setUserConstraint(t, V3D_MANIP_GLOBAL, (CON_AXIS0|CON_AXIS1), "locking %s Z");
 				}
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 		case OKEY:
 			if (t->flag & T_PROP_EDIT && event->shift) {
 				t->prop_mode = (t->prop_mode + 1) % 6;
 				calculatePropRatio(t);
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 		case PADPLUSKEY:
@@ -985,7 +987,7 @@
 				else
 				{
 					/* Otherwise, just redraw, NDof input was cancelled */
-					t->redraw = 1;
+					t->redraw |= TREDRAW_HARD;
 				}
 				break;
 			case NDOF_NOMOVE:
@@ -996,7 +998,7 @@
 				}
 				break;
 			case NDOF_REFRESH:
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 				break;
 			default:
 				handled = 0;
@@ -1013,14 +1015,14 @@
 		case LEFTSHIFTKEY:
 		case RIGHTSHIFTKEY:
 			t->modifiers &= ~MOD_CONSTRAINT_PLANE;
-			t->redraw = 1;
+			t->redraw |= TREDRAW_HARD;
 			break;
 
 		case MIDDLEMOUSE:
 			if ((t->flag & T_NO_CONSTRAINT)==0) {
 				t->modifiers &= ~MOD_CONSTRAINT_SELECT;
 				postSelectConstraint(t);
-				t->redraw = 1;
+				t->redraw |= TREDRAW_HARD;
 			}
 			break;
 //		case LEFTMOUSE:
@@ -1456,6 +1458,7 @@
 		//calc_manipulator_stats(curarea);
 		initTransformOrientation(C, t);
 
+		t->draw_handle_apply = ED_region_draw_cb_activate(t->ar->type, drawTransformApply, t, REGION_DRAW_PRE_VIEW);
 		t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
 		//t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
 		t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), NULL, drawHelpline, t);
@@ -1627,16 +1630,18 @@
 	return 1;
 }
 
-void transformApply(bContext *C, TransInfo *t)
+void transformApply(const bContext *C, TransInfo *t)
 {
-	if (t->redraw)
+	if ((t->redraw & TREDRAW_HARD) || (t->draw_handle_apply == NULL && (t->redraw & TREDRAW_SOFT)))
 	{
 		selectConstraint(t);
 		if (t->transform) {
 			t->transform(t, t->mval);  // calls recalcData()
 			viewRedrawForce(C, t);
 		}
-		t->redraw = 0;
+		t->redraw = TREDRAW_NOTHING;
+	} else if (t->redraw & TREDRAW_SOFT) {
+		viewRedrawForce(C, t);
 	}
 
 	/* If auto confirm is on, break after one pass */
@@ -1649,10 +1654,20 @@
 	{
 		// TRANSFORM_FIX_ME
 		//do_screenhandlers(G.curscreen);
-		t->redraw = 1;
+		t->redraw |= TREDRAW_HARD;
 	}
 }
 
+void drawTransformApply(const struct bContext *C, struct ARegion *ar, void *arg)
+{
+	TransInfo *t = arg;
+
+	if (t->redraw & TREDRAW_SOFT) {
+		t->redraw |= TREDRAW_HARD;
+		transformApply(C, t);
+	}
+}
+
 int transformEnd(bContext *C, TransInfo *t)
 {
 	int exit_code = OPERATOR_RUNNING_MODAL;

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h	2010-02-03 20:49:05 UTC (rev 26589)
+++ trunk/blender/source/blender/editors/transform/transform.h	2010-02-03 21:01:41 UTC (rev 26590)
@@ -325,6 +325,7 @@
 	struct wmTimer *animtimer;
     short       mval[2];        /* current mouse position               */
     struct Object   *obedit;
+    void		*draw_handle_apply;
     void		*draw_handle_view;
     void		*draw_handle_pixel;
     void		*draw_handle_cursor;
@@ -349,6 +350,12 @@
 #define TRANS_CONFIRM	2
 #define TRANS_CANCEL	3
 
+/* transinfo->redraw */
+#define TREDRAW_NOTHING  	0
+#define TREDRAW_HARD		1
+#define TREDRAW_SOFT		2
+
+
 /* transinfo->flag */
 #define T_OBJECT		(1 << 0)
 #define T_EDIT			(1 << 1)
@@ -440,7 +447,7 @@
 int initTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op, struct wmEvent *event, int mode);
 void saveTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op);
 int  transformEvent(TransInfo *t, struct wmEvent *event);
-void transformApply(struct bContext *C, TransInfo *t);
+void transformApply(const struct bContext *C, TransInfo *t);
 int  transformEnd(struct bContext *C, TransInfo *t);
 
 void setTransformViewMatrices(TransInfo *t);

Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c	2010-02-03 20:49:05 UTC (rev 26589)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c	2010-02-03 21:01:41 UTC (rev 26590)
@@ -1072,6 +1072,8 @@
 	
 	if (t->draw_handle_view)
 		ED_region_draw_cb_exit(t->ar->type, t->draw_handle_view);
+	if (t->draw_handle_apply)
+		ED_region_draw_cb_exit(t->ar->type, t->draw_handle_apply);
 	if (t->draw_handle_pixel)
 		ED_region_draw_cb_exit(t->ar->type, t->draw_handle_pixel);
 	if (t->draw_handle_cursor)

Modified: trunk/blender/source/blender/editors/transform/transform_input.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_input.c	2010-02-03 20:49:05 UTC (rev 26589)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list