Commit: 99611fc38b9ee1aed701ba79ba0524215a331fe1
Author: Lukas Tönne
Date:   Tue Jan 13 17:24:20 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB99611fc38b9ee1aed701ba79ba0524215a331fe1

Another crappy approach to spirals on hairs, crazy expensive though.

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

M       release/scripts/startup/bl_ui/properties_particle.py
M       source/blender/blenkernel/BKE_particle.h
M       source/blender/blenkernel/intern/object_dupli.c
M       source/blender/blenkernel/intern/particle.c
M       source/blender/blenkernel/intern/particle_child.c
M       source/blender/blenloader/intern/versioning_270.c
M       source/blender/editors/object/object_modifier.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/makesdna/DNA_particle_types.h
M       source/blender/makesrna/intern/rna_particle.c
M       source/blender/render/intern/source/convertblender.c
M       source/blender/render/intern/source/pointdensity.c

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

diff --git a/release/scripts/startup/bl_ui/properties_particle.py 
b/release/scripts/startup/bl_ui/properties_particle.py
index e507198..d837eae 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -1341,10 +1341,10 @@ class PARTICLE_PT_children(ParticleButtonsPanel, Panel):
         if part.kink in {'SPIRAL'}:
             col = split.column()
             col.prop(part, "kink_amplitude", text="Radius")
-            col.prop(part, "kink_flat", text="Start", slider=True)
             col = split.column(align=True)
             col.prop(part, "kink_frequency", text="Frequency")
             col.prop(part, "kink_shape", text="Shape", slider=True)
+            col.prop(part, "kink_extra_steps", text="Steps")
         else:
             col = split.column()
             sub = col.column(align=True)
diff --git a/source/blender/blenkernel/BKE_particle.h 
b/source/blender/blenkernel/BKE_particle.h
index 7ed6264..4ec179e 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -129,7 +129,7 @@ typedef struct ParticleCacheKey {
        float rot[4];
        float col[3];
        float time;
-       int steps;
+       int segments;
 } ParticleCacheKey;
 
 typedef struct ParticleThreadContext {
@@ -153,7 +153,7 @@ typedef struct ParticleThreadContext {
        struct ParticleData *tpars;
 
        /* path caching */
-       int editupdate, between, steps;
+       int editupdate, between, segments, extra_segments;
        int totchild, totparent, parent_pass;
 
        float cfra;
diff --git a/source/blender/blenkernel/intern/object_dupli.c 
b/source/blender/blenkernel/intern/object_dupli.c
index 2bee6b7..057f999 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -970,8 +970,8 @@ static void make_duplis_particle_system(const DupliContext 
*ctx, ParticleSystem
 
                        /* some hair paths might be non-existent so they can't 
be used for duplication */
                        if (hair &&
-                           ((a < totpart && psys->pathcache[a]->steps < 0) ||
-                            (a >= totpart && psys->childcache[a - 
totpart]->steps < 0)))
+                           ((a < totpart && psys->pathcache[a]->segments < 0) 
||
+                            (a >= totpart && psys->childcache[a - 
totpart]->segments < 0)))
                        {
                                continue;
                        }
diff --git a/source/blender/blenkernel/intern/particle.c 
b/source/blender/blenkernel/intern/particle.c
index 10a4d2e..f981e1e 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -105,7 +105,7 @@ static void get_child_modifier_parameters(ParticleSettings 
*part, ParticleThread
                                           ChildParticle *cpa, short cpa_from, 
int cpa_num, float *cpa_fuv, float *orco, ParticleTexture *ptex);
 extern void do_child_modifiers(ParticleSimulationData *sim,
                                ParticleTexture *ptex, ParticleKey *par, float 
*par_rot, const float par_orco[3],
-                               ChildParticle *cpa, const float orco[3], float 
mat[4][4], ParticleKey *state, float t, float spiral_start[3], float 
*time_prev, float *co_prev);
+                               ChildParticle *cpa, const float orco[3], float 
mat[4][4], ParticleKey *state, float t);
 
 /* few helpers for countall etc. */
 int count_particles(ParticleSystem *psys)
@@ -139,7 +139,7 @@ int count_particles_mod(ParticleSystem *psys, int totgr, 
int cur)
 
 #define PATH_CACHE_BUF_SIZE 1024
 
-static ParticleCacheKey **psys_alloc_path_cache_buffers(ListBase *bufs, int 
tot, int steps)
+static ParticleCacheKey **psys_alloc_path_cache_buffers(ListBase *bufs, int 
tot, int totkeys)
 {
        LinkData *buf;
        ParticleCacheKey **cache;
@@ -152,10 +152,10 @@ static ParticleCacheKey 
**psys_alloc_path_cache_buffers(ListBase *bufs, int tot,
        while (totkey < tot) {
                totbufkey = MIN2(tot - totkey, PATH_CACHE_BUF_SIZE);
                buf = MEM_callocN(sizeof(LinkData), "PathCacheLinkData");
-               buf->data = MEM_callocN(sizeof(ParticleCacheKey) * totbufkey * 
steps, "ParticleCacheKey");
+               buf->data = MEM_callocN(sizeof(ParticleCacheKey) * totbufkey * 
totkeys, "ParticleCacheKey");
 
                for (i = 0; i < totbufkey; i++)
-                       cache[totkey + i] = ((ParticleCacheKey *)buf->data) + i 
* steps;
+                       cache[totkey + i] = ((ParticleCacheKey *)buf->data) + i 
* totkeys;
 
                totkey += totbufkey;
                BLI_addtail(bufs, buf);
@@ -1171,9 +1171,9 @@ static void interpolate_pathcache(ParticleCacheKey 
*first, float t, ParticleCach
        ParticleCacheKey *cur = first;
 
        /* scale the requested time to fit the entire path even if the path is 
cut early */
-       t *= (first + first->steps)->time;
+       t *= (first + first->segments)->time;
 
-       while (i < first->steps && cur->time < t)
+       while (i < first->segments && cur->time < t)
                cur++;
 
        if (cur->time == t)
@@ -1703,7 +1703,7 @@ void psys_particle_on_emitter(ParticleSystemModifierData 
*psmd, int from, int in
 /************************************************/
 
 extern void do_kink(ParticleKey *state, ParticleKey *par, float *par_rot, 
float time, float freq, float shape, float amplitude, float flat,
-                    short type, short axis, float obmat[4][4], int 
smooth_start, float spiral_start[3], float *time_prev, float *co_prev);
+                    short type, short axis, float obmat[4][4], int 
smooth_start);
 extern float do_clump(ParticleKey *state, ParticleKey *par, float time, const 
float orco_offset[3], float clumpfac, float clumppow, float pa_clump,
                       bool use_clump_noise, float clump_noise_size, 
CurveMapping *clumpcurve);
 
@@ -1825,11 +1825,10 @@ int do_guides(ParticleSettings *part, ListBase 
*effectors, ParticleKey *state, i
                {
                        ParticleKey key, par;
                        float orco_offset[3] = {0.0f, 0.0f, 0.0f};
-                       float spiral_start[3], time_prev = 0.0f, co_prev[3] = 
{0,0,0};
                        
                        par.co[0] = par.co[1] = par.co[2] = 0.0f;
                        copy_v3_v3(key.co, vec_to_point);
-                       do_kink(&key, &par, 0, guidetime, pd->kink_freq, 
pd->kink_shape, pd->kink_amp, 0.f, pd->kink, pd->kink_axis, 0, 0, spiral_start, 
&time_prev, co_prev);
+                       do_kink(&key, &par, 0, guidetime, pd->kink_freq, 
pd->kink_shape, pd->kink_amp, 0.f, pd->kink, pd->kink_axis, 0, 0);
                        do_clump(&key, &par, guidetime, orco_offset, 
pd->clump_fac, pd->clump_pow, 1.0f,
                                 part->child_flag & PART_CHILD_USE_CLUMP_NOISE, 
part->clump_noise_size, part->clumpcurve);
                        copy_v3_v3(vec_to_point, key.co);
@@ -1975,7 +1974,7 @@ static bool 
psys_thread_context_init_path(ParticleThreadContext *ctx, ParticleSi
        ParticleSystem *psys = sim->psys;
        ParticleSettings *part = psys->part;
        int totparent = 0, between = 0;
-       int steps = 1 << part->draw_step;
+       int segments = 1 << part->draw_step;
        int totchild = psys->totchild;
 
        psys_thread_context_init(ctx, sim);
@@ -1987,7 +1986,7 @@ static bool 
psys_thread_context_init_path(ParticleThreadContext *ctx, ParticleSi
                if (psys->renderdata == 0 && (psys->edit == NULL || pset->flag 
& PE_DRAW_PART) == 0)
                        totchild = 0;
 
-               steps = 1 << pset->draw_step;
+               segments = 1 << pset->draw_step;
        }
 
        if (totchild && part->childtype == PART_CHILD_FACES) {
@@ -2001,7 +2000,7 @@ static bool 
psys_thread_context_init_path(ParticleThreadContext *ctx, ParticleSi
        }
 
        if (psys->renderdata)
-               steps = (int)pow(2.0, (double)part->ren_step);
+               segments = 1 << part->ren_step;
        else {
                totchild = (int)((float)totchild * (float)part->disp / 100.0f);
                totparent = MIN2(totparent, totchild);
@@ -2012,7 +2011,11 @@ static bool 
psys_thread_context_init_path(ParticleThreadContext *ctx, ParticleSi
 
        /* fill context values */
        ctx->between = between;
-       ctx->steps = steps;
+       ctx->segments = segments;
+       if (ELEM(part->kink, PART_KINK_SPIRAL))
+               ctx->extra_segments = max_ii(part->kink_extra_steps, 1);
+       else
+               ctx->extra_segments = 0;
        ctx->totchild = totchild;
        ctx->totparent = totparent;
        ctx->parent_pass = 0;
@@ -2092,7 +2095,7 @@ static void psys_thread_create_path(ParticleTask *task, 
struct ChildParticle *cp
                        if (!needupdate)
                                return;
                        else
-                               memset(child_keys, 0, sizeof(*child_keys) * 
(ctx->steps + 1));
+                               memset(child_keys, 0, sizeof(*child_keys) * 
(ctx->segments + 1));
                }
 
                /* get parent paths */
@@ -2115,14 +2118,14 @@ static void psys_thread_create_path(ParticleTask *task, 
struct ChildParticle *cp
                                        if (part->flag & PART_CHILD_LONG_HAIR) {
                                                /* For long hair use tip 
distance/root distance as parting factor instead of root to tip angle. */
                                                float d1 = len_v3v3(key[0]->co, 
key[w]->co);
-                                               float d2 = len_v3v3((key[0] + 
key[0]->steps - 1)->co, (key[w] + key[w]->steps - 1)->co);
+                                               float d2 = len_v3v3((key[0] + 
key[0]->segments - 1)->co, (key[w] + key[w]->segments - 1)->co);
 
                                                d = d1 > 0.f ? d2 / d1 - 1.f : 
10000.f;
                                        }
                                        else {
                                                float v1[3], v2[3];
-                                               sub_v3_v3v3(v1, (key[0] + 
key[0]->steps - 1)->co, key[0]->co);
-                                               sub_v3_v3v3(v2, (key[w] + 
key[w]->steps - 1)->co, key[w]->co);
+                                               sub_v3_v3v3(v1, (key[0] + 
key[0]->segments - 1)->co, key[0]->co);
+                                               sub_v3_v3v3(v2, (key[w] + 
key[w]->segments - 1)->co, key[w]->co);
                                                normalize_v3(v1);
                                                normalize_v3(v2);
 
@@ -2170,7 +2173,7 @@ static void psys_thread_create_path(ParticleTask *task, 
struct ChildParticle *cp
                        if (!(psys->edit->points[cpa->parent].flag & 
PEP_EDIT_RECALC))
                                return;
 
-                       memset(child_keys, 0, sizeof(*child_keys) * (ctx->steps 
+ 1));
+                       memset(child_keys, 0, sizeof(*child_keys) * 
(ctx->segments + 1));
                }
 
                /* get the parent path */
@@ -2189,18 +2192,18 @@ static void psys_thread_create_path(ParticleTask *task, 
struct ChildParticle *cp
                psys_mat_hair_to_global(ob, ctx->sim.psmd->dm, 
psys->part->from, pa, hairmat);
        }
 
-       child_keys->steps = ctx->steps;
+       child_keys->segments = ctx->segments;
 
        /* get different child parameters from textures & vgroups */
        get_child_modifier_parameters(part, ctx, cpa, cpa_from, cpa_num, 
cpa_fuv, orco, &ptex);
 
        if (ptex.exist < psys_frand(psys, i + 24)) {
-               child_keys->steps = -1;
+               child_keys->segments = -1;
                return;
        }
 
        /* create the child path */
-       for (k = 0, child = child_keys; k <= ctx->steps; k++, child++) {
+       for (k = 0, child = child_keys; k <= ctx->segments; k++, child++) {
                if (ctx->between) {
                        int w = 0;
 
@@ -2218,7 +222

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to