[Bf-committers] New circle select callback executer

Ton Roosendaal ton at blender.org
Thu Apr 28 20:04:08 CEST 2005


Hi,

I see the issue, which is an overload of the event queue. However, that  
problem should be solved by preventing the overload itself, which can  
be done by simply adding a

	while(qtest()) {

	}

around the queue reading chunk. That emtpies the queue before going to  
a next selection and draw.

I'll commit this.

-Ton-


On 24 Apr, 2005, at 9:07, joeedh wrote:

> Hi, I've noticed that the current circle select callback  
> executer-function is. . . bad.  More specifically, its vulnerable to  
> overloads in the event queue.  You select, and if you declick the  
> mouse it will still select or a few moments afterward.
>
> As such, I've rewritten it into a fixed-time system, that seems to  
> work much, much better.
>
> patch from inside the blender/ base dir (not below it, and not  
> source/blender).
>
> joeedh
> Index: source/blender/src/edit.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/src/edit.c,v
> retrieving revision 1.62
> diff -u -r1.62 edit.c
> --- source/blender/src/edit.c	12 Apr 2005 11:53:46 -0000	1.62
> +++ source/blender/src/edit.c	24 Apr 2005 06:54:02 -0000
> @@ -390,16 +390,17 @@
>    * but the selection actions are defined by a callback, making
>    * it (hopefully) reusable for other windows than the 3D view.
>    */
> -
> +#include "time.h"
>  void circle_selectCB(select_CBfunc callback)
>  {
>  	static float rad= 40.0;
>  	float rado;
>  	int firsttime=1;
> +	double stime, ttime;
>  	unsigned short event;
>  	short mvalo[2], mval[2], val;
> -	short selecting=0;
>  	Object *obj;
> +	short selecting=0, die=0;
>  	
>  	if(G.obedit) obj = G.obedit;
>  	else obj = OBACT;
> @@ -412,66 +413,61 @@
>  	draw_sel_circle(mval, NULL, rad, 0.0, selecting); // draws  
> frontbuffer, but sets backbuf again
>  	
>  	rado= rad;
> +	/*clear event queue*/
> +	while (qtest()) {
> +		event = extern_qread(&val);
> +	}
>  	
> -	while(TRUE) {
> -		
> -		if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || rado!=rad ||  
> firsttime) {
> -			firsttime= 0;
> +	/*enter time-controlled loop*/
> +	stime = (float)clock() / CLOCKS_PER_SEC;
> +	ttime = stime;
> +	while (!die) { /*we break-out of the loop*/
> +		if (stime-ttime > 0.009) {
> +			getmouseco_areawin(mval);
> +			if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || rado!=rad ||  
> firsttime) {
> +				firsttime= 0;
>  			
> -			if(selecting) {
> -				callback(selecting, obj, mval, rad);
> -			}
> +				if(selecting) {
> +					callback(selecting, obj, mval, rad);
> +				}
>
> -			draw_sel_circle(mval, mvalo, rad, rado, selecting);
> -		
> -			mvalo[0]= mval[0];
> -			mvalo[1]= mval[1];
> -			rado= rad;
> -
> -		}
> +				draw_sel_circle(mval, mvalo, rad, rado, selecting);
>  		
> -		event= extern_qread(&val);
> -		if (event) {
> -			int afbreek= 0;
> +				mvalo[0]= mval[0];
> +				mvalo[1]= mval[1];
> +				rado= rad;
>
> -			/* for when another window is open and a mouse cursor activates it  
> */
> -			if(event!=MOUSEY && event!=MOUSEX) mywinset(curarea->win);
> -			
> -			getmouseco_areawin(mval);	// important to do here, trust events!
> -			
> -			switch(event) {
> +			}
> +			while (qtest()) {
> +				event = extern_qread(&val);
> +				ttime = (float)clock() / CLOCKS_PER_SEC;
> +				switch (event) {
> +					case LEFTMOUSE:
> +					case MIDDLEMOUSE:
> +						if (val) selecting = event;
> +						else selecting = 0;
> +						break;
> +					case WHEELDOWNMOUSE:
> +					case PADPLUSKEY:
> +					case EQUALKEY:
> +						if(val) if(rad<200.0) rad*= 1.2;
> +						break;
> +					case WHEELUPMOUSE:
> +					case PADMINUS:
> +					case MINUSKEY:
> +						if(val) if(rad>5.0) rad/= 1.2;
> +						break;
> +					
> +					case ESCKEY: case SPACEKEY: case RIGHTMOUSE: case INPUTCHANGE:
> +					case GKEY: case SKEY: case RKEY: case XKEY: case EKEY: case  
> TABKEY:
> +						die= 1;
> +						break;
>  		
> -			case LEFTMOUSE:
> -			case MIDDLEMOUSE:
> -				if(val) selecting= event;
> -				else selecting= 0;
> -				firsttime= 1;
> -				
> -				break;
> -			case WHEELDOWNMOUSE:
> -			case PADPLUSKEY:
> -			case EQUALKEY:
> -				if(val) if(rad<200.0) rad*= 1.2;
> -				break;
> -			case WHEELUPMOUSE:
> -			case PADMINUS:
> -			case MINUSKEY:
> -				if(val) if(rad>5.0) rad/= 1.2;
> -				break;
> -			
> -			case ESCKEY: case SPACEKEY: case RIGHTMOUSE: case INPUTCHANGE:
> -			case GKEY: case SKEY: case RKEY: case XKEY: case EKEY: case TABKEY:
> -				afbreek= 1;
> -				break;
> -
> +				}
>  			}
> -			
> -			if(afbreek) break;
>  		}
> -		else PIL_sleep_ms(10);
> +		stime = (float)clock() / CLOCKS_PER_SEC;
>  	}
> -	
> -	/* clear circle */
>  	draw_sel_circle(NULL, mvalo, 0, rad, 1);
>  	BIF_undo_push("Circle Select");
>  	countall();
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at projects.blender.org
> http://projects.blender.org/mailman/listinfo/bf-committers
>
------------------------------------------------------------------------ 
--
Ton Roosendaal  Blender Foundation ton at blender.org  
http://www.blender.org



More information about the Bf-committers mailing list