forked from bartvdbraak/blender
Todo #2574
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:
parent
4a641caddd
commit
50e26b7637
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user