diff options
author | Matt Ebb <matt@mke3.net> | 2010-06-04 05:39:34 +0400 |
---|---|---|
committer | Matt Ebb <matt@mke3.net> | 2010-06-04 05:39:34 +0400 |
commit | b0eee216d4e551fc3c344d73983928e97bd59bb0 (patch) | |
tree | 4cc77c32666393d42f5df392a72ccdbc8257c13b /source | |
parent | ab5367e09f9cfc332a171099385e2c1b6d7516da (diff) |
Fix [#22383] 3dView Layer Management (by Mouse) broken
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 13 | ||||
-rw-r--r-- | source/blender/editors/include/ED_view3d.h | 2 | ||||
-rw-r--r-- | source/blender/editors/object/object_add.c | 5 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_header.c | 1 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_view.c | 22 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 6 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_scene.c | 4 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_space.c | 2 |
8 files changed, 45 insertions, 10 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index d4563df4d2c..b9be5e66106 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -10852,6 +10852,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* put 2.50 compatibility code here until next subversion bump */ { Object *ob; + Scene *scene; bScreen *sc; for (sc= main->screen.first; sc; sc= sc->id.next) { @@ -10908,6 +10909,18 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } + + /* initialise scene active layer */ + for (scene= main->scene.first; scene; scene=scene->id.next) { + int i; + for(i=0; i<20; i++) { + if(scene->lay & (1<<i)) { + scene->layact= 1<<i; + break; + } + } + } + } /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 9e279044962..bb4a7543d90 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -153,7 +153,7 @@ struct RegionView3D *ED_view3d_context_rv3d(struct bContext *C); void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d); -int ED_view3d_scene_layer_set(int lay, const int *values); +int ED_view3d_scene_layer_set(int lay, const int *values, int *active); int ED_view3d_context_activate(struct bContext *C); void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 9b0a5c9ff33..393fb70c177 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -212,12 +212,13 @@ static void object_add_generic_invoke_options(bContext *C, wmOperator *op) for(a=0; a<32; a++) values[a]= (layer & (1<<a)); } else { - layer = v3d->layact; + layer = (v3d->scenelock)?scene->layact:v3d->layact; + for(a=0; a<32; a++) values[a]= (layer & (1<<a)); } } else { - layer = scene->lay; + layer = scene->layact; for(a=0; a<32; a++) values[a]= (layer & (1<<a)); } diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 489f00b105c..14b769fdf39 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -137,6 +137,7 @@ static void handle_view3d_lock(bContext *C) if(v3d->localvd==NULL && v3d->scenelock && sa->spacetype==SPACE_VIEW3D) { /* copy to scene */ scene->lay= v3d->lay; + scene->layact= v3d->layact; scene->camera= v3d->camera; /* not through notifiery, listener don't have context diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 9790e928188..54cf6233cf8 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -1380,7 +1380,7 @@ static unsigned int free_localbit(void) return 0; } -int ED_view3d_scene_layer_set(int lay, const int *values) +int ED_view3d_scene_layer_set(int lay, const int *values, int *active) { int i, tot= 0; @@ -1393,10 +1393,28 @@ int ED_view3d_scene_layer_set(int lay, const int *values) return lay; for(i=0; i<20; i++) { - if(values[i]) lay |= (1<<i); + + if (active) { + /* if this value has just been switched on, make that layer active */ + if (values[i] && (lay & (1<<i))==0) { + *active = (1<<i); + } + } + + if (values[i]) lay |= (1<<i); else lay &= ~(1<<i); } + /* ensure always an active layer */ + if (active && (lay & *active)==0) { + for(i=0; i<20; i++) { + if(lay & (1<<i)) { + *active= 1<<i; + break; + } + } + } + return lay; } diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 8fe48f7d56a..b7975653c15 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -755,9 +755,11 @@ typedef struct Scene { float cursor[3]; /* 3d cursor location */ float twcent[3]; /* center for transform widget */ float twmin[3], twmax[3]; /* boundbox of selection for transform widget */ - unsigned int lay; - + unsigned int lay; /* bitflags for layer visibility */ + int layact; /* active layer */ + int pad1; + short flag; /* various settings */ short use_nodes; diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index c03a5a7adfa..79cc268a854 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -272,7 +272,7 @@ static void rna_Scene_layer_set(PointerRNA *ptr, const int *values) { Scene *scene= (Scene*)ptr->data; - scene->lay= ED_view3d_scene_layer_set(scene->lay, values); + scene->lay= ED_view3d_scene_layer_set(scene->lay, values, &scene->layact); } static void rna_Scene_view3d_update(Main *bmain, Scene *unused, PointerRNA *ptr) @@ -734,7 +734,7 @@ static int rna_RenderSettings_use_game_engine_get(PointerRNA *ptr) static void rna_SceneRenderLayer_layer_set(PointerRNA *ptr, const int *values) { SceneRenderLayer *rl= (SceneRenderLayer*)ptr->data; - rl->lay= ED_view3d_scene_layer_set(rl->lay, values); + rl->lay= ED_view3d_scene_layer_set(rl->lay, values, NULL); } static void rna_SceneRenderLayer_pass_update(Main *bmain, Scene *unused, PointerRNA *ptr) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 47dccda58f2..a0f0f3d2f4d 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -303,7 +303,7 @@ static void rna_SpaceView3D_layer_set(PointerRNA *ptr, const int *values) { View3D *v3d= (View3D*)(ptr->data); - v3d->lay= ED_view3d_scene_layer_set(v3d->lay, values); + v3d->lay= ED_view3d_scene_layer_set(v3d->lay, values, &v3d->layact); } static PointerRNA rna_SpaceView3D_region_3d_get(PointerRNA *ptr) |