Setchain: it allows you to chain sets. It checks for loops when trying
to assign new scene, and will notify if changing set would create a loop.
This commit is contained in:
Nathan Letwory 2006-01-06 12:37:45 +00:00
parent 4a641caddd
commit 50e26b7637
5 changed files with 78 additions and 14 deletions

@ -291,6 +291,7 @@ void copy_displist(ListBase *lbn, ListBase *lb)
static void initfastshade(void)
{
Base *base;
Scene *setscene;
Object *ob;
Lamp *la;
FastLamp *fl;
@ -309,7 +310,7 @@ static void initfastshade(void)
Mat4Invert(fviewmat, R.viewinv);
/* initrendertexture(); */
setscene = G.scene->set;
base= G.scene->base.first;
while(base) {
ob= base->object;
@ -349,8 +350,12 @@ static void initfastshade(void)
fl->b= la->energy*la->b;
}
if(base->next==0 && G.scene->set && base==G.scene->base.last) base= G.scene->set->base.first;
else base= base->next;
if(base->next==0 && setscene && setscene->set) {/*if(base->next==0 && G.scene->set && base==G.scene->base.last) {*/
setscene = setscene->set;
base= setscene->base.first; /* base= G.scene->set->base.first;*/
} else {
base= base->next;
}
}
}

@ -321,7 +321,7 @@ typedef struct Scene {
/* none of the dependancy graph vars is mean to be saved */
struct DagForest *theDag;
short dagisvalid, dagflags;
int pad1;
int dirty;
} Scene;
@ -448,6 +448,10 @@ typedef struct Scene {
#define SCE_SELECT_EDGE 2
#define SCE_SELECT_FACE 4
/* sce->dirty */
#define SCE_CLEAN 0
#define SCE_DIRTY 1
/* sce->prop_mode (proportional falloff) */
#define PROP_SMOOTH 0
#define PROP_SPHERE 1

@ -2761,7 +2761,7 @@ void RE_rotateBlenderScene(void)
{
Base *base;
Object *ob, *obd;
Scene *sce;
Scene *sce, *setscene;
unsigned int lay;
float mat[4][4];
@ -2827,7 +2827,7 @@ void RE_rotateBlenderScene(void)
}
sce= G.scene;
setscene= G.scene->set;
base= G.scene->base.first;
while(base) {
@ -2943,11 +2943,17 @@ void RE_rotateBlenderScene(void)
}
if(blender_test_break()) break;
if(base->next==0 && G.scene->set && base==G.scene->base.last) {
base= base->next;
if(base==0 && setscene) {
sce= setscene;
base= setscene->base.first;
setscene= setscene->set;
}
/*if(base->next==0 && G.scene->set && base==G.scene->base.last) {
base= G.scene->set->base.first;
sce= G.scene->set;
}
else base= base->next;
else base= base->next;*/
}

@ -457,10 +457,46 @@ static void ftype_pic(char *name)
allqueue(REDRAWBUTSSCENE, 0);
}
static void scene_chain_cleanup(Scene *sc) {
while(sc) {
sc->dirty = SCE_CLEAN;
sc = sc->set;
}
}
static void scene_change_set(Scene *sc, Scene *set) {
Scene *scene = G.main->scene.first;
int clean = SCE_CLEAN;
int breakout = 0;
if (sc->set!=set) {
sc->set= set;
while(breakout==0 && scene) {
Scene *setchain = scene;
while(breakout==0 && setchain) {
clean = setchain->dirty;
if(clean == SCE_DIRTY) {
/* we have not reached yet end of chain, and we
* encountered dirty node - we have a cycle.
* sc->set = 0, clean the chain and break out.
*/
error("Can't change set. It would create a loop!");
sc->set = 0;
breakout = 1;
scene_chain_cleanup(scene);
}
if(breakout == 0) {
setchain->dirty = SCE_DIRTY;
setchain = setchain->set;
}
}
if(breakout == 0) {
scene_chain_cleanup(scene);
scene = scene->id.next;
}
}
allqueue(REDRAWBUTSSCENE, 0);
allqueue(REDRAWVIEW3D, 0);

@ -2104,6 +2104,7 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
View3D *v3d= spacedata;
Base *base;
Object *ob;
Scene *setscene;
setwinmatrixview3d(0); /* 0= no pick rect */
setviewmatrixview3d(); /* note: calls where_is_object for camera... */
@ -2186,9 +2187,10 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
view3d_set_clipping(v3d);
/* draw set first */
if(G.scene->set) {
setscene= G.scene->set;
if(setscene) { /* if(G.scene->set) { */
base= G.scene->set->base.first;
base= setscene->base.first; /* base= G.scene->set->base.first; */
while(base) {
if(v3d->lay & base->lay) {
@ -2205,7 +2207,7 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
tbase= *base;
tbase.flag= OB_FROMDUPLI;
make_duplilist(G.scene->set, base->object);
make_duplilist(setscene, base->object); /* make_duplilist(G.scene->set, base->object); */
ob= duplilist.first;
while(ob) {
tbase.object= ob;
@ -2216,7 +2218,12 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
}
}
base= base->next;
if(base==0 && setscene && setscene->set) {
setscene= setscene->set;
base= setscene->base.first;
}
}
/* Transp and X-ray afterdraw stuff */
@ -2338,6 +2345,7 @@ void drawview3d_render(struct View3D *v3d)
extern short v3d_windowmode;
Base *base;
Object *ob;
Scene *setscene;
update_for_newframe_muted(); /* first, since camera can be animated */
@ -2381,9 +2389,10 @@ void drawview3d_render(struct View3D *v3d)
G.f |= G_SIMULATION;
/* first draw set */
if(G.scene->set) {
setscene= G.scene->set;
if(setscene) { /* if(G.scene->set) { */
base= G.scene->set->base.first;
base= setscene->base.first; /* base= G.scene->set->base.first; */
while(base) {
if(v3d->lay & base->lay) {
if ELEM3(base->object->type, OB_LAMP, OB_CAMERA, OB_LATTICE);
@ -2398,7 +2407,7 @@ void drawview3d_render(struct View3D *v3d)
Base tbase;
tbase.flag= OB_FROMDUPLI;
make_duplilist(G.scene->set, base->object);
make_duplilist(setscene, base->object); /* make_duplilist(G.scene->set, base->object); */
ob= duplilist.first;
while(ob) {
tbase.object= ob;
@ -2410,6 +2419,10 @@ void drawview3d_render(struct View3D *v3d)
}
}
base= base->next;
if(base==0 && setscene && setscene->set) {
setscene= setscene->set;
base= setscene->base.first;
}
}
/* Transp and X-ray afterdraw stuff */