[Bf-blender-cvs] [253cb97] gooseberry: Cleanup: Moved particle interpolation code into own file.

Lukas Tönne noreply at git.blender.org
Mon Feb 2 11:25:50 CET 2015


Commit: 253cb9786206126e5127c6e572537a75b8d3fb58
Author: Lukas Tönne
Date:   Sun Feb 1 18:25:46 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB253cb9786206126e5127c6e572537a75b8d3fb58

Cleanup: Moved particle interpolation code into own file.

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

M	source/blender/blenkernel/BKE_particle.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/particle.c
A	source/blender/blenkernel/intern/particle_interpolate.c

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

diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 481043a..5923fc4 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -254,6 +254,25 @@ typedef struct ParticleDrawData {
 	int totpoint, totve;
 } ParticleDrawData;
 
+typedef struct ParticleInterpolationData {
+	struct HairKey *hkey[2];
+
+	struct DerivedMesh *dm;
+	struct MVert *mvert[2];
+
+	int keyed;
+	struct ParticleKey *kkey[2];
+
+	struct PointCache *cache;
+	struct PTCacheMem *pm;
+
+	struct PTCacheEditPoint *epoint;
+	struct PTCacheEditKey *ekey[2];
+
+	float birthtime, dietime;
+	int bspline;
+} ParticleInterpolationData;
+
 #define PARTICLE_DRAW_DATA_UPDATED  1
 
 #define PSYS_FRAND_COUNT    1024
@@ -352,6 +371,10 @@ float psys_get_child_size(struct ParticleSystem *psys, struct ChildParticle *cpa
 void psys_get_particle_on_path(struct ParticleSimulationData *sim, int pa_num, struct ParticleKey *state, const bool vel);
 int psys_get_particle_state(struct ParticleSimulationData *sim, int p, struct ParticleKey *state, int always);
 
+/* interpolation */
+void init_particle_interpolation(struct Object *ob, struct ParticleSystem *psys, struct ParticleData *pa, struct ParticleInterpolationData *pind);
+void do_particle_interpolation(struct ParticleSystem *psys, int p, struct ParticleData *pa, float t, struct ParticleInterpolationData *pind, struct ParticleKey *result);
+
 /* child paths */
 void BKE_particlesettings_clump_curve_init(struct ParticleSettings *part);
 void BKE_particlesettings_rough_curve_init(struct ParticleSettings *part);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index a943ad6..d61d6ee 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -140,6 +140,7 @@ set(SRC
 	intern/particle.c
 	intern/particle_child.c
 	intern/particle_distribute.c
+	intern/particle_interpolate.c
 	intern/particle_system.c
 	intern/pbvh.c
 	intern/pbvh_bmesh.c
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index d3f5664..69ac78e 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -804,400 +804,6 @@ bool psys_render_simplify_params(ParticleSystem *psys, ChildParticle *cpa, float
 }
 
 /************************************************/
-/*			Interpolation						*/
-/************************************************/
-static float interpolate_particle_value(float v1, float v2, float v3, float v4, const float w[4], int four)
-{
-	float value;
-
-	value = w[0] * v1 + w[1] * v2 + w[2] * v3;
-	if (four)
-		value += w[3] * v4;
-
-	CLAMP(value, 0.f, 1.f);
-	
-	return value;
-}
-
-void psys_interpolate_particle(short type, ParticleKey keys[4], float dt, ParticleKey *result, bool velocity)
-{
-	float t[4];
-
-	if (type < 0) {
-		interp_cubic_v3(result->co, result->vel, keys[1].co, keys[1].vel, keys[2].co, keys[2].vel, dt);
-	}
-	else {
-		key_curve_position_weights(dt, t, type);
-
-		interp_v3_v3v3v3v3(result->co, keys[0].co, keys[1].co, keys[2].co, keys[3].co, t);
-
-		if (velocity) {
-			float temp[3];
-
-			if (dt > 0.999f) {
-				key_curve_position_weights(dt - 0.001f, t, type);
-				interp_v3_v3v3v3v3(temp, keys[0].co, keys[1].co, keys[2].co, keys[3].co, t);
-				sub_v3_v3v3(result->vel, result->co, temp);
-			}
-			else {
-				key_curve_position_weights(dt + 0.001f, t, type);
-				interp_v3_v3v3v3v3(temp, keys[0].co, keys[1].co, keys[2].co, keys[3].co, t);
-				sub_v3_v3v3(result->vel, temp, result->co);
-			}
-		}
-	}
-}
-
-
-typedef struct ParticleInterpolationData {
-	HairKey *hkey[2];
-
-	DerivedMesh *dm;
-	MVert *mvert[2];
-
-	int keyed;
-	ParticleKey *kkey[2];
-
-	PointCache *cache;
-	PTCacheMem *pm;
-
-	PTCacheEditPoint *epoint;
-	PTCacheEditKey *ekey[2];
-
-	float birthtime, dietime;
-	int bspline;
-} ParticleInterpolationData;
-/* Assumes pointcache->mem_cache exists, so for disk cached particles call psys_make_temp_pointcache() before use */
-/* It uses ParticleInterpolationData->pm to store the current memory cache frame so it's thread safe. */
-static void get_pointcache_keys_for_time(Object *UNUSED(ob), PointCache *cache, PTCacheMem **cur, int index, float t, ParticleKey *key1, ParticleKey *key2)
-{
-	static PTCacheMem *pm = NULL;
-	int index1, index2;
-
-	if (index < 0) { /* initialize */
-		*cur = cache->mem_cache.first;
-
-		if (*cur)
-			*cur = (*cur)->next;
-	}
-	else {
-		if (*cur) {
-			while (*cur && (*cur)->next && (float)(*cur)->frame < t)
-				*cur = (*cur)->next;
-
-			pm = *cur;
-
-			index2 = BKE_ptcache_mem_index_find(pm, index);
-			index1 = BKE_ptcache_mem_index_find(pm->prev, index);
-
-			BKE_ptcache_make_particle_key(key2, index2, pm->data, (float)pm->frame);
-			if (index1 < 0)
-				copy_particle_key(key1, key2, 1);
-			else
-				BKE_ptcache_make_particle_key(key1, index1, pm->prev->data, (float)pm->prev->frame);
-		}
-		else if (cache->mem_cache.first) {
-			pm = cache->mem_cache.first;
-			index2 = BKE_ptcache_mem_index_find(pm, index);
-			BKE_ptcache_make_particle_key(key2, index2, pm->data, (float)pm->frame);
-			copy_particle_key(key1, key2, 1);
-		}
-	}
-}
-static int get_pointcache_times_for_particle(PointCache *cache, int index, float *start, float *end)
-{
-	PTCacheMem *pm;
-	int ret = 0;
-
-	for (pm = cache->mem_cache.first; pm; pm = pm->next) {
-		if (BKE_ptcache_mem_index_find(pm, index) >= 0) {
-			*start = pm->frame;
-			ret++;
-			break;
-		}
-	}
-
-	for (pm = cache->mem_cache.last; pm; pm = pm->prev) {
-		if (BKE_ptcache_mem_index_find(pm, index) >= 0) {
-			*end = pm->frame;
-			ret++;
-			break;
-		}
-	}
-
-	return ret == 2;
-}
-
-float psys_get_dietime_from_cache(PointCache *cache, int index)
-{
-	PTCacheMem *pm;
-	int dietime = 10000000; /* some max value so that we can default to pa->time+lifetime */
-
-	for (pm = cache->mem_cache.last; pm; pm = pm->prev) {
-		if (BKE_ptcache_mem_index_find(pm, index) >= 0)
-			return (float)pm->frame;
-	}
-
-	return (float)dietime;
-}
-
-static void init_particle_interpolation(Object *ob, ParticleSystem *psys, ParticleData *pa, ParticleInterpolationData *pind)
-{
-
-	if (pind->epoint) {
-		PTCacheEditPoint *point = pind->epoint;
-
-		pind->ekey[0] = point->keys;
-		pind->ekey[1] = point->totkey > 1 ? point->keys + 1 : NULL;
-
-		pind->birthtime = *(point->keys->time);
-		pind->dietime = *((point->keys + point->totkey - 1)->time);
-	}
-	else if (pind->keyed) {
-		ParticleKey *key = pa->keys;
-		pind->kkey[0] = key;
-		pind->kkey[1] = pa->totkey > 1 ? key + 1 : NULL;
-
-		pind->birthtime = key->time;
-		pind->dietime = (key + pa->totkey - 1)->time;
-	}
-	else if (pind->cache) {
-		float start = 0.0f, end = 0.0f;
-		get_pointcache_keys_for_time(ob, pind->cache, &pind->pm, -1, 0.0f, NULL, NULL);
-		pind->birthtime = pa ? pa->time : pind->cache->startframe;
-		pind->dietime = pa ? pa->dietime : pind->cache->endframe;
-
-		if (get_pointcache_times_for_particle(pind->cache, pa - psys->particles, &start, &end)) {
-			pind->birthtime = MAX2(pind->birthtime, start);
-			pind->dietime = MIN2(pind->dietime, end);
-		}
-	}
-	else {
-		HairKey *key = pa->hair;
-		pind->hkey[0] = key;
-		pind->hkey[1] = key + 1;
-
-		pind->birthtime = key->time;
-		pind->dietime = (key + pa->totkey - 1)->time;
-
-		if (pind->dm) {
-			pind->mvert[0] = CDDM_get_vert(pind->dm, pa->hair_index);
-			pind->mvert[1] = pind->mvert[0] + 1;
-		}
-	}
-}
-static void edit_to_particle(ParticleKey *key, PTCacheEditKey *ekey)
-{
-	copy_v3_v3(key->co, ekey->co);
-	if (ekey->vel) {
-		copy_v3_v3(key->vel, ekey->vel);
-	}
-	key->time = *(ekey->time);
-}
-static void hair_to_particle(ParticleKey *key, HairKey *hkey)
-{
-	copy_v3_v3(key->co, hkey->co);
-	key->time = hkey->time;
-}
-
-static void mvert_to_particle(ParticleKey *key, MVert *mvert, HairKey *hkey)
-{
-	copy_v3_v3(key->co, mvert->co);
-	key->time = hkey->time;
-}
-
-static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData *pa, float t, ParticleInterpolationData *pind, ParticleKey *result)
-{
-	PTCacheEditPoint *point = pind->epoint;
-	ParticleKey keys[4];
-	int point_vel = (point && point->keys->vel);
-	float real_t, dfra, keytime, invdt = 1.f;
-
-	/* billboards wont fill in all of these, so start cleared */
-	memset(keys, 0, sizeof(keys));
-
-	/* interpret timing and find keys */
-	if (point) {
-		if (result->time < 0.0f)
-			real_t = -result->time;
-		else
-			real_t = *(pind->ekey[0]->time) + t * (*(pind->ekey[0][point->totkey - 1].time) - *(pind->ekey[0]->time));
-
-		while (*(pind->ekey[1]->time) < real_t)
-			pind->ekey[1]++;
-
-		pind->ekey[0] = pind->ekey[1] - 1;
-	}
-	else if (pind->keyed) {
-		/* we have only one key, so let's use that */
-		if (pind->kkey[1] == NULL) {
-			copy_particle_key(result, pind->kkey[0], 1);
-			return;
-		}
-
-		if (result->time < 0.0f)
-			real_t = -result->time;
-		else
-			real_t = pind->kkey[0]->time + t * (pind->kkey[0][pa->totkey - 1].time - pind->kkey[0]->time);
-
-		if (psys->part->phystype == PART_PHYS_KEYED && psys->flag & PSYS_KEYED_TIMING) {
-			ParticleTarget *pt = psys->targets.first;
-
-			pt = pt->next;
-
-			while (pt && pa->time + pt->time < real_t)
-				pt = pt->next;
-
-			if (pt) {
-				pt = pt->prev;
-
-				if (pa->time + pt->time + pt->duration > real_t)
-					real_t = pa->time + pt->time;
-			}
-			else
-				real_t = pa->time + ((ParticleTarget *)psys->targets.last)->time;
-		}
-
-		CLAMP(real_t, pa->time, pa->dietime);
-
-		while (pind->kkey[1]->time < real_t)
-			pind->kkey[1]++;
-		
-		pind->kkey[0] = pind->kkey[1] - 1;
-	}
-	else if (pind->cache) {
-		if (result->time < 0.0f) /* flag for time in frames */
-			real_t = -result->time;
-		else
-			real_t = pa->time + t * (pa->dietime - pa->time);
-	}
-	else {
-		if (result->time < 0.0f)
-			real_t = -result->time;
-		else
-			real_t = pind->hkey[0]->time + t * (pind->hkey[0][pa->totkey - 1].time - pind->hkey[0]->time);
-
-		while (pind->hkey[1]->time < real_t) {
-			pind->hkey[1]++;
-			pind->mvert[1]++;
-		}
-
-		pind->hkey[0] = pind->hkey[1] - 1;
-	}
-
-	/* set actual interpolation keys */
-	if (point) {
-		edit_to_particle(keys + 1, pind->ekey[0]);
-	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list