Revision: 22471
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22471
Author:   blendix
Date:     2009-08-15 18:43:03 +0200 (Sat, 15 Aug 2009)

Log Message:
-----------
2.5: Screen/Scene New/Delete operators.

Implementation Note:
* Moved the scene copy/unlink code back into blenkernel, with
  the exception of the copy single user stuff which is still in
  object_edit.c.
* Uses SCREENDELETE notifier like SCREENBROWSE, seems only clean
  way to do this now.

Modified Paths:
--------------
    branches/blender2.5/blender/release/ui/space_info.py
    branches/blender2.5/blender/source/blender/blenkernel/BKE_animsys.h
    branches/blender2.5/blender/source/blender/blenkernel/BKE_node.h
    branches/blender2.5/blender/source/blender/blenkernel/BKE_scene.h
    branches/blender2.5/blender/source/blender/blenkernel/BKE_sequence.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/node.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/scene.c
    branches/blender2.5/blender/source/blender/blenlib/intern/listbase.c
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    
branches/blender2.5/blender/source/blender/editors/interface/interface_templates.c
    branches/blender2.5/blender/source/blender/editors/object/object_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/space_node/node_edit.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_scene_types.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
    
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c

Modified: branches/blender2.5/blender/release/ui/space_info.py
===================================================================
--- branches/blender2.5/blender/release/ui/space_info.py        2009-08-15 
16:36:25 UTC (rev 22470)
+++ branches/blender2.5/blender/release/ui/space_info.py        2009-08-15 
16:43:03 UTC (rev 22471)
@@ -22,8 +22,8 @@
                                row.itemM("INFO_MT_render")
                        row.itemM("INFO_MT_help")
 
-               layout.template_ID(context.window, "screen") #, 
new="screen.new", open="scene.unlink")
-               layout.template_ID(context.screen, "scene") #, 
new="screen.new", unlink="scene.unlink")
+               layout.template_ID(context.window, "screen", new="screen.new", 
unlink="screen.delete")
+               layout.template_ID(context.screen, "scene", new="scene.new", 
unlink="scene.delete")
 
                if rd.multiple_engines:
                        layout.itemR(rd, "engine", text="")

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_animsys.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_animsys.h 
2009-08-15 16:36:25 UTC (rev 22470)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_animsys.h 
2009-08-15 16:43:03 UTC (rev 22471)
@@ -66,6 +66,9 @@
 
 struct KS_Path *BKE_keyingset_find_destination(struct KeyingSet *ks, struct ID 
*id, const char group_name[], const char rna_path[], int array_index, int 
group_mode);
 
+/* Copy all KeyingSets in the given list */
+void BKE_keyingsets_copy(struct ListBase *newlist, struct ListBase *list);
+
 /* Free data for KeyingSet but not set itself */
 void BKE_keyingset_free(struct KeyingSet *ks);
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_node.h    
2009-08-15 16:36:25 UTC (rev 22470)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_node.h    
2009-08-15 16:43:03 UTC (rev 22471)
@@ -47,6 +47,7 @@
 struct ListBase;
 struct RenderData;
 struct Scene;
+struct Main;
 struct Tex;
 struct GPUMaterial;
 struct GPUNode;
@@ -432,4 +433,8 @@
 void init_nodesystem(void);
 void free_nodesystem(void);
 
+/**/
+
+void clear_scene_in_nodes(struct Main *bmain, struct Scene *sce);
+
 #endif

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_scene.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_scene.h   
2009-08-15 16:36:25 UTC (rev 22470)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_scene.h   
2009-08-15 16:43:03 UTC (rev 22471)
@@ -40,7 +40,13 @@
 struct QuicktimeCodecData;
 struct RenderData;
 struct Text;
+struct Main;
 
+#define SCE_COPY_EMPTY         0
+#define SCE_COPY_LINK_OB       1
+#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)
 
@@ -48,13 +54,16 @@
 void free_avicodecdata(struct AviCodecData *acd);
 void free_qtcodecdata(struct QuicktimeCodecData *acd);
 
-void free_scene(struct Scene *me);
+void free_scene(struct Scene *sce);
 struct Scene *add_scene(char *name);
 struct Base *object_in_scene(struct Object *ob, struct Scene *sce);
 
 void set_scene_bg(struct Scene *sce);
 void set_scene_name(char *name);
 
+struct Scene *copy_scene(struct Main *bmain, struct Scene *sce, int type);
+void unlink_scene(struct Main *bmain, struct Scene *sce, struct Scene *newsce);
+
 int next_object(struct Scene *scene, int val, struct Base **base, struct 
Object **ob);
 struct Object *scene_find_camera(struct Scene *sc);
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_sequence.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_sequence.h        
2009-08-15 16:36:25 UTC (rev 22470)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_sequence.h        
2009-08-15 16:43:03 UTC (rev 22471)
@@ -184,3 +184,7 @@
 void free_imbuf_seq(struct ListBase * seqbasep, int check_mem_usage);
 
 void seq_update_sound(struct Sequence *seq);
+
+void clear_scene_in_allseqs(struct Scene *sce);
+
+

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c     
2009-08-15 16:36:25 UTC (rev 22470)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c     
2009-08-15 16:43:03 UTC (rev 22471)
@@ -342,7 +342,22 @@
        BLI_addtail(&ks->paths, ksp);
 }      
 
+/* Copy all KeyingSets in the given list */
+void BKE_keyingsets_copy(ListBase *newlist, ListBase *list)
+{
+       KeyingSet *ksn;
+       KS_Path *kspn;
 
+       BLI_duplicatelist(newlist, list);
+
+       for(ksn=newlist->first; ksn; ksn=ksn->next) {
+               BLI_duplicatelist(&ksn->paths, &ksn->paths);
+
+               for(kspn=ksn->paths.first; kspn; kspn=kspn->next)
+                       kspn->rna_path= MEM_dupallocN(kspn->rna_path);
+       }
+}
+
 /* Freeing Tools --------------------------- */
 
 /* Free data for KeyingSet but not set itself */

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/node.c 
2009-08-15 16:36:25 UTC (rev 22470)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/node.c 
2009-08-15 16:43:03 UTC (rev 22471)
@@ -3112,3 +3112,29 @@
        BLI_freelistN(&node_all_shaders);
        BLI_freelistN(&node_all_textures);
 }
+
+/* called from unlink_scene, when deleting a scene goes over all scenes
+ * other than the input, checks if they have render layer nodes referencing
+ * the to-be-deleted scene, and resets them to NULL. */
+
+/* XXX needs to get current scene then! */
+void clear_scene_in_nodes(Main *bmain, Scene *sce)
+{
+       Scene *sce1;
+       bNode *node;
+
+       for(sce1= bmain->scene.first; sce1; sce1=sce1->id.next) {
+               if(sce1!=sce) {
+                       if(sce1->nodetree) {
+                               for(node= sce1->nodetree->nodes.first; node; 
node= node->next) {
+                                       if(node->type==CMP_NODE_R_LAYERS) {
+                                               Scene *nodesce= (Scene 
*)node->id;
+                                               
+                                               if (nodesce==sce) node->id = 
NULL;
+                                       }
+                               }
+                       }
+               }
+       }
+}
+

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/scene.c        
2009-08-15 16:36:25 UTC (rev 22470)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/scene.c        
2009-08-15 16:43:03 UTC (rev 22471)
@@ -54,6 +54,7 @@
 #include "DNA_meta_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
 #include "DNA_texture_types.h"
 #include "DNA_userdef_types.h"
 
@@ -125,8 +126,114 @@
        }
 }
 
-/* copy_scene moved to src/header_info.c... should be back */
+Scene *copy_scene(Main *bmain, Scene *sce, int type)
+{
+       Scene *scen;
+       ToolSettings *ts;
+       Base *base, *obase;
+       
+       if(type == SCE_COPY_EMPTY) {
+               ListBase lb;
+               scen= add_scene(sce->id.name+2);
+               
+               lb= scen->r.layers;
+               scen->r= sce->r;
+               scen->r.layers= lb;
+       }
+       else {
+               scen= copy_libblock(sce);
+               BLI_duplicatelist(&(scen->base), &(sce->base));
+               
+               clear_id_newpoins();
+               
+               id_us_plus((ID *)scen->world);
+               id_us_plus((ID *)scen->set);
+               id_us_plus((ID *)scen->ima);
+               id_us_plus((ID *)scen->gm.dome.warptext);
 
+               scen->ed= NULL;
+               scen->theDag= NULL;
+               scen->obedit= NULL;
+               scen->toolsettings= MEM_dupallocN(sce->toolsettings);
+
+               ts= scen->toolsettings;
+               if(ts) {
+                       if(ts->vpaint) {
+                               ts->vpaint= MEM_dupallocN(ts->vpaint);
+                               ts->vpaint->paintcursor= NULL;
+                               ts->vpaint->vpaint_prev= NULL;
+                               ts->vpaint->wpaint_prev= NULL;
+                               id_us_plus((ID *)ts->vpaint->brush);
+                       }
+                       if(ts->wpaint) {
+                               ts->wpaint= MEM_dupallocN(ts->wpaint);
+                               ts->wpaint->paintcursor= NULL;
+                               ts->wpaint->vpaint_prev= NULL;
+                               ts->wpaint->wpaint_prev= NULL;
+                               id_us_plus((ID *)ts->wpaint->brush);
+                       }
+                       if(ts->sculpt) {
+                               ts->sculpt= MEM_dupallocN(ts->sculpt);
+                               ts->sculpt->session= NULL;
+                               id_us_plus((ID *)ts->sculpt->brush);
+                       }
+
+                       id_us_plus((ID *)ts->imapaint.brush);
+                       ts->imapaint.paintcursor= NULL;
+
+                       ts->particle.paintcursor= NULL;
+               }
+               
+               BLI_duplicatelist(&(scen->markers), &(sce->markers));
+               BLI_duplicatelist(&(scen->transform_spaces), 
&(sce->transform_spaces));
+               BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
+               BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
+               
+               scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
+               
+               obase= sce->base.first;
+               base= scen->base.first;
+               while(base) {
+                       id_us_plus(&base->object->id);
+                       if(obase==sce->basact) scen->basact= base;
+       
+                       obase= obase->next;
+                       base= base->next;
+               }
+       }
+       
+       /* make a private copy of the avicodecdata */
+       if(sce->r.avicodecdata) {
+               scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
+               scen->r.avicodecdata->lpFormat = 
MEM_dupallocN(scen->r.avicodecdata->lpFormat);
+               scen->r.avicodecdata->lpParms = 
MEM_dupallocN(scen->r.avicodecdata->lpParms);
+       }
+       
+       /* make a private copy of the qtcodecdata */
+       if(sce->r.qtcodecdata) {
+               scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
+               scen->r.qtcodecdata->cdParms = 
MEM_dupallocN(scen->r.qtcodecdata->cdParms);
+       }
+       
+       /* NOTE: part of SCE_COPY_LINK_DATA and SCE_COPY_FULL operations
+        * are done outside of blenkernel with ED_objects_single_users! */
+
+    /*  camera */
+       if(type == SCE_COPY_LINK_DATA || type == SCE_COPY_FULL) {
+           ID_NEW(scen->camera);
+       }
+
+       /* world */
+       if(type == SCE_COPY_FULL) {
+        if(scen->world) {
+            id_us_plus((ID *)scen->world);
+            scen->world= copy_world(scen->world);
+        }
+       }
+
+       return scen;
+}
+
 /* do not free scene itself */
 void free_scene(Scene *sce)
 {
@@ -413,6 +520,30 @@
        //XXX error("Can't find scene: %s", name);
 }
 
+void unlink_scene(Main *bmain, Scene *sce, Scene *newsce)
+{
+       Scene *sce1;
+       bScreen *sc;
+
+       /* check all sets */
+       for(sce1= bmain->scene.first; sce1; sce1= sce1->id.next)
+               if(sce1->set == sce)
+                       sce1->set= NULL;
+       
+       /* check all sequences */
+       clear_scene_in_allseqs(sce);
+
+       /* check render layer nodes in other scenes */
+       clear_scene_in_nodes(bmain, sce);
+       
+       /* al screens */
+       for(sc= bmain->screen.first; sc; sc= sc->id.next)
+               if(sc->scene == sce)
+                       sc->scene= newsce;
+

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to