[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23009] branches/blender2.5/blender: Some particles cleanup & fixes:

Janne Karhu jhkarh at utu.fi
Sat Sep 5 01:06:16 CEST 2009


Revision: 23009
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23009
Author:   jhk
Date:     2009-09-05 01:06:15 +0200 (Sat, 05 Sep 2009)

Log Message:
-----------
Some particles cleanup & fixes:
- Some big refresh issues with softbody & cloth point cache usage should now be fixed.
- Removed sticky objects from particles (better stuff will come back when I get to updating reactor particles).
- Some initial easy memory efficiency cleanup for ParticleData struct. The ultimate goal is to get particles less memory hungry -> more particles possible in single scene.
- Wrong path timing clamping caused hair particles to seem disappeared when changing between normal<->hair particles.
- "Calculate to current frame" in cache buttons baked instead of the intended function.
- Boids particle data is now a bit better organized.

Modified Paths:
--------------
    branches/blender2.5/blender/release/ui/buttons_particle.py
    branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/boids.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/cloth.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/object.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/particle_system.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/softbody.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/object/object_edit.c
    branches/blender2.5/blender/source/blender/editors/physics/ed_pointcache.c
    branches/blender2.5/blender/source/blender/editors/physics/editparticle.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_particle_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_particle.c
    branches/blender2.5/blender/source/blender/render/intern/source/convertblender.c

Modified: branches/blender2.5/blender/release/ui/buttons_particle.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_particle.py	2009-09-04 22:50:15 UTC (rev 23008)
+++ branches/blender2.5/blender/release/ui/buttons_particle.py	2009-09-04 23:06:15 UTC (rev 23009)
@@ -396,7 +396,6 @@
 		if part.physics_type=='NEWTON':
 			sub.itemR(part, "size_deflect")
 			sub.itemR(part, "die_on_collision")
-			sub.itemR(part, "sticky")
 		elif part.physics_type=='KEYED' or part.physics_type=='BOIDS':
 			if part.physics_type=='BOIDS':
 				layout.itemL(text="Relations:")

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h	2009-09-04 22:50:15 UTC (rev 23008)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h	2009-09-04 23:06:15 UTC (rev 23009)
@@ -59,6 +59,9 @@
 struct BVHTreeRay;
 struct BVHTreeRayHit; 
 
+#define PARTICLE_P				ParticleData *pa; int p
+#define LOOP_PARTICLES	for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++)
+
 typedef struct ParticleEffectorCache {
 	struct ParticleEffectorCache *next, *prev;
 	struct Object *ob;
@@ -207,6 +210,7 @@
 void psys_free_path_cache(struct ParticleSystem *psys, struct PTCacheEdit *edit);
 void free_hair(struct ParticleSystem *psys, int softbody);
 void free_keyed_keys(struct ParticleSystem *psys);
+void psys_free_particles(struct ParticleSystem *psys);
 void psys_free(struct Object * ob, struct ParticleSystem * psys);
 void psys_free_children(struct ParticleSystem *psys);
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/boids.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/boids.c	2009-09-04 22:50:15 UTC (rev 23008)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/boids.c	2009-09-04 23:06:15 UTC (rev 23009)
@@ -74,6 +74,7 @@
 	BoidSettings *boids = bbd->part->boids;
 	ParticleEffectorCache *ec;
 	Object *priority_ob = NULL;
+	BoidParticle *bpa = pa->boid;
 	float vec[3] = {0.0f, 0.0f, 0.0f}, loc[3] = {0.0f, 0.0f, 0.0f};
 	float mul = (rule->type == eBoidRuleType_Avoid ? 1.0 : -1.0);
 	float priority = 0.0f, len = 0.0f;
@@ -81,7 +82,7 @@
 
 	/* first find out goal/predator with highest priority */
 	/* if rule->ob specified use it */
-	if(gabr->ob && (rule->type != eBoidRuleType_Goal || gabr->ob != pa->stick_ob)) {
+	if(gabr->ob && (rule->type != eBoidRuleType_Goal || gabr->ob != bpa->ground)) {
 		PartDeflect *pd = gabr->ob->pd;
 		float vec_to_part[3];
 
@@ -104,7 +105,7 @@
 			PartDeflect *pd = eob->pd;
 
 			/* skip current object */
-			if(rule->type == eBoidRuleType_Goal && eob == pa->stick_ob)
+			if(rule->type == eBoidRuleType_Goal && eob == bpa->ground)
 				continue;
 
 			if(pd->forcefield == PFIELD_BOID && mul * pd->f_strength > 0.0f) {
@@ -169,10 +170,10 @@
 				VECCOPY(bbd->goal_nor, nor);
 			}
 		}
-		else if(rule->type == eBoidRuleType_Avoid && pa->boid->mode == eBoidMode_Climbing &&
+		else if(rule->type == eBoidRuleType_Avoid && bpa->data.mode == eBoidMode_Climbing &&
 			priority > 2.0f * gabr->fear_factor) {
 			/* detach from surface and try to fly away from danger */
-			VECCOPY(vec_to_part, pa->r_ve);
+			VECCOPY(vec_to_part, bpa->gravity);
 			VecMulf(vec_to_part, -1.0f);
 		}
 
@@ -205,6 +206,7 @@
 	KDTreeNearest *ptn = NULL;
 	ParticleEffectorCache *ec;
 	ParticleTarget *pt;
+	BoidParticle *bpa = pa->boid;
 	float vec[3] = {0.0f, 0.0f, 0.0f}, loc[3] = {0.0f, 0.0f, 0.0f};
 	float co1[3], vel1[3], co2[3], vel2[3];
 	float  len, t, inp, t_min = 2.0f;
@@ -231,7 +233,7 @@
 				Object *eob = ec->ob;
 
 				/* don't check with current ground object */
-				if(eob == pa->stick_ob)
+				if(eob == bpa->ground)
 					continue;
 
 				col.md = ( CollisionModifierData * ) ( modifiers_findByType ( eob, eModifierType_Collision ) );
@@ -558,18 +560,19 @@
 }
 static int rule_average_speed(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
 {
+	BoidParticle *bpa = pa->boid;
 	BoidRuleAverageSpeed *asbr = (BoidRuleAverageSpeed*)rule;
 	float vec[3] = {0.0f, 0.0f, 0.0f};
 
 	if(asbr->wander > 0.0f) {
 		/* abuse pa->r_ave for wandering */
-		pa->r_ave[0] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
-		pa->r_ave[1] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
-		pa->r_ave[2] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
+		bpa->wander[0] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
+		bpa->wander[1] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
+		bpa->wander[2] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
 
-		Normalize(pa->r_ave);
+		Normalize(bpa->wander);
 
-		VECCOPY(vec, pa->r_ave);
+		VECCOPY(vec, bpa->wander);
 
 		QuatMulVecf(pa->prev_state.rot, vec);
 
@@ -615,6 +618,7 @@
 	ParticleTarget *pt;
 	ParticleData *epars;
 	ParticleData *enemy_pa = NULL;
+	BoidParticle *bpa;
 	/* friends & enemies */
 	float closest_enemy[3] = {0.0f,0.0f,0.0f};
 	float closest_dist = fbr->distance + 1.0f;
@@ -624,8 +628,10 @@
 
 	/* calculate own group strength */
 	int neighbors = BLI_kdtree_range_search(bbd->psys->tree, fbr->distance, pa->prev_state.co, NULL, &ptn);
-	for(n=0; n<neighbors; n++)
-		health += bbd->psys->particles[ptn[n].index].boid->health;
+	for(n=0; n<neighbors; n++) {
+		bpa = bbd->psys->particles[ptn[n].index].boid;
+		health += bpa->data.health;
+	}
 
 	f_strength += bbd->part->boids->strength * health;
 
@@ -642,7 +648,8 @@
 			health = 0.0f;
 
 			for(n=0; n<neighbors; n++) {
-				health += epars[ptn[n].index].boid->health;
+				bpa = epars[ptn[n].index].boid;
+				health += bpa->data.health;
 
 				if(n==0 && pt->mode==PTARGET_MODE_ENEMY && ptn[n].dist < closest_dist) {
 					VECCOPY(closest_enemy, ptn[n].co);
@@ -674,7 +681,8 @@
 
 			/* must face enemy to fight */
 			if(Inpf(pa->prev_state.ave, enemy_dir)>0.5f) {
-				enemy_pa->boid->health -= bbd->part->boids->strength * bbd->timestep * ((1.0f-bbd->part->boids->accuracy)*damage + bbd->part->boids->accuracy);
+				bpa = enemy_pa->boid;
+				bpa->data.health -= bbd->part->boids->strength * bbd->timestep * ((1.0f-bbd->part->boids->accuracy)*damage + bbd->part->boids->accuracy);
 			}
 		}
 		else {
@@ -683,7 +691,8 @@
 		}
 
 		/* check if boid doesn't want to fight */
-		if(pa->boid->health/bbd->part->boids->health * bbd->part->boids->aggression < e_strength / f_strength) {
+		bpa = pa->boid;
+		if(bpa->data.health/bbd->part->boids->health * bbd->part->boids->aggression < e_strength / f_strength) {
 			/* decide to flee */
 			if(closest_dist < fbr->flee_distance * fbr->distance) {
 				VecMulf(bbd->wanted_co, -1.0f);
@@ -721,18 +730,20 @@
 
 static void set_boid_values(BoidValues *val, BoidSettings *boids, ParticleData *pa)
 {
-	if(ELEM(pa->boid->mode, eBoidMode_OnLand, eBoidMode_Climbing)) {
-		val->max_speed = boids->land_max_speed * pa->boid->health/boids->health;
+	BoidParticle *bpa = pa->boid;
+
+	if(ELEM(bpa->data.mode, eBoidMode_OnLand, eBoidMode_Climbing)) {
+		val->max_speed = boids->land_max_speed * bpa->data.health/boids->health;
 		val->max_acc = boids->land_max_acc * val->max_speed;
-		val->max_ave = boids->land_max_ave * M_PI * pa->boid->health/boids->health;
+		val->max_ave = boids->land_max_ave * M_PI * bpa->data.health/boids->health;
 		val->min_speed = 0.0f; /* no minimum speed on land */
 		val->personal_space = boids->land_personal_space;
-		val->jump_speed = boids->land_jump_speed * pa->boid->health/boids->health;
+		val->jump_speed = boids->land_jump_speed * bpa->data.health/boids->health;
 	}
 	else {
-		val->max_speed = boids->air_max_speed * pa->boid->health/boids->health;
+		val->max_speed = boids->air_max_speed * bpa->data.health/boids->health;
 		val->max_acc = boids->air_max_acc * val->max_speed;
-		val->max_ave = boids->air_max_ave * M_PI * pa->boid->health/boids->health;
+		val->max_ave = boids->air_max_ave * M_PI * bpa->data.health/boids->health;
 		val->min_speed = boids->air_min_speed * boids->air_max_speed;
 		val->personal_space = boids->air_personal_space;
 		val->jump_speed = 0.0f; /* no jumping in air */
@@ -740,11 +751,13 @@
 }
 static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *ground_co, float *ground_nor)
 {
-	if(pa->boid->mode == eBoidMode_Climbing) {
+	BoidParticle *bpa = pa->boid;
+
+	if(bpa->data.mode == eBoidMode_Climbing) {
 		SurfaceModifierData *surmd = NULL;
 		float x[3], v[3];
 
-		surmd = (SurfaceModifierData *)modifiers_findByType ( pa->stick_ob, eModifierType_Surface );
+		surmd = (SurfaceModifierData *)modifiers_findByType ( bpa->ground, eModifierType_Surface );
 
 		/* take surface velocity into account */
 		effector_find_co(bbd->scene, pa->state.co, surmd, NULL, NULL, x, NULL, v, NULL);
@@ -753,7 +766,7 @@
 		/* get actual position on surface */
 		effector_find_co(bbd->scene, x, surmd, NULL, NULL, ground_co, ground_nor, NULL, NULL);
 
-		return pa->stick_ob;
+		return bpa->ground;
 	}
 	else {
 		float zvec[3] = {0.0f, 0.0f, 2000.0f};
@@ -803,13 +816,15 @@
 }
 static int boid_rule_applies(ParticleData *pa, BoidSettings *boids, BoidRule *rule)
 {
+	BoidParticle *bpa = pa->boid;
+
 	if(rule==NULL)
 		return 0;
 	
-	if(ELEM(pa->boid->mode, eBoidMode_OnLand, eBoidMode_Climbing) && rule->flag & BOIDRULE_ON_LAND)
+	if(ELEM(bpa->data.mode, eBoidMode_OnLand, eBoidMode_Climbing) && rule->flag & BOIDRULE_ON_LAND)
 		return 1;
 	
-	if(pa->boid->mode==eBoidMode_InAir && rule->flag & BOIDRULE_IN_AIR)
+	if(bpa->data.mode==eBoidMode_InAir && rule->flag & BOIDRULE_IN_AIR)
 		return 1;
 
 	return 0;
@@ -835,12 +850,13 @@
 }
 static void boid_climb(BoidSettings *boids, ParticleData *pa, float *surface_co, float *surface_nor)
 {
+	BoidParticle *bpa = pa->boid;
 	float nor[3], vel[3];
 	VECCOPY(nor, surface_nor);
 
-	/* gather apparent gravity to r_ve */
-	VECADDFAC(pa->r_ve, pa->r_ve, surface_nor, -1.0);
-	Normalize(pa->r_ve);
+	/* gather apparent gravity */
+	VECADDFAC(bpa->gravity, bpa->gravity, surface_nor, -1.0);
+	Normalize(bpa->gravity);
 
 	/* raise boid it's size from surface */
 	VecMulf(nor, pa->size * boids->height);
@@ -877,16 +893,17 @@
 }
 static BoidState *get_boid_state(BoidSettings *boids, ParticleData *pa) {
 	BoidState *state = boids->states.first;
+	BoidParticle *bpa = pa->boid;
 
 	for(; state; state=state->next) {
-		if(state->id==pa->boid->state_id)
+		if(state->id==bpa->data.state_id)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list