[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58924] branches/soc-2012-sushi/source/ blender/blenkernel/intern/snap.c: SnapSystem: begun implementing better state and event handling for the snap system

luke frisken l.frisken at gmail.com
Mon Aug 5 07:20:10 CEST 2013


Revision: 58924
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58924
Author:   lfrisken
Date:     2013-08-05 05:20:09 +0000 (Mon, 05 Aug 2013)
Log Message:
-----------
SnapSystem: begun implementing better state and event handling for the snap system

Modified Paths:
--------------
    branches/soc-2012-sushi/source/blender/blenkernel/intern/snap.c

Modified: branches/soc-2012-sushi/source/blender/blenkernel/intern/snap.c
===================================================================
--- branches/soc-2012-sushi/source/blender/blenkernel/intern/snap.c	2013-08-05 05:13:09 UTC (rev 58923)
+++ branches/soc-2012-sushi/source/blender/blenkernel/intern/snap.c	2013-08-05 05:20:09 UTC (rev 58924)
@@ -74,6 +74,10 @@
 
 void SnapSystem_reset_snappoint(SnapSystem* ssystem);
 void SnapSystem_parallel_hack_ob_handler(SnapSystem* ssystem, void* callback_data, Object* ob); //TODO: get rid of this
+int SnapSystem_event_handler_idle(SnapSystem* ssystem, wmEvent* event);
+int SnapSystem_event_handler_init(SnapSystem* ssystem, wmEvent* event);
+int SnapSystem_event_handler_snapping(SnapSystem* ssystem, wmEvent* event);
+int SnapSystem_cancel_event(SnapSystem *ssystem);
 
 SnapStack* SnapStack_create(void);
 int SnapStack_getN_Snaps(SnapStack* sstack);
@@ -178,6 +182,7 @@
 	/*events and state machine variables*/
 	/*most are hacks to get this working for now*/
 	SnapSystem_state state;
+	int (*event_handler)(SnapSystem *ssystem,wmEvent* event);
 
 	/*used for parallel snap, perpendicular and planar snap to store user picked geometry*/
 	Snap* pick;
@@ -262,6 +267,7 @@
 	/*TODO: clean up state stuff with proper design*/
 	ssystem->retval = 0;
 	ssystem->state = SNAPSYSTEM_STATE_IDLE;
+	ssystem->event_handler=SnapSystem_event_handler_idle;
 	ssystem->pick = NULL;
 	return ssystem;
 }
@@ -605,94 +611,141 @@
   I've experimented with it a bit so far on a small scale and it makes sense, just ran out of time for this patch
   to implement it properly. That's the goal for next patch. Everything here should be a lot cleaner, and easier
   to explain with that.*/
+
+
+//TODO: just get rid of this function, I don't think it's really needed
 int SnapSystem_Event(SnapSystem* ssystem, wmEvent* event){
-	ToolSettings *ts= ssystem->scene->toolsettings;
 	//This function returns a 1 if the event was handled by this code to prevent
 	//the rest of transform code from processing the event.
 	//currently this function is just the bare bones support for parallel snap
-	int handled = 0;
 	//The interpretation of events should be over-ridable by the code which uses the
 	//snapping system, such as the pen tool.
+	return ssystem->event_handler(ssystem, event);
+}
+
+int SnapSystem_cancel_event(SnapSystem *ssystem){
+	ssystem->cancel_callback(ssystem, ssystem->callback_data);
+	ssystem->state = SNAPSYSTEM_STATE_IDLE;
+	ssystem->event_handler = SnapSystem_event_handler_idle;
+	return 1;
+}
+
+int SnapSystem_event_handler_idle(SnapSystem* ssystem, wmEvent* event){
+	ToolSettings *ts= ssystem->scene->toolsettings;
+	int handled = 0;
 	if (event->type == EVT_MODAL_MAP){
 		/*TODO: move all this keymap stuff to snap system and out of transform.h*/
 		switch(event->val){
-		case TFM_MODAL_CANCEL:
-			if(ssystem->state == SNAPSYSTEM_STATE_IDLE){
-				break; //don't cancel if it hasn't even started
-			}
-			/*stop consuming all the events*/
-			ssystem->cancel_callback(ssystem, ssystem->callback_data);
-			ssystem->state = SNAPSYSTEM_STATE_IDLE;
-			handled = 1;
-			break;
-		case TFM_MODAL_CONFIRM:
-			/*depending on state, either continue, or stop snapping and call finish_callback*/
-			if(ssystem->state == SNAPSYSTEM_STATE_IDLE){
-				break; //don't start the confirmation process if snapping hasn't started
-			}
-			SnapSystem_evaluate_stack(ssystem);
-			switch(ssystem->state){
-			case SNAPSYSTEM_STATE_SNAPPING:
+			case TFM_MODAL_SNAP_INV_ON:
+				if(ts->snap_mode == SCE_SNAP_MODE_EDGE_PARALLEL || ts->snap_mode == SCE_SNAP_MODE_PLANAR){
+					ssystem->state = SNAPSYSTEM_STATE_INIT_SNAP;
+					ssystem->event_handler = SnapSystem_event_handler_init;
+				}else{
+					ssystem->state = SNAPSYSTEM_STATE_SNAPPING;
+					ssystem->event_handler = SnapSystem_event_handler_snapping;
+				}
+				SnapSystem_evaluate_stack(ssystem);
+				handled = 1;
+				break;
+			case TFM_MODAL_SNAP_TOGGLE:
+				/*toggle consuming all events*/
+			case TFM_MODAL_AXIS_X:
+				/*IDEA: initiate special axis snap mode*/
+				break;
+			case TFM_MODAL_AXIS_Y:
+				break;
+			case TFM_MODAL_AXIS_Z:
+				break;
+			default:
+				break;
+		}
+	}
+	return handled;
+}
+
+int SnapSystem_event_handler_init(SnapSystem *ssystem, wmEvent* event){
+	int handled = 0;
+	if (event->type == EVT_MODAL_MAP){
+		/*TODO: move all this keymap stuff to snap system and out of transform.h*/
+		switch(event->val){
+			case TFM_MODAL_CANCEL:
+				/*stop consuming all the events*/
+				ssystem->cancel_callback(ssystem, ssystem->callback_data);
 				ssystem->state = SNAPSYSTEM_STATE_IDLE;
-				ssystem->finish_callback(ssystem, ssystem->callback_data, ssystem->snap_point);
+				ssystem->event_handler = SnapSystem_event_handler_idle;
 				handled = 1;
 				break;
-			case SNAPSYSTEM_STATE_INIT_SNAP:
+			case TFM_MODAL_CONFIRM:
+				/*depending on state, either continue, or stop snapping and call finish_callback*/
+				SnapSystem_evaluate_stack(ssystem);
+				//if we managed to pick something
 				if(ssystem->retval){
 					ssystem->state = SNAPSYSTEM_STATE_SNAPPING;
+					ssystem->event_handler = SnapSystem_event_handler_snapping;
 					ssystem->retval = 0; //reset retval after having used hack function to do the grunt work
 				}
 				handled = 1;
 				break;
+			case TFM_MODAL_SNAP_INV_OFF:
+				/*stop consuming all the events*/
+				handled = SnapSystem_cancel_event(ssystem);
+				SnapStack_reset(ssystem->sstack);
+				break;
 			default:
+				SnapSystem_evaluate_stack(ssystem);
+				handled = 1;
 				break;
-			}
-			break; //probably needs to change this bit!
-		case TFM_MODAL_SNAP_INV_ON:
-			/*start consuming all the events*/
-			if(ts->snap_mode == SCE_SNAP_MODE_EDGE_PARALLEL || ts->snap_mode == SCE_SNAP_MODE_PLANAR){
-				ssystem->state = SNAPSYSTEM_STATE_INIT_SNAP;
-			}else{
-				ssystem->state = SNAPSYSTEM_STATE_SNAPPING;
-			}
-			handled = 1;
+		}
+	}else if (event->val == KM_PRESS){
+		switch(event->type){
+		case RIGHTMOUSE:
+			handled = SnapSystem_cancel_event(ssystem);
 			break;
-		case TFM_MODAL_SNAP_INV_OFF:
-			if(ssystem->state == SNAPSYSTEM_STATE_IDLE){
-				break; //don't stop if it hasn't started
-			}
-			/*stop consuming all the events*/
-			ssystem->cancel_callback(ssystem, ssystem->callback_data);
-			SnapStack_reset(ssystem->sstack);
-			ssystem->state = SNAPSYSTEM_STATE_IDLE;
+		default:
+			SnapSystem_evaluate_stack(ssystem);
 			handled = 1;
 			break;
-		case TFM_MODAL_SNAP_TOGGLE:
-			/*toggle consuming all events*/
-		case TFM_MODAL_AXIS_X:
-			/*IDEA: initiate special axis snap mode*/
-			break;
-		case TFM_MODAL_AXIS_Y:
-			break;
-		case TFM_MODAL_AXIS_Z:
-			break;
 		}
-	} else if (event->val == KM_PRESS){
+	}
+	return handled;
+}
+
+int SnapSystem_event_handler_snapping(SnapSystem *ssystem, wmEvent* event){
+	int handled = 0;
+	if (event->type == EVT_MODAL_MAP){
+		/*TODO: move all this keymap stuff to snap system and out of transform.h*/
+		switch(event->val){
+			case TFM_MODAL_CANCEL:
+				/*stop consuming all the events*/
+				handled = SnapSystem_cancel_event(ssystem);
+				break;
+			case TFM_MODAL_CONFIRM:
+				/*depending on state, either continue, or stop snapping and call finish_callback*/
+				SnapSystem_evaluate_stack(ssystem);
+				ssystem->state = SNAPSYSTEM_STATE_IDLE;
+				ssystem->event_handler = SnapSystem_event_handler_idle;
+				ssystem->finish_callback(ssystem, ssystem->callback_data, ssystem->snap_point);
+				handled = 1;
+				break;
+			case TFM_MODAL_SNAP_INV_OFF:
+				/*stop consuming all the events*/
+				handled = SnapSystem_cancel_event(ssystem);
+				SnapStack_reset(ssystem->sstack);
+				break;
+			default:
+				break;
+		}
+	}else if (event->val == KM_PRESS){
 		switch(event->type){
 		case RIGHTMOUSE:
-			if(ssystem->state == SNAPSYSTEM_STATE_IDLE){
-				break; //don't cancel if it hasn't started
-			}
-			ssystem->cancel_callback(ssystem, ssystem->callback_data);
-			ssystem->state = SNAPSYSTEM_STATE_IDLE;
+			handled = SnapSystem_cancel_event(ssystem);
+			break;
+		default:
+			SnapSystem_evaluate_stack(ssystem);
 			handled = 1;
 			break;
 		}
 	}
-	if(ssystem->state != SNAPSYSTEM_STATE_IDLE){
-		SnapSystem_evaluate_stack(ssystem);
-		handled = 1;
-	}
 	return handled;
 }
 




More information about the Bf-blender-cvs mailing list