From 731e7e3915f35de124ab65b455316e5fd3e60585 Mon Sep 17 00:00:00 2001 From: Jens Ole Wund Date: Mon, 20 Nov 2006 22:27:05 +0000 Subject: having a nice break/esc behavior on bake other occasions like ALT_A needs that too --- source/blender/blenkernel/BKE_softbody.h | 5 +++++ source/blender/blenkernel/intern/softbody.c | 14 ++++++++++++++ source/blender/src/buttons_object.c | 23 ++++++++++++----------- 3 files changed, 31 insertions(+), 11 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h index 3ead7445c03..15200bf46f8 100644 --- a/source/blender/blenkernel/BKE_softbody.h +++ b/source/blender/blenkernel/BKE_softbody.h @@ -49,5 +49,10 @@ extern void sbObjectStep(struct Object *ob, float framnr, float (*vertexCos)[ /* makes totally fresh start situation, resets time */ extern void sbObjectToSoftbody(struct Object *ob); +/* links the softbody module to a 'test for Interrupt' function */ +/* pass NULL to unlink again */ +extern void sbSetInterruptCallBack(int (*f)(void)); + + #endif diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index 5ab2efece66..58563104d2f 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -82,6 +82,11 @@ variables on the UI for now #include "BIF_editdeform.h" #include "BIF_graphics.h" #include "PIL_time.h" + +/* callbacks for errors and interrupts and some goo */ +static int (*SB_localInterruptCallBack)(void) = NULL; + + /* ********** soft body engine ******* */ @@ -3060,6 +3065,13 @@ static int object_has_edges(Object *ob) } } +/* SB global visible functions */ +void sbSetInterruptCallBack(int (*f)(void)) +{ + SB_localInterruptCallBack = f; +} + + /* simulates one step. framenr is in frames */ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts) { @@ -3271,6 +3283,8 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts sct=PIL_check_seconds_timer(); if (sct-sst > 0.5f) printf("%3.0f%% \r",100.0f*timedone); } + if (SB_localInterruptCallBack && SB_localInterruptCallBack()) break; + } /* move snapped to final position */ interpolate_exciter(ob, 2, 2); diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index 8887c401ce0..d05c6138612 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -1384,11 +1384,12 @@ void softbody_bake(Object *ob) SoftBody *sb; ScrArea *sa; float frameleno= G.scene->r.framelen; - int cfrao= CFRA, sfra=100000, efra=0; - unsigned short event=0; - short val; + int cfrao= CFRA, sfra=100000, efra=0, didbreak =0; + G.scene->r.framelen= 1.0; // baking has to be in uncorrected time + sbSetInterruptCallBack(blender_test_break); // make softbody module ESC aware + G.afbreek=0; // init global break system if(ob) { sb= ob->soft; @@ -1427,16 +1428,14 @@ void softbody_bake(Object *ob) } } screen_swapbuffers(); - - while(qtest()) { - - event= extern_qread(&val); - if(event==ESCKEY) break; + //blender_test_break() has a granularity of 10 ms, who cares .. baking the unit cube is kinda boring + if (blender_test_break()){ + didbreak = 1; + break; } - if(event==ESCKEY) break; + } - - if(event==ESCKEY) { + if(didbreak) { if(ob) sbObjectToSoftbody(ob); // free bake else { @@ -1452,6 +1451,8 @@ void softbody_bake(Object *ob) /* restore */ waitcursor(0); + sbSetInterruptCallBack(NULL); // softbody module won't ESC + G.afbreek=0; // reset global break system if(ob) ob->softflag &= ~OB_SB_BAKEDO; -- cgit v1.2.3