[Bf-blender-cvs] [5235a9e] particles_refactor: Moved the particle display list from the modifier into the psys itself. This makes the modifier more easily replaceable later on and allows more detailed management of the particle object settings (in particular dupli flags).

Lukas Tönne noreply at git.blender.org
Tue Apr 22 12:06:57 CEST 2014


Commit: 5235a9ea75f8286044574900a082c0c30988684c
Author: Lukas Tönne
Date:   Fri Jan 3 11:37:23 2014 +0100
https://developer.blender.org/rB5235a9ea75f8286044574900a082c0c30988684c

Moved the particle display list from the modifier into the psys itself.
This makes the modifier more easily replaceable later on and allows
more detailed management of the particle object settings (in particular
dupli flags).

===================================================================

M	source/blender/blenkernel/BKE_nparticle.h
M	source/blender/blenkernel/intern/nparticle.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesdna/DNA_nparticle_types.h
M	source/blender/modifiers/intern/MOD_nparticle.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_nparticle.h b/source/blender/blenkernel/BKE_nparticle.h
index 9050681..f26cd5f 100644
--- a/source/blender/blenkernel/BKE_nparticle.h
+++ b/source/blender/blenkernel/BKE_nparticle.h
@@ -114,9 +114,9 @@ BLI_INLINE NParticleID BKE_nparticle_iter_get_id(struct NParticleIterator *it)
 }
 
 
-struct NParticleDisplay *BKE_nparticle_display_particle(void);
-struct NParticleDisplay *BKE_nparticle_display_dupli(void);
-struct NParticleDisplay *BKE_nparticle_display_copy(struct NParticleDisplay *display);
-void BKE_nparticle_display_free(struct NParticleDisplay *display);
+struct NParticleDisplay *BKE_nparticle_display_add_particle(struct NParticleSystem *psys);
+struct NParticleDisplay *BKE_nparticle_display_add_dupli(struct NParticleSystem *psys);
+struct NParticleDisplay *BKE_nparticle_display_copy(struct NParticleSystem *psys, struct NParticleDisplay *display);
+void BKE_nparticle_display_free(struct NParticleSystem *psys, struct NParticleDisplay *display);
 
 #endif /* BKE_NPARTICLE_H */
diff --git a/source/blender/blenkernel/intern/nparticle.c b/source/blender/blenkernel/intern/nparticle.c
index 5a92dca..877d38e 100644
--- a/source/blender/blenkernel/intern/nparticle.c
+++ b/source/blender/blenkernel/intern/nparticle.c
@@ -186,10 +186,17 @@ NParticleSystem *BKE_nparticle_system_new(void)
 
 void BKE_nparticle_system_free(NParticleSystem *psys)
 {
+	NParticleDisplay *display, *display_next;
+	
 	BKE_nparticle_attribute_remove_all(psys);
 	
 	BKE_nparticle_state_free(psys->state);
 	
+	for (display = psys->display.first; display; display = display_next) {
+		display_next = display->next;
+		BKE_nparticle_display_free(psys, display);
+	}
+	
 	MEM_freeN(psys);
 }
 
@@ -197,6 +204,7 @@ NParticleSystem *BKE_nparticle_system_copy(NParticleSystem *psys)
 {
 	NParticleSystem *npsys = MEM_dupallocN(psys);
 	NParticleAttribute *attr, *nattr;
+	NParticleDisplay *display;
 	
 	npsys->attributes.first = npsys->attributes.last = NULL;
 	for (attr = psys->attributes.first; attr; attr = attr->next) {
@@ -206,6 +214,11 @@ NParticleSystem *BKE_nparticle_system_copy(NParticleSystem *psys)
 	if (psys->state)
 		npsys->state = BKE_nparticle_state_copy(psys->state);
 	
+	npsys->display.first = npsys->display.last = NULL;
+	for (display = psys->display.first; display; display = display->next) {
+		BKE_nparticle_display_copy(npsys, display);
+	}
+	
 	return npsys;
 }
 
@@ -597,29 +610,37 @@ void BKE_nparticle_iter_set_pointer(NParticleIterator *it, const char *attr, voi
 }
 
 
-NParticleDisplay *BKE_nparticle_display_particle(void)
+NParticleDisplay *BKE_nparticle_display_add_particle(NParticleSystem *psys)
 {
 	NParticleDisplay *display = MEM_callocN(sizeof(NParticleDisplay), "particle display");
 	display->type = PAR_DISPLAY_PARTICLE;
 	BLI_strncpy(display->attribute, "position", sizeof(display->attribute));
+	
+	BLI_addtail(&psys->display, display);
 	return display;
 }
 
-NParticleDisplay *BKE_nparticle_display_dupli(void)
+NParticleDisplay *BKE_nparticle_display_add_dupli(NParticleSystem *psys)
 {
 	NParticleDisplay *display = MEM_callocN(sizeof(NParticleDisplay), "particle display");
 	display->type = PAR_DISPLAY_DUPLI;
 	BLI_strncpy(display->attribute, "position", sizeof(display->attribute));
+	
+	BLI_addtail(&psys->display, display);
 	return display;
 }
 
-NParticleDisplay *BKE_nparticle_display_copy(NParticleDisplay *display)
+NParticleDisplay *BKE_nparticle_display_copy(NParticleSystem *psys, NParticleDisplay *display)
 {
 	NParticleDisplay *ndisplay = MEM_dupallocN(display);
+	
+	BLI_addtail(&psys->display, display);
 	return ndisplay;
 }
 
-void BKE_nparticle_display_free(NParticleDisplay *display)
+void BKE_nparticle_display_free(NParticleSystem *psys, NParticleDisplay *display)
 {
+	BLI_remlink(&psys->display, display);
+	
 	MEM_freeN(display);
 }
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index c783d87..eae5a8d 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4258,9 +4258,15 @@ static void direct_link_pagedbuffer(FileData *fd, bPagedBuffer *pbuf)
 
 /* ************ READ NPARTICLE BUFFER ***************** */
 
+static void direct_link_nparticle_display(FileData *UNUSED(fd), NParticleDisplay *UNUSED(display))
+{
+	/* nothing to do here yet */
+}
+
 static void direct_link_nparticle_system(FileData *fd, NParticleSystem *psys)
 {
 	NParticleAttributeState *attrstate;
+	NParticleDisplay *display;
 	
 	link_list(fd, &psys->attributes);
 	
@@ -4270,11 +4276,10 @@ static void direct_link_nparticle_system(FileData *fd, NParticleSystem *psys)
 		for (attrstate = psys->state->attributes.first; attrstate; attrstate = attrstate->next)
 			direct_link_pagedbuffer(fd, &attrstate->data);
 	}
-}
-
-static void direct_link_nparticle_display(FileData *UNUSED(fd), NParticleDisplay *UNUSED(display))
-{
-	/* nothing to do here yet */
+	
+	link_list(fd, &psys->display);
+	for (display = psys->display.first; display; display = display->next)
+		direct_link_nparticle_display(fd, display);
 }
 
 
@@ -4844,13 +4849,9 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
 		}
 		else if (md->type == eModifierType_NParticleSystem) {
 			NParticleSystemModifierData *pmd = (NParticleSystemModifierData *)md;
-			NParticleDisplay *display;
 			
 			pmd->psys = newdataadr(fd, pmd->psys);
 			direct_link_nparticle_system(fd, pmd->psys);
-			link_list(fd, &pmd->display);
-			for (display = pmd->display.first; display; display = display->next)
-				direct_link_nparticle_display(fd, display);
 		}
 		else if (md->type == eModifierType_LaplacianDeform) {
 			LaplacianDeformModifierData *lmd = (LaplacianDeformModifierData *)md;
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 48e49c0..a2b0df6 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1373,9 +1373,15 @@ static void write_pagedbuffer(WriteData *wd, bPagedBuffer *pbuf)
 	}
 }
 
+static void write_nparticle_display(WriteData *wd, NParticleDisplay *display)
+{
+	writestruct(wd, DATA, "NParticleDisplay", 1, display);
+}
+
 static void write_nparticle_system(WriteData *wd, NParticleSystem *psys)
 {
 	NParticleAttribute *attr;
+	NParticleDisplay *display;
 	
 	writestruct(wd, DATA, "NParticleSystem", 1, psys);
 	for (attr = psys->attributes.first; attr; attr = attr->next) {
@@ -1392,11 +1398,9 @@ static void write_nparticle_system(WriteData *wd, NParticleSystem *psys)
 			write_pagedbuffer(wd, &attrstate->data);
 		}
 	}
-}
-
-static void write_nparticle_display(WriteData *wd, NParticleDisplay *display)
-{
-	writestruct(wd, DATA, "NParticleDisplay", 1, display);
+	
+	for (display = psys->display.first; display; display = display->next)
+		write_nparticle_display(wd, display);
 }
 
 static void write_modifiers(WriteData *wd, ListBase *modbase)
@@ -1518,11 +1522,8 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
 		}
 		else if (md->type==eModifierType_NParticleSystem) {
 			NParticleSystemModifierData *pmd = (NParticleSystemModifierData *)md;
-			NParticleDisplay *display;
 			
 			write_nparticle_system(wd, pmd->psys);
-			for (display = pmd->display.first; display; display = display->next)
-				write_nparticle_display(wd, display);
 		}
 		else if (md->type==eModifierType_LaplacianDeform) {
 			LaplacianDeformModifierData *lmd = (LaplacianDeformModifierData*) md;
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 5a59153..9bc2f9c 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -7201,7 +7201,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short
 		
 		glLoadMatrixf(rv3d->viewmat);
 		
-		for (display = pmd->display.first; display; display = display->next)
+		for (display = pmd->psys->display.first; display; display = display->next)
 			draw_nparticles(pmd->psys, display);
 		
 		glMultMatrixf(ob->obmat);
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 85e8dd4..297fc8c 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1368,7 +1368,6 @@ typedef struct NParticleSystemModifierData {
 	ModifierData modifier;
 	
 	struct NParticleSystem *psys;
-	ListBase display;
 } NParticleSystemModifierData;
 
 
diff --git a/source/blender/makesdna/DNA_nparticle_types.h b/source/blender/makesdna/DNA_nparticle_types.h
index cd7d8fd..2055285 100644
--- a/source/blender/makesdna/DNA_nparticle_types.h
+++ b/source/blender/makesdna/DNA_nparticle_types.h
@@ -95,7 +95,9 @@ typedef struct NParticleAttribute {
 typedef struct NParticleSystem {
 	ListBase attributes;				/* definition of available attributes */
 	
-	struct NParticleState *state;
+	struct NParticleState *state;		/* current state */
+	
+	ListBase display;					/* display settings */
 } NParticleSystem;
 
 typedef struct NParticleDisplay {
diff --git a/source/blender/modifiers/intern/MOD_nparticle.c b/source/blender/modifiers/intern/MOD_nparticle.c
index f09954d..0419077 100644
--- a/source/blender/modifiers/intern/MOD_nparticle.c
+++ b/source/blender/modifiers/intern/MOD_nparticle.c
@@ -50,19 +50,12 @@ static void nparticle_system_initData(ModifierData *md)
 	pmd->psys = BKE_nparticle_system_new();
 	
 	/* add default particle display */
-	BLI_addtail(&pmd->display, BKE_nparticle_display_particle());
+	BKE_nparticle_display_add_particle(pmd->psys);
 }
 
 static void nparticle_system_freeData(ModifierData *md)
 {
 	NParticleSystemModifierData *pmd= (NParticleSystemModifierData *)md;
-	NParticleDisplay *display, *display_next;
-	
-	for (display = pmd->display.first; display; display = display_next) {
-		display_next = display->next;
-		BKE_nparticle_display_free(display);
-	}
-	pmd->display.first = pmd->display.last = NULL;
 	
 	BKE_nparticle_system_free(pmd->psys);
 	pmd->psys = NULL;
@@ -72,15 +65,8 @@ static void nparticle_system_copyData(ModifierData *md, ModifierData *target)
 {
 	NParticleSystemModifierDat

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list