[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19811] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Mon Apr 20 12:13:56 CEST 2009


Revision: 19811
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19811
Author:   ton
Date:     2009-04-20 12:13:55 +0200 (Mon, 20 Apr 2009)

Log Message:
-----------
2.5

Patch from Joshua, converting Grease Pencil to 2.5.
All GP data now is an ID block, allowing re-use, link and append.
For better contextual control within 2.5, these GP ID's will get
linked to actual data, like NodeTrees, Scenes, Images or Objects.
That will ensure Undo works, and opens up exciting new use cases
as well. :)

Patch note: on reading files, GPencils linked from editors will
get moved to the main library, using standard naming (indicating
where it was used), and with "Fake User" set. That way the user
can manually relink the pencils where appropriate.
We can check on just linking GP to some default, like 3d window
pencils to Scene? Nice to experiment with.

Notes for Joshua:
- for reading old GPencil, it has to use old code as well, meaning
  to tread data as "indirect data, within another ID".
- Saving ID data means the chunk in file BHead needs the ID_GD code,
  and not "DATA", which indicates 'indirect data'. That's the file
  format spec.
- I've added do_versions_gpencil_2_50(), feel free to further tweak
  things here, like linking things to scene or so.
- Formerly GPencil saved 2.50 files won't convert gpencil

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_main.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/library.c
    branches/blender2.5/blender/source/blender/blenloader/intern/readblenentry.c
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c
    branches/blender2.5/blender/source/blender/editors/gpencil/drawgpencil.c
    branches/blender2.5/blender/source/blender/editors/gpencil/editaction_gpencil.c
    branches/blender2.5/blender/source/blender/editors/gpencil/gpencil_intern.h
    branches/blender2.5/blender/source/blender/editors/include/ED_gpencil.h
    branches/blender2.5/blender/source/blender/makesdna/DNA_ID.h
    branches/blender2.5/blender/source/blender/makesdna/DNA_gpencil_types.h

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_main.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_main.h	2009-04-20 09:17:43 UTC (rev 19810)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_main.h	2009-04-20 10:13:55 UTC (rev 19811)
@@ -77,6 +77,7 @@
 	ListBase brush;
 	ListBase particle;
 	ListBase wm;
+	ListBase gpencil;
 } Main;
 
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/library.c	2009-04-20 09:17:43 UTC (rev 19810)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/library.c	2009-04-20 10:13:55 UTC (rev 19811)
@@ -79,6 +79,7 @@
 #include "DNA_space_types.h"
 #include "DNA_windowmanager_types.h"
 #include "DNA_anim_types.h"
+#include "DNA_gpencil_types.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_dynstr.h"
@@ -114,6 +115,7 @@
 #include "BKE_brush.h"
 #include "BKE_idprop.h"
 #include "BKE_particle.h"
+#include "BKE_gpencil.h"
 
 #define MAX_IDPUP		60	/* was 24 */
 
@@ -199,6 +201,8 @@
 			return &(mainlib->particle);
 		case ID_WM:
 			return &(mainlib->wm);
+		case ID_GD:
+			return &(mainlib->gpencil);
 	}
 	return 0;
 }
@@ -269,6 +273,7 @@
 	lb[a++]= &(main->scene);
 	lb[a++]= &(main->library);
 	lb[a++]= &(main->wm);
+	lb[a++]= &(main->gpencil);
 	
 	lb[a]= NULL;
 
@@ -374,6 +379,9 @@
 		case ID_WM:
 			id = MEM_callocN(sizeof(wmWindowManager), "Window manager");
   			break;
+		case ID_GD:
+			id = MEM_callocN(sizeof(bGPdata), "Grease Pencil");
+			break;
 	}
 	return id;
 }
@@ -577,6 +585,9 @@
 			if(free_windowmanager_cb)
 				free_windowmanager_cb(NULL, (wmWindowManager *)id);
 			break;
+		case ID_GD:
+			free_gpencil_data((bGPdata *)id);
+			break;
 	}
 
 	if (id->properties) {
@@ -986,14 +997,15 @@
 	
 	if(id->lib)
 		return;
-
+	
 	if(GS(id->name)==ID_OB) {		
 		Object *ob= (Object *)id;
 		bActionStrip *strip;
 		Mesh *me;
 
 		int a;
-
+	
+		// XXX old animation system!
 		for (strip=ob->nlastrips.first; strip; strip=strip->next){
 			LIBTAG(strip->object); 
 			LIBTAG(strip->act);

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readblenentry.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readblenentry.c	2009-04-20 09:17:43 UTC (rev 19810)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readblenentry.c	2009-04-20 10:13:55 UTC (rev 19811)
@@ -86,6 +86,7 @@
 	{ ID_BR,		"Brush",	IDTYPE_FLAGS_ISLINKABLE}, 
 	{ ID_CA,		"Camera",	IDTYPE_FLAGS_ISLINKABLE}, 
 	{ ID_CU,		"Curve",	IDTYPE_FLAGS_ISLINKABLE}, 
+	{ ID_GD,		"GPencil",	IDTYPE_FLAGS_ISLINKABLE}, 
 	{ ID_GR,		"Group",	IDTYPE_FLAGS_ISLINKABLE}, 
 	{ ID_ID,		"ID",		0}, 
 	{ ID_IM,		"Image",	IDTYPE_FLAGS_ISLINKABLE}, 

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-04-20 09:17:43 UTC (rev 19810)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-04-20 10:13:55 UTC (rev 19811)
@@ -4065,8 +4065,8 @@
 
 /* ****************** READ GREASE PENCIL ***************** */
 
-/* relinks grease-pencil data for 3d-view(s) - used for direct_link */
-static void link_gpencil(FileData *fd, bGPdata *gpd)
+/* relinks grease-pencil data - used for direct_link and old file linkage */
+static void direct_link_gpencil(FileData *fd, bGPdata *gpd)
 {
 	bGPDlayer *gpl;
 	bGPDframe *gpf;
@@ -4242,7 +4242,6 @@
 							else if(GS(snode->id->name)==ID_TE)
 								snode->nodetree= ((Tex *)snode->id)->nodetree;
 						}
-						
 					}
 				}
 				sa= sa->next;
@@ -4353,7 +4352,7 @@
 						*/
 					}
 					else if(v3d->scenelock) v3d->lay= sc->scene->lay;
-					
+
 					/* not very nice, but could help */
 					if((v3d->layact & v3d->lay)==0) v3d->layact= v3d->lay;
 					
@@ -4592,7 +4591,7 @@
 					v3d->bgpic->iuser.ok= 1;
 				if(v3d->gpd) {
 					v3d->gpd= newdataadr(fd, v3d->gpd);
-					link_gpencil(fd, v3d->gpd);
+					direct_link_gpencil(fd, v3d->gpd);
 				}
 				v3d->localvd= newdataadr(fd, v3d->localvd);
 				v3d->afterdraw.first= v3d->afterdraw.last= NULL;
@@ -4621,11 +4620,11 @@
 				SpaceImage *sima= (SpaceImage *)sl;
 				
 				sima->cumap= newdataadr(fd, sima->cumap);
+				sima->gpd= newdataadr(fd, sima->gpd);
+				if (sima->gpd)
+					direct_link_gpencil(fd, sima->gpd);
 				if(sima->cumap)
 					direct_link_curvemapping(fd, sima->cumap);
-				sima->gpd= newdataadr(fd, sima->gpd);
-				if (sima->gpd)
-					link_gpencil(fd, sima->gpd);
 				sima->iuser.ok= 1;
 			}
 			else if(sl->spacetype==SPACE_NODE) {
@@ -4633,7 +4632,7 @@
 				
 				if(snode->gpd) {
 					snode->gpd= newdataadr(fd, snode->gpd);
-					link_gpencil(fd, snode->gpd);
+					direct_link_gpencil(fd, snode->gpd);
 				}
 				snode->nodetree= snode->edittree= NULL;
 			}
@@ -4641,7 +4640,7 @@
 				SpaceSeq *sseq= (SpaceSeq *)sl;
 				if(sseq->gpd) {
 					sseq->gpd= newdataadr(fd, sseq->gpd);
-					link_gpencil(fd, sseq->gpd);
+					direct_link_gpencil(fd, sseq->gpd);
 				}
 			}
 		}
@@ -4818,6 +4817,7 @@
 		case ID_NT: return "Data from NT";
 		case ID_BR: return "Data from BR";
 		case ID_PA: return "Data from PA";
+		case ID_GD: return "Data from GD";
 	}
 	return "Data from Lib Block";
 	
@@ -4974,6 +4974,9 @@
 		case ID_SCRIPT:
 			direct_link_script(fd, (Script*)id);
 			break;
+		case ID_GD:
+			direct_link_gpencil(fd, (bGPdata *)id);
+			break;
 	}
 	
 	/*link direct data of ID properties*/
@@ -5677,6 +5680,64 @@
 	}
 }
 
+static void versions_gpencil_add_main(ListBase *lb, ID *id, char *name)
+{
+	
+	BLI_addtail(lb, id);
+	id->us= 1;
+	id->flag= LIB_FAKEUSER;
+	*( (short *)id->name )= ID_GD;
+	
+	new_id(lb, id, name);
+	/* alphabetic insterion: is in new_id */
+	
+	if(G.f & G_DEBUG)
+		printf("Converted GPencil to ID: %s\n", id->name+2);
+}
+
+static void do_versions_gpencil_2_50(Main *main, bScreen *screen)
+{
+	ScrArea *sa;
+	SpaceLink *sl;
+	
+	/* add regions */
+	for(sa= screen->areabase.first; sa; sa= sa->next) {
+		sl= sa->spacedata.first;
+		for(sl; sl; sl= sl->next) {
+			if (sl->spacetype==SPACE_VIEW3D) {
+				View3D *v3d= (View3D*) sl;
+				if(v3d->gpd) {
+					versions_gpencil_add_main(&main->gpencil, (ID *)v3d->gpd, "GPencil View3D");
+					v3d->gpd= NULL;
+				}
+			}
+			else if (sl->spacetype==SPACE_NODE) {
+				SpaceNode *snode= (SpaceNode *)sl;
+				if(snode->gpd) {
+					versions_gpencil_add_main(&main->gpencil, (ID *)snode->gpd, "GPencil Node");
+					snode->gpd= NULL;
+				}
+			}
+			else if (sl->spacetype==SPACE_SEQ) {
+				SpaceSeq *sseq= (SpaceSeq *)sl;
+				if(sseq->gpd) {
+					versions_gpencil_add_main(&main->gpencil, (ID *)sseq->gpd, "GPencil Node");
+					sseq->gpd= NULL;
+				}
+			}
+			else if (sl->spacetype==SPACE_IMAGE) {
+				SpaceImage *sima= (SpaceImage *)sl;
+				if(sima->gpd) {
+					versions_gpencil_add_main(&main->gpencil, (ID *)sima->gpd, "GPencil Image");
+					sima->gpd= NULL;
+				}
+			}
+		}
+	}		
+}
+
+
+
 static void do_versions(FileData *fd, Library *lib, Main *main)
 {
 	/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -8748,8 +8809,10 @@
 		Scene *sce;
 		Tex *tx;
 		
-		for(screen= main->screen.first; screen; screen= screen->id.next)
+		for(screen= main->screen.first; screen; screen= screen->id.next) {
 			do_versions_windowmanager_2_50(screen);
+			do_versions_gpencil_2_50(main, screen);
+		}
 		
 		/* old Animation System (using IPO's) needs to be converted to the new Animato system 
 		 * (NOTE: conversion code in blenkernel/intern/ipo.c for now)

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c	2009-04-20 09:17:43 UTC (rev 19810)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c	2009-04-20 10:13:55 UTC (rev 19811)
@@ -1693,27 +1693,30 @@
 	mywrite(wd, MYWRITE_FLUSH, 0);
 }
 
-static void write_gpencil(WriteData *wd, bGPdata *gpd)
+static void write_gpencils(WriteData *wd, ListBase *lb)
 {
+	bGPdata *gpd;
 	bGPDlayer *gpl;
 	bGPDframe *gpf;
 	bGPDstroke *gps;
 	
-	/* write gpd data block to file */
-	writestruct(wd, DATA, "bGPdata", 1, gpd);
-	
-	/* write grease-pencil layers to file */
-	for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
-		writestruct(wd, DATA, "bGPDlayer", 1, gpl);
+	for (gpd= lb->first; gpd; gpd= gpd->id.next) {
+		/* write gpd data block to file */
+		writestruct(wd, ID_GD, "bGPdata", 1, gpd);
 		
-		/* write this layer's frames to file */
-		for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
-			writestruct(wd, DATA, "bGPDframe", 1, gpf);
+		/* write grease-pencil layers to file */
+		for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
+			writestruct(wd, DATA, "bGPDlayer", 1, gpl);
 			
-			/* write strokes */
-			for (gps= gpf->strokes.first; gps; gps= gps->next) {
-				writestruct(wd, DATA, "bGPDstroke", 1, gps);
-				writestruct(wd, DATA, "bGPDspoint", gps->totpoints, gps->points);				
+			/* write this layer's frames to file */
+			for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
+				writestruct(wd, DATA, "bGPDframe", 1, gpf);
+				
+				/* write strokes */
+				for (gps= gpf->strokes.first; gps; gps= gps->next) {
+					writestruct(wd, DATA, "bGPDstroke", 1, gps);
+					writestruct(wd, DATA, "bGPDspoint", gps->totpoints, gps->points);				
+				}
 			}
 		}
 	}
@@ -1808,7 +1811,6 @@
 					writestruct(wd, DATA, "View3D", 1, v3d);
 					if(v3d->bgpic) writestruct(wd, DATA, "BGpic", 1, v3d->bgpic);
 					if(v3d->localvd) writestruct(wd, DATA, "View3D", 1, v3d->localvd);
-					if(v3d->gpd) write_gpencil(wd, v3d->gpd);
 				}
 				else if(sl->spacetype==SPACE_IPO) {
 					SpaceIpo *sipo= (SpaceIpo *)sl;
@@ -1832,7 +1834,6 @@
 				else if(sl->spacetype==SPACE_SEQ) {
 					SpaceSeq *sseq= (SpaceSeq *)sl;
 					writestruct(wd, DATA, "SpaceSeq", 1, sl);
-					if(sseq->gpd) write_gpencil(wd, sseq->gpd);
 				}
 				else if(sl->spacetype==SPACE_OUTLINER) {
 					SpaceOops *so= (SpaceOops *)sl;
@@ -1852,8 +1853,6 @@
 					writestruct(wd, DATA, "SpaceImage", 1, sl);
 					if(sima->cumap)
 						write_curvemapping(wd, sima->cumap);
-					if(sima->gpd) 
-						write_gpencil(wd, sima->gpd);
 				}

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list