diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-04-02 17:43:56 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-04-02 17:43:56 +0400 |
commit | 70540fca3bfa90d21531c84e42aa7a4f74b52826 (patch) | |
tree | 76f2c208a472e2014b4a2bcaabe28c1dee2793f2 /source | |
parent | e27fbba217d768701241598ba072b703060da225 (diff) |
bugfix [#21230] set-scene animation updates not working
fix for empty scenes with SETLOOPER macro.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_scene.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 23 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_BlenderDataConversion.cpp | 2 |
3 files changed, 26 insertions, 4 deletions
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index 09fb705dd70..090979b33e9 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -47,9 +47,8 @@ struct Main; #define SCE_COPY_LINK_DATA 2 #define SCE_COPY_FULL 3 -/* note; doesn't work when scene is empty */ -#define SETLOOPER(s, b) sce= s, b= (Base*)sce->base.first; b; b= (Base*)(b->next?b->next:sce->set?(sce=sce->set)->base.first:NULL) - +#define SETLOOPER(s, b) sce= s, b= _setlooper_base_step(&sce, NULL); b; b= _setlooper_base_step(&sce, b) +struct Base *_setlooper_base_step(struct Scene **sce, struct Base *base); void free_avicodecdata(struct AviCodecData *acd); void free_qtcodecdata(struct QuicktimeCodecData *acd); diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index a494d947953..c258f2d47b7 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1051,3 +1051,26 @@ float get_render_aosss_error(RenderData *r, float error) return error; } +/* helper function for the SETLOOPER macro */ +Base *_setlooper_base_step(Scene **sce, Base *base) +{ + if(base && base->next) { + /* common case, step to the next */ + return base->next; + } + else if(base==NULL && (*sce)->base.first) { + /* first time looping, return the scenes first base */ + return (Base *)(*sce)->base.first; + } + else { + /* reached the end, get the next base in the set */ + while((*sce= (*sce)->set)) { + base= (Base *)(*sce)->base.first; + if(base) { + return base; + } + } + } + + return NULL; +} diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 945ab2678d8..d8484559d91 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -88,7 +88,6 @@ #include "BKE_main.h" #include "BKE_global.h" #include "BKE_object.h" -#include "BKE_scene.h" #include "BL_ModifierDeformer.h" #include "BL_ShapeDeformer.h" #include "BL_SkinDeformer.h" @@ -138,6 +137,7 @@ #include "BLI_math.h" extern "C" { +#include "BKE_scene.h" #include "BKE_customdata.h" #include "BKE_cdderivedmesh.h" #include "BKE_DerivedMesh.h" |