[Bf-blender-cvs] [2f1631f] gooseberry: Moved render simplification function for particle distribution into the distribution code.

Lukas Tönne noreply at git.blender.org
Thu Oct 30 15:59:50 CET 2014


Commit: 2f1631f747875c70c069f815b7ca5d2736f94637
Author: Lukas Tönne
Date:   Tue Oct 28 17:16:59 2014 +0100
Branches: gooseberry
https://developer.blender.org/rB2f1631f747875c70c069f815b7ca5d2736f94637

Moved render simplification function for particle distribution into the
distribution code.

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

M	source/blender/blenkernel/BKE_particle.h
M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenkernel/intern/particle_distribute.c

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

diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 44cd44f..a49b3bf 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -307,7 +307,6 @@ void psys_free(struct Object *ob, struct ParticleSystem *psys);
 
 void psys_render_set(struct Object *ob, struct ParticleSystem *psys, float viewmat[4][4], float winmat[4][4], int winx, int winy, int timeoffset);
 void psys_render_restore(struct Object *ob, struct ParticleSystem *psys);
-int psys_render_simplify_distribution(struct ParticleThreadContext *ctx, int tot);
 bool psys_render_simplify_params(struct ParticleSystem *psys, struct ChildParticle *cpa, float *params);
 
 void psys_interpolate_uvs(const struct MTFace *tface, int quad, const float w[4], float uvco[2]);
@@ -419,6 +418,33 @@ void reset_particle(struct ParticleSimulationData *sim, struct ParticleData *pa,
 
 float psys_get_current_display_percentage(struct ParticleSystem *psys);
 
+typedef struct ParticleRenderElem {
+	int curchild, totchild, reduce;
+	float lambda, t, scalemin, scalemax;
+} ParticleRenderElem;
+
+typedef struct ParticleRenderData {
+	ChildParticle *child;
+	ParticleCacheKey **pathcache;
+	ParticleCacheKey **childcache;
+	ListBase pathcachebufs, childcachebufs;
+	int totchild, totcached, totchildcache;
+	struct DerivedMesh *dm;
+	int totdmvert, totdmedge, totdmface;
+
+	float mat[4][4];
+	float viewmat[4][4], winmat[4][4];
+	int winx, winy;
+
+	int do_simplify;
+	int timeoffset;
+	ParticleRenderElem *elems;
+
+	/* ORIGINDEX */
+	const int *index_mf_to_mpoly;
+	const int *index_mp_to_orig;
+} ParticleRenderData;
+
 /* psys_reset */
 #define PSYS_RESET_ALL          1
 #define PSYS_RESET_DEPSGRAPH    2
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index df7ca19..e3f4cf1 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -624,89 +624,6 @@ void psys_free(Object *ob, ParticleSystem *psys)
  * rendering, to make different render settings possible without
  * removing the previous data. this should be solved properly once */
 
-typedef struct ParticleRenderElem {
-	int curchild, totchild, reduce;
-	float lambda, t, scalemin, scalemax;
-} ParticleRenderElem;
-
-typedef struct ParticleRenderData {
-	ChildParticle *child;
-	ParticleCacheKey **pathcache;
-	ParticleCacheKey **childcache;
-	ListBase pathcachebufs, childcachebufs;
-	int totchild, totcached, totchildcache;
-	DerivedMesh *dm;
-	int totdmvert, totdmedge, totdmface;
-
-	float mat[4][4];
-	float viewmat[4][4], winmat[4][4];
-	int winx, winy;
-
-	int do_simplify;
-	int timeoffset;
-	ParticleRenderElem *elems;
-
-	/* ORIGINDEX */
-	const int *index_mf_to_mpoly;
-	const int *index_mp_to_orig;
-} ParticleRenderData;
-
-static float psys_render_viewport_falloff(double rate, float dist, float width)
-{
-	return pow(rate, dist / width);
-}
-
-static float psys_render_projected_area(ParticleSystem *psys, const float center[3], float area, double vprate, float *viewport)
-{
-	ParticleRenderData *data = psys->renderdata;
-	float co[4], view[3], ortho1[3], ortho2[3], w, dx, dy, radius;
-	
-	/* transform to view space */
-	copy_v3_v3(co, center);
-	co[3] = 1.0f;
-	mul_m4_v4(data->viewmat, co);
-	
-	/* compute two vectors orthogonal to view vector */
-	normalize_v3_v3(view, co);
-	ortho_basis_v3v3_v3(ortho1, ortho2, view);
-
-	/* compute on screen minification */
-	w = co[2] * data->winmat[2][3] + data->winmat[3][3];
-	dx = data->winx * ortho2[0] * data->winmat[0][0];
-	dy = data->winy * ortho2[1] * data->winmat[1][1];
-	w = sqrtf(dx * dx + dy * dy) / w;
-
-	/* w squared because we are working with area */
-	area = area * w * w;
-
-	/* viewport of the screen test */
-
-	/* project point on screen */
-	mul_m4_v4(data->winmat, co);
-	if (co[3] != 0.0f) {
-		co[0] = 0.5f * data->winx * (1.0f + co[0] / co[3]);
-		co[1] = 0.5f * data->winy * (1.0f + co[1] / co[3]);
-	}
-
-	/* screen space radius */
-	radius = sqrtf(area / (float)M_PI);
-
-	/* make smaller using fallof once over screen edge */
-	*viewport = 1.0f;
-
-	if (co[0] + radius < 0.0f)
-		*viewport *= psys_render_viewport_falloff(vprate, -(co[0] + radius), data->winx);
-	else if (co[0] - radius > data->winx)
-		*viewport *= psys_render_viewport_falloff(vprate, (co[0] - radius) - data->winx, data->winx);
-
-	if (co[1] + radius < 0.0f)
-		*viewport *= psys_render_viewport_falloff(vprate, -(co[1] + radius), data->winy);
-	else if (co[1] - radius > data->winy)
-		*viewport *= psys_render_viewport_falloff(vprate, (co[1] - radius) - data->winy, data->winy);
-	
-	return area;
-}
-
 void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[4][4], float winmat[4][4], int winx, int winy, int timeoffset)
 {
 	ParticleRenderData *data;
@@ -821,191 +738,6 @@ void psys_render_restore(Object *ob, ParticleSystem *psys)
 	}
 }
 
-/* BMESH_TODO, for orig face data, we need to use MPoly */
-
-int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
-{
-	DerivedMesh *dm = ctx->dm;
-	Mesh *me = (Mesh *)(ctx->sim.ob->data);
-	MFace *mf, *mface;
-	MVert *mvert;
-	ParticleRenderData *data;
-	ParticleRenderElem *elems, *elem;
-	ParticleSettings *part = ctx->sim.psys->part;
-	float *facearea, (*facecenter)[3], size[3], fac, powrate, scaleclamp;
-	float co1[3], co2[3], co3[3], co4[3], lambda, arearatio, t, area, viewport;
-	double vprate;
-	int *facetotvert;
-	int a, b, totorigface, totface, newtot, skipped;
-
-	/* double lookup */
-	const int *index_mf_to_mpoly;
-	const int *index_mp_to_orig;
-
-	if (part->ren_as != PART_DRAW_PATH || !(part->draw & PART_DRAW_REN_STRAND))
-		return tot;
-	if (!ctx->sim.psys->renderdata)
-		return tot;
-
-	data = ctx->sim.psys->renderdata;
-	if (data->timeoffset)
-		return 0;
-	if (!(part->simplify_flag & PART_SIMPLIFY_ENABLE))
-		return tot;
-
-	mvert = dm->getVertArray(dm);
-	mface = dm->getTessFaceArray(dm);
-	totface = dm->getNumTessFaces(dm);
-	totorigface = me->totpoly;
-
-	if (totface == 0 || totorigface == 0)
-		return tot;
-
-	index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
-	index_mp_to_orig  = dm->getPolyDataArray(dm, CD_ORIGINDEX);
-	if (index_mf_to_mpoly == NULL) {
-		index_mp_to_orig = NULL;
-	}
-
-	facearea = MEM_callocN(sizeof(float) * totorigface, "SimplifyFaceArea");
-	facecenter = MEM_callocN(sizeof(float[3]) * totorigface, "SimplifyFaceCenter");
-	facetotvert = MEM_callocN(sizeof(int) * totorigface, "SimplifyFaceArea");
-	elems = MEM_callocN(sizeof(ParticleRenderElem) * totorigface, "SimplifyFaceElem");
-
-	if (data->elems)
-		MEM_freeN(data->elems);
-
-	data->do_simplify = true;
-	data->elems = elems;
-	data->index_mf_to_mpoly = index_mf_to_mpoly;
-	data->index_mp_to_orig  = index_mp_to_orig;
-
-	/* compute number of children per original face */
-	for (a = 0; a < tot; a++) {
-		b = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, ctx->index[a]) : ctx->index[a];
-		if (b != ORIGINDEX_NONE) {
-			elems[b].totchild++;
-		}
-	}
-
-	/* compute areas and centers of original faces */
-	for (mf = mface, a = 0; a < totface; a++, mf++) {
-		b = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, a) : a;
-
-		if (b != ORIGINDEX_NONE) {
-			copy_v3_v3(co1, mvert[mf->v1].co);
-			copy_v3_v3(co2, mvert[mf->v2].co);
-			copy_v3_v3(co3, mvert[mf->v3].co);
-
-			add_v3_v3(facecenter[b], co1);
-			add_v3_v3(facecenter[b], co2);
-			add_v3_v3(facecenter[b], co3);
-
-			if (mf->v4) {
-				copy_v3_v3(co4, mvert[mf->v4].co);
-				add_v3_v3(facecenter[b], co4);
-				facearea[b] += area_quad_v3(co1, co2, co3, co4);
-				facetotvert[b] += 4;
-			}
-			else {
-				facearea[b] += area_tri_v3(co1, co2, co3);
-				facetotvert[b] += 3;
-			}
-		}
-	}
-
-	for (a = 0; a < totorigface; a++)
-		if (facetotvert[a] > 0)
-			mul_v3_fl(facecenter[a], 1.0f / facetotvert[a]);
-
-	/* for conversion from BU area / pixel area to reference screen size */
-	BKE_mesh_texspace_get(me, 0, 0, size);
-	fac = ((size[0] + size[1] + size[2]) / 3.0f) / part->simplify_refsize;
-	fac = fac * fac;
-
-	powrate = log(0.5f) / log(part->simplify_rate * 0.5f);
-	if (part->simplify_flag & PART_SIMPLIFY_VIEWPORT)
-		vprate = pow(1.0f - part->simplify_viewport, 5.0);
-	else
-		vprate = 1.0;
-
-	/* set simplification parameters per original face */
-	for (a = 0, elem = elems; a < totorigface; a++, elem++) {
-		area = psys_render_projected_area(ctx->sim.psys, facecenter[a], facearea[a], vprate, &viewport);
-		arearatio = fac * area / facearea[a];
-
-		if ((arearatio < 1.0f || viewport < 1.0f) && elem->totchild) {
-			/* lambda is percentage of elements to keep */
-			lambda = (arearatio < 1.0f) ? powf(arearatio, powrate) : 1.0f;
-			lambda *= viewport;
-
-			lambda = MAX2(lambda, 1.0f / elem->totchild);
-
-			/* compute transition region */
-			t = part->simplify_transition;
-			elem->t = (lambda - t < 0.0f) ? lambda : (lambda + t > 1.0f) ? 1.0f - lambda : t;
-			elem->reduce = 1;
-
-			/* scale at end and beginning of the transition region */
-			elem->scalemax = (lambda + t < 1.0f) ? 1.0f / lambda : 1.0f / (1.0f - elem->t * elem->t / t);
-			elem->scalemin = (lambda + t < 1.0f) ? 0.0f : elem->scalemax * (1.0f - elem->t / t);
-
-			elem->scalemin = sqrtf(elem->scalemin);
-			elem->scalemax = sqrtf(elem->scalemax);
-
-			/* clamp scaling */
-			scaleclamp = (float)min_ii(elem->totchild, 10);
-			elem->scalemin = MIN2(scaleclamp, elem->scalemin);
-			elem->scalemax = MIN2(scaleclamp, elem->scalemax);
-
-			/* extend lambda to include transition */
-			lambda = lambda + elem->t;
-			if (lambda > 1.0f)
-				lambda = 1.0f;
-		}
-		else {
-			lambda = arearatio;
-
-			elem->scalemax = 1.0f; //sqrt(lambda);
-			elem->scalemin = 1.0f; //sqrt(lambda);
-			elem->reduce = 0;
-		}
-
-		elem->lambda = lambda;
-		elem->scalemin = sqrtf(elem->scalemin);
-		elem->scalemax = sqrtf(elem->scalemax);
-		elem->curchild = 0;
-	}
-
-	MEM_freeN(facearea);
-	MEM_freeN(facecenter);
-	MEM_freeN(facetotvert);
-
-	/* move indices and set random number skipping */
-	ctx->skip = MEM_callocN(sizeof(int) * tot, "SimplificationSkip");
-
-	skipped = 0;
-	for (a = 0, newtot = 0; a < tot

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list