[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30697] branches/soc-2008-mxcurioni/source /blender/blenloader/intern: Added file I/O for line style modifiers.

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Sat Jul 24 22:37:54 CEST 2010


Revision: 30697
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30697
Author:   kjym3
Date:     2010-07-24 22:37:54 +0200 (Sat, 24 Jul 2010)

Log Message:
-----------
Added file I/O for line style modifiers.

Modified Paths:
--------------
    branches/soc-2008-mxcurioni/source/blender/blenloader/intern/readfile.c
    branches/soc-2008-mxcurioni/source/blender/blenloader/intern/writefile.c

Modified: branches/soc-2008-mxcurioni/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/blenloader/intern/readfile.c	2010-07-24 20:33:35 UTC (rev 30696)
+++ branches/soc-2008-mxcurioni/source/blender/blenloader/intern/readfile.c	2010-07-24 20:37:54 UTC (rev 30697)
@@ -5380,12 +5380,128 @@
 
 /* ************ READ LINE STYLE ***************** */
 
+static void lib_link_linestyle(FileData *fd, Main *main)
+{
+	FreestyleLineStyle *linestyle;
+	LineStyleModifier *m;
+
+	linestyle = main->linestyle.first;
+	while (linestyle) {
+		for (m = linestyle->color_modifiers.first; m; m = m->next) {
+			if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
+				LineStyleColorModifier_DistanceFromObject *cm = (LineStyleColorModifier_DistanceFromObject *)m;
+				cm->target = newlibadr(fd, linestyle->id.lib, cm->target);
+			}
+		}
+		for (m = linestyle->alpha_modifiers.first; m; m = m->next){
+			if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
+				LineStyleAlphaModifier_DistanceFromObject *am = (LineStyleAlphaModifier_DistanceFromObject *)m;
+				am->target = newlibadr(fd, linestyle->id.lib, am->target);
+			}
+		}
+		for (m = linestyle->thickness_modifiers.first; m; m = m->next){
+			if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
+				LineStyleThicknessModifier_DistanceFromObject *tm = (LineStyleThicknessModifier_DistanceFromObject *)m;
+				tm->target = newlibadr(fd, linestyle->id.lib, tm->target);
+			}
+		}
+		linestyle = linestyle->id.next;
+	}
+}
+
+static void direct_link_linestyle_color_modifier(FileData *fd, LineStyleModifier *modifier)
+{
+	switch (modifier->type) {
+	case LS_MODIFIER_ALONG_STROKE:
+		{
+			LineStyleColorModifier_AlongStroke *m = (LineStyleColorModifier_AlongStroke *)modifier;
+			m->color_ramp = newdataadr(fd, m->color_ramp);
+		}
+		break;
+	case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+		{
+			LineStyleColorModifier_DistanceFromCamera *m = (LineStyleColorModifier_DistanceFromCamera *)modifier;
+			m->color_ramp = newdataadr(fd, m->color_ramp);
+		}
+		break;
+	case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+		{
+			LineStyleColorModifier_DistanceFromObject *m = (LineStyleColorModifier_DistanceFromObject *)modifier;
+			m->color_ramp = newdataadr(fd, m->color_ramp);
+		}
+		break;
+	}
+}
+
+static void direct_link_linestyle_alpha_modifier(FileData *fd, LineStyleModifier *modifier)
+{
+	switch (modifier->type) {
+	case LS_MODIFIER_ALONG_STROKE:
+		{
+			LineStyleAlphaModifier_AlongStroke *m = (LineStyleAlphaModifier_AlongStroke *)modifier;
+			m->curve = newdataadr(fd, m->curve);
+			direct_link_curvemapping(fd, m->curve);
+		}
+		break;
+	case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+		{
+			LineStyleAlphaModifier_DistanceFromCamera *m = (LineStyleAlphaModifier_DistanceFromCamera *)modifier;
+			m->curve = newdataadr(fd, m->curve);
+			direct_link_curvemapping(fd, m->curve);
+		}
+		break;
+	case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+		{
+			LineStyleAlphaModifier_DistanceFromObject *m = (LineStyleAlphaModifier_DistanceFromObject *)modifier;
+			m->curve = newdataadr(fd, m->curve);
+			direct_link_curvemapping(fd, m->curve);
+		}
+		break;
+	}
+}
+
+static void direct_link_linestyle_thickness_modifier(FileData *fd, LineStyleModifier *modifier)
+{
+	switch (modifier->type) {
+	case LS_MODIFIER_ALONG_STROKE:
+		{
+			LineStyleThicknessModifier_AlongStroke *m = (LineStyleThicknessModifier_AlongStroke *)modifier;
+			m->curve = newdataadr(fd, m->curve);
+			direct_link_curvemapping(fd, m->curve);
+		}
+		break;
+	case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+		{
+			LineStyleThicknessModifier_DistanceFromCamera *m = (LineStyleThicknessModifier_DistanceFromCamera *)modifier;
+			m->curve = newdataadr(fd, m->curve);
+			direct_link_curvemapping(fd, m->curve);
+		}
+		break;
+	case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+		{
+			LineStyleThicknessModifier_DistanceFromObject *m = (LineStyleThicknessModifier_DistanceFromObject *)modifier;
+			m->curve = newdataadr(fd, m->curve);
+			direct_link_curvemapping(fd, m->curve);
+		}
+		break;
+	}
+}
+
 static void direct_link_linestyle(FileData *fd, FreestyleLineStyle *linestyle)
 {
+	LineStyleModifier *modifier;
 
+	link_list(fd, &linestyle->color_modifiers);
+	for(modifier=linestyle->color_modifiers.first; modifier; modifier= modifier->next)
+		direct_link_linestyle_color_modifier(fd, modifier);
+	link_list(fd, &linestyle->alpha_modifiers);
+	for(modifier=linestyle->alpha_modifiers.first; modifier; modifier= modifier->next)
+		direct_link_linestyle_alpha_modifier(fd, modifier);
+	link_list(fd, &linestyle->thickness_modifiers);
+	for(modifier=linestyle->thickness_modifiers.first; modifier; modifier= modifier->next)
+		direct_link_linestyle_thickness_modifier(fd, modifier);
 }
 
-
 /* ************** GENERAL & MAIN ******************** */
 
 
@@ -11122,6 +11238,7 @@
 	lib_link_nodetree(fd, main);	/* has to be done after scene/materials, this will verify group nodes */
 	lib_link_brush(fd, main);
 	lib_link_particlesettings(fd, main);
+	lib_link_linestyle(fd, main);
 
 	lib_link_mesh(fd, main);		/* as last: tpage images with users at zero */
 
@@ -12040,10 +12157,22 @@
 
 static void expand_linestyle(FileData *fd, Main *mainvar, FreestyleLineStyle *linestyle)
 {
+	LineStyleModifier *m;
 
+	for (m = linestyle->color_modifiers.first; m; m = m->next) {
+		if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT)
+			expand_doit(fd, mainvar, ((LineStyleColorModifier_DistanceFromObject *)m)->target);
+	}
+	for (m = linestyle->alpha_modifiers.first; m; m = m->next){
+		if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT)
+			expand_doit(fd, mainvar, ((LineStyleAlphaModifier_DistanceFromObject *)m)->target);
+	}
+	for (m = linestyle->thickness_modifiers.first; m; m = m->next){
+		if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT)
+			expand_doit(fd, mainvar, ((LineStyleThicknessModifier_DistanceFromObject *)m)->target);
+	}
 }
 
-
 static void expand_main(FileData *fd, Main *mainvar)
 {
 	ListBase *lbarray[MAX_LIBARRAY];

Modified: branches/soc-2008-mxcurioni/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/blenloader/intern/writefile.c	2010-07-24 20:33:35 UTC (rev 30696)
+++ branches/soc-2008-mxcurioni/source/blender/blenloader/intern/writefile.c	2010-07-24 20:37:54 UTC (rev 30697)
@@ -2375,13 +2375,124 @@
 	}
 }
 
+static void write_linestyle_color_modifiers(WriteData *wd, ListBase *modifiers)
+{
+	LineStyleModifier *m;
+	char *struct_name;
+
+	for (m = modifiers->first; m; m = m->next) {
+		switch (m->type) {
+		case LS_MODIFIER_ALONG_STROKE:
+			struct_name = "LineStyleColorModifier_AlongStroke";
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+			struct_name = "LineStyleColorModifier_DistanceFromCamera";
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+			struct_name = "LineStyleColorModifier_DistanceFromObject";
+			break;
+		default:
+			struct_name = "LineStyleColorModifier"; // this should not happen
+		}
+		writestruct(wd, DATA, struct_name, 1, m);
+	}
+	for (m = modifiers->first; m; m = m->next) {
+		switch (m->type) {
+		case LS_MODIFIER_ALONG_STROKE:
+			writestruct(wd, DATA, "ColorBand", 1, ((LineStyleColorModifier_AlongStroke *)m)->color_ramp);
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+			writestruct(wd, DATA, "ColorBand", 1, ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp);
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+			writestruct(wd, DATA, "ColorBand", 1, ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp);
+			break;
+		}
+	}
+}
+
+static void write_linestyle_alpha_modifiers(WriteData *wd, ListBase *modifiers)
+{
+	LineStyleModifier *m;
+	char *struct_name;
+
+	for (m = modifiers->first; m; m = m->next) {
+		switch (m->type) {
+		case LS_MODIFIER_ALONG_STROKE:
+			struct_name = "LineStyleAlphaModifier_AlongStroke";
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+			struct_name = "LineStyleAlphaModifier_DistanceFromCamera";
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+			struct_name = "LineStyleAlphaModifier_DistanceFromObject";
+			break;
+		default:
+			struct_name = "LineStyleAlphaModifier"; // this should not happen
+		}
+		writestruct(wd, DATA, struct_name, 1, m);
+	}
+	for (m = modifiers->first; m; m = m->next) {
+		switch (m->type) {
+		case LS_MODIFIER_ALONG_STROKE:
+			write_curvemapping(wd, ((LineStyleAlphaModifier_AlongStroke *)m)->curve);
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+			write_curvemapping(wd, ((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve);
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+			write_curvemapping(wd, ((LineStyleAlphaModifier_DistanceFromObject *)m)->curve);
+			break;
+		}
+	}
+}
+
+static void write_linestyle_thickness_modifiers(WriteData *wd, ListBase *modifiers)
+{
+	LineStyleModifier *m;
+	char *struct_name;
+
+	for (m = modifiers->first; m; m = m->next) {
+		switch (m->type) {
+		case LS_MODIFIER_ALONG_STROKE:
+			struct_name = "LineStyleThicknessModifier_AlongStroke";
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+			struct_name = "LineStyleThicknessModifier_DistanceFromCamera";
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+			struct_name = "LineStyleThicknessModifier_DistanceFromObject";
+			break;
+		default:
+			struct_name = "LineStyleThicknessModifier"; // this should not happen
+		}
+		writestruct(wd, DATA, struct_name, 1, m);
+	}
+	for (m = modifiers->first; m; m = m->next) {
+		switch (m->type) {
+		case LS_MODIFIER_ALONG_STROKE:
+			write_curvemapping(wd, ((LineStyleThicknessModifier_AlongStroke *)m)->curve);
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+			write_curvemapping(wd, ((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve);
+			break;
+		case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+			write_curvemapping(wd, ((LineStyleThicknessModifier_DistanceFromObject *)m)->curve);
+			break;
+		}
+	}
+}
+
 static void write_linestyles(WriteData *wd, ListBase *idbase)
 {
 	FreestyleLineStyle *linestyle;
-	
+
 	for(linestyle=idbase->first; linestyle; linestyle= linestyle->id.next) {
 		if(linestyle->id.us>0 || wd->current) {
 			writestruct(wd, ID_LS, "FreestyleLineStyle", 1, linestyle);
+			write_linestyle_color_modifiers(wd, &linestyle->color_modifiers);
+			write_linestyle_alpha_modifiers(wd, &linestyle->alpha_modifiers);
+			write_linestyle_thickness_modifiers(wd, &linestyle->thickness_modifiers);
 		}
 	}
 }





More information about the Bf-blender-cvs mailing list