[Bf-blender-cvs] [ff82968a6ca] master: Particles: Wrap insane amount of arguments to child modifier evaluation

Sergey Sharybin noreply at git.blender.org
Thu Feb 15 12:27:51 CET 2018


Commit: ff82968a6ca3332cc5cccbf766821274d8bb469e
Author: Sergey Sharybin
Date:   Wed Feb 14 12:33:34 2018 +0100
Branches: master
https://developer.blender.org/rBff82968a6ca3332cc5cccbf766821274d8bb469e

Particles: Wrap insane amount of arguments to child modifier evaluation

Use single structure. It seems we will need to pass more information soon,
so better to do it via the structure.

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

M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenkernel/intern/particle_child.c
M	source/blender/blenkernel/particle_private.h

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

diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 2b5c293932a..8aa7b167b85 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -3925,7 +3925,17 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
 				copy_particle_key(&tstate, state, 1);
 
 			/* apply different deformations to the child path */
-			do_child_modifiers(NULL, sim, &ptex, par->co, par->vel, par->rot, par_orco, cpa, orco, hairmat, state, t);
+			ParticleChildModifierContext modifier_ctx = {NULL};
+			modifier_ctx.thread_ctx = NULL;
+			modifier_ctx.sim = sim;
+			modifier_ctx.ptex = &ptex;
+			modifier_ctx.cpa = cpa;
+			modifier_ctx.orco = orco;
+			modifier_ctx.par_co = par->co;
+			modifier_ctx.par_vel = par->vel;
+			modifier_ctx.par_rot = par->rot;
+			modifier_ctx.par_orco = par_orco;
+			do_child_modifiers(&modifier_ctx, hairmat, state, t);
 
 			/* try to estimate correct velocity */
 			if (vel) {
@@ -4028,7 +4038,18 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
 			CLAMP(t, 0.0f, 1.0f);
 
 			unit_m4(mat);
-			do_child_modifiers(NULL, sim, NULL, key1->co, key1->vel, key1->rot, par_orco, cpa, cpa->fuv, mat, state, t);
+			ParticleChildModifierContext modifier_ctx = {NULL};
+			modifier_ctx.thread_ctx = NULL;
+			modifier_ctx.sim = sim;
+			modifier_ctx.ptex = NULL;
+			modifier_ctx.cpa = cpa;
+			modifier_ctx.orco = cpa->fuv;
+			modifier_ctx.par_co = key1->co;
+			modifier_ctx.par_vel = key1->vel;
+			modifier_ctx.par_rot = key1->rot;
+			modifier_ctx.par_orco = par_orco;
+
+			do_child_modifiers(&modifier_ctx, mat, state, t);
 
 			if (psys->lattice_deform_data)
 				calc_latt_deform(psys->lattice_deform_data, state->co, psys->lattice_strength);
diff --git a/source/blender/blenkernel/intern/particle_child.c b/source/blender/blenkernel/intern/particle_child.c
index d420f331707..70e635e16cf 100644
--- a/source/blender/blenkernel/intern/particle_child.c
+++ b/source/blender/blenkernel/intern/particle_child.c
@@ -235,6 +235,14 @@ static void do_kink_spiral(ParticleThreadContext *ctx, ParticleTexture *ptex, co
 	kink_base[part->kink_axis] = 1.0f;
 	mul_mat3_m4_v3(ctx->sim.ob->obmat, kink_base);
 
+	/* Fill in invariant part of modifier context. */
+	ParticleChildModifierContext modifier_ctx = {NULL};
+	modifier_ctx.thread_ctx = ctx;
+	modifier_ctx.sim = &ctx->sim;
+	modifier_ctx.ptex = ptex;
+	modifier_ctx.cpa = cpa;
+	modifier_ctx.orco = orco;
+
 	for (k = 0, key = keys; k < end_index; k++, key++) {
 		float par_time;
 		float *par_co, *par_vel, *par_rot;
@@ -274,8 +282,14 @@ static void do_kink_spiral(ParticleThreadContext *ctx, ParticleTexture *ptex, co
 			do_kink_spiral_deform((ParticleKey *)key, dir, kink, spiral_time, kink_freq, kink_shape, kink_amp, spiral_start);
 		}
 
-		/* apply different deformations to the child path */
-		do_child_modifiers(ctx, &ctx->sim, ptex, par_co, par_vel, par_rot, parent_orco, cpa, orco, hairmat, (ParticleKey *)key, par_time);
+		/* Fill in variant part of modifier context. */
+		modifier_ctx.par_co = par_co;
+		modifier_ctx.par_vel = par_vel;
+		modifier_ctx.par_rot = par_rot;
+		modifier_ctx.par_orco = parent_orco;
+
+		/* Apply different deformations to the child path/ */
+		do_child_modifiers(&modifier_ctx, hairmat, (ParticleKey *)key, par_time);
 	}
 
 	totlen = 0.0f;
@@ -331,19 +345,31 @@ void psys_apply_child_modifiers(ParticleThreadContext *ctx, struct ListBase *mod
 		keys->segments = totkeys - 1;
 	}
 	else {
-		ParticlePathIterator iter;
+		/* Fill in invariant part of modifier context. */
+		ParticleChildModifierContext modifier_ctx = {NULL};
+		modifier_ctx.thread_ctx = ctx;
+		modifier_ctx.sim = &ctx->sim;
+		modifier_ctx.ptex = ptex;
+		modifier_ctx.cpa = cpa;
+		modifier_ctx.orco = orco;
 
 		totkeys = ctx->segments + 1;
 		max_length = ptex->length;
 
 		for (k = 0, key = keys; k < totkeys; k++, key++) {
-			ParticleKey *par;
-
+			ParticlePathIterator iter;
 			psys_path_iter_get(&iter, keys, totkeys, parent_keys, k);
-			par = (ParticleKey *)iter.parent_key;
 
-			/* apply different deformations to the child path */
-			do_child_modifiers(ctx, &ctx->sim, ptex, par->co, par->vel, iter.parent_rotation, parent_orco, cpa, orco, hairmat, (ParticleKey *)key, iter.time);
+			ParticleKey *par = (ParticleKey *)iter.parent_key;
+
+			/* Fill in variant part of modifier context. */
+			modifier_ctx.par_co = par->co;
+			modifier_ctx.par_vel = par->vel;
+			modifier_ctx.par_rot = iter.parent_rotation;
+			modifier_ctx.par_orco = parent_orco;
+
+			/* Apply different deformations to the child path. */
+			do_child_modifiers(&modifier_ctx, hairmat, (ParticleKey *)key, iter.time);
 		}
 	}
 
@@ -662,10 +688,13 @@ static void do_rough_curve(const float loc[3], float mat[4][4], float time, floa
 	madd_v3_v3fl(state->co, mat[2], fac * rough[2]);
 }
 
-void do_child_modifiers(ParticleThreadContext *ctx, ParticleSimulationData *sim, ParticleTexture *ptex,
-                        const float par_co[3], const float par_vel[3], const float par_rot[4], const float par_orco[3],
-                        ChildParticle *cpa, const float orco[3], float mat[4][4], ParticleKey *state, float t)
+void do_child_modifiers(const ParticleChildModifierContext *modifier_ctx,
+                        float mat[4][4], ParticleKey *state, float t)
 {
+	ParticleThreadContext *ctx = modifier_ctx->thread_ctx;
+	ParticleSimulationData *sim = modifier_ctx->sim;
+	ParticleTexture *ptex = modifier_ctx->ptex;
+	ChildParticle *cpa = modifier_ctx->cpa;
 	ParticleSettings *part = sim->psys->part;
 	CurveMapping *clumpcurve = NULL, *roughcurve = NULL;
 	int i = cpa - sim->psys->child;
@@ -702,25 +731,43 @@ void do_child_modifiers(ParticleThreadContext *ctx, ParticleSimulationData *sim,
 		float orco_offset[3];
 		float clump;
 
-		sub_v3_v3v3(orco_offset, orco, par_orco);
-		clump = do_clump(state, par_co, t, orco_offset, part->clumpfac, part->clumppow, ptex ? ptex->clump : 1.f,
-		                 part->child_flag & PART_CHILD_USE_CLUMP_NOISE, part->clump_noise_size, clumpcurve);
+		sub_v3_v3v3(orco_offset, modifier_ctx->orco, modifier_ctx->par_orco);
+		clump = do_clump(state,
+		                 modifier_ctx->par_co,
+		                 t,
+		                 orco_offset,
+		                 part->clumpfac,
+		                 part->clumppow,
+		                 ptex ? ptex->clump : 1.0f,
+		                 part->child_flag & PART_CHILD_USE_CLUMP_NOISE,
+		                 part->clump_noise_size,
+		                 clumpcurve);
 
 		if (kink_freq != 0.f) {
 			kink_amp *= (1.f - kink_amp_clump * clump);
 
-			do_kink(state, par_co, par_vel, par_rot, t, kink_freq, part->kink_shape,
-			        kink_amp, part->kink_flat, part->kink, part->kink_axis,
-			        sim->ob->obmat, smooth_start);
+			do_kink(state,
+			        modifier_ctx->par_co,
+			        modifier_ctx->par_vel,
+			        modifier_ctx->par_rot,
+			        t,
+			        kink_freq,
+			        part->kink_shape,
+			        kink_amp,
+			        part->kink_flat,
+			        part->kink,
+			        part->kink_axis,
+			        sim->ob->obmat,
+			        smooth_start);
 		}
 	}
 
 	if (roughcurve) {
-		do_rough_curve(orco, mat, t, rough1, part->rough1_size, roughcurve, state);
+		do_rough_curve(modifier_ctx->orco, mat, t, rough1, part->rough1_size, roughcurve, state);
 	}
 	else {
 		if (rough1 > 0.f)
-			do_rough(orco, mat, t, rough1, part->rough1_size, 0.0, state);
+			do_rough(modifier_ctx->orco, mat, t, rough1, part->rough1_size, 0.0, state);
 
 		if (rough2 > 0.f) {
 			float vec[3];
diff --git a/source/blender/blenkernel/particle_private.h b/source/blender/blenkernel/particle_private.h
index b4878807df7..00a7637e246 100644
--- a/source/blender/blenkernel/particle_private.h
+++ b/source/blender/blenkernel/particle_private.h
@@ -31,12 +31,23 @@
 #ifndef __PARTICLE_PRIVATE_H__
 #define __PARTICLE_PRIVATE_H__
 
+typedef struct ParticleChildModifierContext {
+	ParticleThreadContext *thread_ctx;
+	ParticleSimulationData *sim;
+	ParticleTexture *ptex;
+	ChildParticle *cpa;
+	const float *par_co;    /* float3 */
+	const float *par_vel;   /* float3 */
+	const float *par_rot;   /* float4 */
+	const float *par_orco;  /* float3 */
+	const float *orco;      /* float3 */
+} ParticleChildModifierContext;
+
 void do_kink(ParticleKey *state, const float par_co[3], const float par_vel[3], const float par_rot[4], float time, float freq, float shape, float amplitude, float flat,
              short type, short axis, float obmat[4][4], int smooth_start);
 float do_clump(ParticleKey *state, const float par_co[3], float time, const float orco_offset[3], float clumpfac, float clumppow, float pa_clump,
                bool use_clump_noise, float clump_noise_size, CurveMapping *clumpcurve);
-void do_child_modifiers(ParticleThreadContext *ctx, ParticleSimulationData *sim,
-                        ParticleTexture *ptex, const float par_co[3], const float par_vel[3], const float par_rot[4], const float par_orco[3],
-                        ChildParticle *cpa, const float orco[3], float mat[4][4], ParticleKey *state, float t);
+void do_child_modifiers(const ParticleChildModifierContext *modifier_ctx,
+                        float mat[4][4], ParticleKey *state, float t);
 
 #endif /* __PARTICLE_PRIVATE_H__ */



More information about the Bf-blender-cvs mailing list