[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