[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12695] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Nov 27 18:20:35 CET 2007


Revision: 12695
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12695
Author:   blendix
Date:     2007-11-27 18:20:35 +0100 (Tue, 27 Nov 2007)

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

Particles
=========

- Fix for child particles disappearing with right mouse drag translation.
- Added partial cache updates for selection, should make it a bit faster.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/include/BIF_editparticle.h
    trunk/blender/source/blender/src/editparticle.c

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2007-11-27 16:16:47 UTC (rev 12694)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2007-11-27 17:20:35 UTC (rev 12695)
@@ -2975,6 +2975,7 @@
 
 			psmd->dm=0;
 			psmd->psys=newdataadr(fd, psmd->psys);
+			psmd->flag |= eParticleSystemFlag_Loaded;
 			psmd->flag &= ~eParticleSystemFlag_psys_updated;
 		} else if (md->type==eModifierType_Explode) {
 			ExplodeModifierData *psmd = (ExplodeModifierData*) md;

Modified: trunk/blender/source/blender/include/BIF_editparticle.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editparticle.h	2007-11-27 16:16:47 UTC (rev 12694)
+++ trunk/blender/source/blender/include/BIF_editparticle.h	2007-11-27 17:20:35 UTC (rev 12695)
@@ -56,7 +56,7 @@
 /* update calls */
 void PE_hide_keys_time(struct ParticleSystem *psys, float cfra);
 void PE_update_object(struct Object *ob, int useflag);
-void PE_update_selection(struct Object *ob);
+void PE_update_selection(struct Object *ob, int useflag);
 void PE_recalc_world_cos(struct Object *ob, struct ParticleSystem *psys);
 
 /* selection tools */

Modified: trunk/blender/source/blender/src/editparticle.c
===================================================================
--- trunk/blender/source/blender/src/editparticle.c	2007-11-27 16:16:47 UTC (rev 12694)
+++ trunk/blender/source/blender/src/editparticle.c	2007-11-27 17:20:35 UTC (rev 12695)
@@ -954,17 +954,25 @@
 	BLI_kdtree_balance(edit->emitter_field);
 }
 
-void PE_update_selection(Object *ob)
+void PE_update_selection(Object *ob, int useflag)
 {
 	ParticleSystem *psys= PE_get_current(ob);
 	ParticleEdit *edit= psys->edit;
+	ParticleEditSettings *pset= PE_settings();
+	ParticleSettings *part= psys->part;
 	ParticleData *pa;
 	HairKey *hkey;
 	ParticleEditKey *key;
+	float cfra= CFRA;
 	int i, k, totpart;
 
 	totpart= psys->totpart;
 
+	/* flag all particles to be updated if not using flag */
+	if(!useflag)
+		LOOP_PARTICLES(i,pa)
+			pa->flag |= PARS_EDIT_RECALC;
+
 	/* flush edit key flag to hair key flag to preserve selection 
 	 * on save */
 	LOOP_PARTICLES(i,pa) {
@@ -974,7 +982,14 @@
 			hkey->editflag= key->flag;
 	}
 
-	psys_cache_paths(ob, psys, CFRA, 0);
+	psys_cache_paths(ob, psys, CFRA, 1);
+
+	if(part->childtype && (pset->flag & PE_SHOW_CHILD))
+		psys_cache_child_paths(ob, psys, cfra, 1);
+
+	/* disable update flag */
+	LOOP_PARTICLES(i,pa)
+		pa->flag &= ~PARS_EDIT_RECALC;
 }
 
 void PE_update_object(Object *ob, int useflag)
@@ -1109,12 +1124,15 @@
 static void select_key(ParticleSystem *psys, int pa_index, int key_index, void *userData)
 {
 	struct { short *mval; float rad; rcti* rect; int select; } *data = userData;
+	ParticleData *pa = psys->particles + pa_index;
 	ParticleEditKey *key = psys->edit->keys[pa_index] + key_index;
 
 	if(data->select)
 		key->flag|=PEK_SELECT;
 	else
 		key->flag&=~PEK_SELECT;
+
+	pa->flag |= PARS_EDIT_RECALC;
 }
 static void select_keys(ParticleSystem *psys, int pa_index, int key_index, void *userData)
 {
@@ -1130,13 +1148,18 @@
 			key->flag&=~PEK_SELECT;
 	}
 
+	pa->flag |= PARS_EDIT_RECALC;
 }
 static void toggle_key_select(ParticleSystem *psys, int pa_index, int key_index, void *userData)
 {
+	ParticleData *pa = psys->particles + pa_index;
+
 	if(psys->edit->keys[pa_index][key_index].flag&PEK_SELECT)
 		psys->edit->keys[pa_index][key_index].flag&=~PEK_SELECT;
 	else
 		psys->edit->keys[pa_index][key_index].flag|=PEK_SELECT;
+	
+	pa->flag |= PARS_EDIT_RECALC;
 }
 static void select_root(ParticleSystem *psys, int index, void *userData)
 {
@@ -1234,6 +1257,7 @@
 			if(key->flag&PEK_SELECT){
 				sel = 1;
 				key->flag &= ~PEK_SELECT;
+				pa->flag |= PARS_EDIT_RECALC;
 			}
 		}
 	}
@@ -1242,12 +1266,15 @@
 		LOOP_PARTICLES(i,pa){
 			if(pa->flag & PARS_HIDE) continue;
 			LOOP_KEYS(k,key){
-				key->flag |= PEK_SELECT;
+				if(!(key->flag & PEK_SELECT)) {
+					key->flag |= PEK_SELECT;
+					pa->flag |= PARS_EDIT_RECALC;
+				}
 			}
 		}
 	}
 
-	PE_update_selection(ob);
+	PE_update_selection(ob, 1);
 
 	BIF_undo_push("(De)select all keys");
 	allqueue(REDRAWVIEW3D, 1);
@@ -1278,7 +1305,10 @@
 		LOOP_PARTICLES(i,pa){
 			if(pa->flag & PARS_HIDE) continue;
 			LOOP_KEYS(k,key){
-				key->flag &= ~PEK_SELECT;
+				if(key->flag & PEK_SELECT) {
+					key->flag &= ~PEK_SELECT;
+					pa->flag |= PARS_EDIT_RECALC;
+				}
 			}
 		}
 
@@ -1291,7 +1321,7 @@
 
 	for_mouse_hit_keys(1,psys,toggle_key_select,&data);
 
-	PE_update_selection(ob);
+	PE_update_selection(ob, 1);
 
 	rightmouse_transform();
 
@@ -1335,7 +1365,7 @@
 
 	for_mouse_hit_keys(1,psys,select_keys,&data);
 
-	PE_update_selection(ob);
+	PE_update_selection(ob, 1);
 
 	BIF_undo_push("Select linked keys");
 
@@ -1364,7 +1394,7 @@
 
 	for_mouse_hit_keys(0,psys,select_key,&data);
 
-	PE_update_selection(ob);
+	PE_update_selection(ob, 1);
 
 	BIF_undo_push("Select keys");
 
@@ -1417,10 +1447,14 @@
 				Mat4MulVecfl(mat, co);
 				project_short(co,vertco);
 				if(lasso_inside(mcords,moves,vertco[0],vertco[1])){
-					if(select)
+					if(select && !(key->flag & PEK_SELECT)) {
 						key->flag|=PEK_SELECT;
-					else
+						pa->flag |= PARS_EDIT_RECALC;
+					}
+					else if(key->flag & PEK_SELECT) {
 						key->flag&=~PEK_SELECT;
+						pa->flag |= PARS_EDIT_RECALC;
+					}
 				}
 			}
 		}
@@ -1431,15 +1465,19 @@
 			Mat4MulVecfl(mat, co);
 			project_short(co,vertco);
 			if(lasso_inside(mcords,moves,vertco[0],vertco[1])){
-				if(select)
+				if(select && !(key->flag & PEK_SELECT)) {
 					key->flag|=PEK_SELECT;
-				else
+					pa->flag |= PARS_EDIT_RECALC;
+				}
+				else if(key->flag & PEK_SELECT) {
 					key->flag&=~PEK_SELECT;
+					pa->flag |= PARS_EDIT_RECALC;
+				}
 			}
 		}
 	}
 
-	PE_update_selection(ob);
+	PE_update_selection(ob, 1);
 
 	BIF_undo_push("Lasso select particles");
 





More information about the Bf-blender-cvs mailing list