Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorNathan Letwory <nathan@letworyinteractive.com>2006-01-06 15:37:45 +0300
committerNathan Letwory <nathan@letworyinteractive.com>2006-01-06 15:37:45 +0300
commit50e26b7637bfb1a2e4ca845b254feb313a353100 (patch)
treeea4a0202cacb2322bd5e669219eed89cd29a1009 /source
parent4a641caddd7dea33eb4f9709a2723a2e9aadb53d (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/displist.c11
-rw-r--r--source/blender/makesdna/DNA_scene_types.h6
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c14
-rw-r--r--source/blender/src/buttons_scene.c36
-rw-r--r--source/blender/src/drawview.c25
5 files changed, 78 insertions, 14 deletions
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 9273bd8eb71..e3ce24fe190 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -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;
+ }
}
}
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index fe54a631bdd..f4ee028aed6 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -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
diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c
index 41963d823e3..8b81c9cc153 100644
--- a/source/blender/renderconverter/intern/convertBlenderScene.c
+++ b/source/blender/renderconverter/intern/convertBlenderScene.c
@@ -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;*/
}
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index 4093a0fc89a..ff83a457d33 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -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);
diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c
index b470d2ab6af..517071c349c 100644
--- a/source/blender/src/drawview.c
+++ b/source/blender/src/drawview.c
@@ -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 */