Commit: f1bd802b118c20eead0be075f5ec7bd59b0610c3
Author: Lukas Tönne
Date:   Thu May 28 15:25:00 2015 +0200
Branches: alembic
https://developer.blender.org/rBf1bd802b118c20eead0be075f5ec7bd59b0610c3

Moved child strand deformation into the general cache processing
function.

Strands processing now has 3 main steps:
1) apply parent modifiers
2) deform child strands
3) apply child modifiers

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

M       source/blender/blenkernel/BKE_cache_library.h
M       source/blender/blenkernel/BKE_strands.h
M       source/blender/blenkernel/intern/cache_library.c
M       source/blender/blenkernel/intern/object_dupli.c
M       source/blender/blenkernel/intern/strands.c
M       source/blender/editors/io/io_cache_library.c
M       source/blender/makesdna/DNA_strands_types.h
M       source/blender/pointcache/alembic/abc_particles.cpp

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

diff --git a/source/blender/blenkernel/BKE_cache_library.h 
b/source/blender/blenkernel/BKE_cache_library.h
index 3fcd48a..88eb7e9 100644
--- a/source/blender/blenkernel/BKE_cache_library.h
+++ b/source/blender/blenkernel/BKE_cache_library.h
@@ -89,7 +89,8 @@ bool BKE_cache_read_dupli_object(struct CacheLibrary 
*cachelib, struct DupliObje
                                  struct Scene *scene, struct Object *ob, float 
frame, bool use_render, bool for_display);
 
 void BKE_cache_process_dupli_cache(struct CacheLibrary *cachelib, struct 
CacheProcessData *data,
-                                   struct Scene *scene, struct Group 
*dupgroup, float frame_prev, float frame);
+                                   struct Scene *scene, struct Group 
*dupgroup, float frame_prev, float frame,
+                                   bool do_modifiers, bool 
do_strands_child_deform, bool do_strands_motion);
 
 /* ========================================================================= */
 
@@ -108,13 +109,18 @@ typedef struct CacheProcessData {
        struct DupliCache *dupcache;
 } CacheProcessData;
 
+typedef enum eCacheProcessFlag {
+       eCacheProcessFlag_DoStrands             = (1 << 0),
+       eCacheProcessFlag_DoStrandsChildren     = (1 << 1),
+} eCacheProcessFlag;
+
 typedef void (*CacheModifier_InitFunc)(struct CacheModifier *md);
 typedef void (*CacheModifier_FreeFunc)(struct CacheModifier *md);
 typedef void (*CacheModifier_CopyFunc)(struct CacheModifier *md, struct 
CacheModifier *target);
 typedef void (*CacheModifier_ForeachIDLinkFunc)(struct CacheModifier *md, 
struct CacheLibrary *cachelib,
                                                 CacheModifier_IDWalkFunc walk, 
void *userData);
 typedef void (*CacheModifier_ProcessFunc)(struct CacheModifier *md, struct 
CacheProcessContext *ctx, struct CacheProcessData *data,
-                                          int frame, int frame_prev);
+                                          int frame, int frame_prev, int 
process_flag);
 
 typedef struct CacheModifierTypeInfo {
        /* The user visible name for this modifier */
diff --git a/source/blender/blenkernel/BKE_strands.h 
b/source/blender/blenkernel/BKE_strands.h
index 61f55e3..2ec1363 100644
--- a/source/blender/blenkernel/BKE_strands.h
+++ b/source/blender/blenkernel/BKE_strands.h
@@ -46,9 +46,6 @@ void BKE_strands_children_free(struct StrandsChildren 
*strands);
 void BKE_strands_children_add_uvs(struct StrandsChildren *strands, int 
num_layers);
 void BKE_strands_children_add_vcols(struct StrandsChildren *strands, int 
num_layers);
 
-int BKE_strands_children_max_length(struct StrandsChildren *strands);
-int *BKE_strands_calc_vertex_start(struct Strands *strands);
-void BKE_strands_children_strand_deform(struct StrandChildIterator *it_strand, 
struct Strands *parents, int *vertstart, bool use_motion, float (*out)[3]);
 void BKE_strands_children_deform(struct StrandsChildren *strands, struct 
Strands *parents, bool use_motion);
 
 void BKE_strands_children_ensure_normals(struct StrandsChildren *strands);
diff --git a/source/blender/blenkernel/intern/cache_library.c 
b/source/blender/blenkernel/intern/cache_library.c
index 4ac1142..1a1672c 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -573,7 +573,8 @@ void BKE_cache_modifier_foreachIDLink(struct CacheLibrary 
*cachelib, struct Cach
 }
 
 void BKE_cache_process_dupli_cache(CacheLibrary *cachelib, CacheProcessData 
*data,
-                                   Scene *scene, Group *dupgroup, float 
frame_prev, float frame)
+                                   Scene *scene, Group *dupgroup, float 
frame_prev, float frame,
+                                   bool do_modifiers, bool 
do_strands_child_deform, bool do_strands_motion)
 {
        CacheProcessContext ctx;
        CacheModifier *md;
@@ -583,11 +584,41 @@ void BKE_cache_process_dupli_cache(CacheLibrary 
*cachelib, CacheProcessData *dat
        ctx.cachelib = cachelib;
        ctx.group = dupgroup;
        
-       for (md = cachelib->modifiers.first; md; md = md->next) {
-               CacheModifierTypeInfo *mti = cache_modifier_type_get(md->type);
+       if (do_modifiers) {
+               for (md = cachelib->modifiers.first; md; md = md->next) {
+                       CacheModifierTypeInfo *mti = 
cache_modifier_type_get(md->type);
+                       
+                       // TODO parent modifiers only here
+                       if (mti->process)
+                               mti->process(md, &ctx, data, frame, frame_prev, 
eCacheProcessFlag_DoStrands);
+               }
+       }
+       
+       /* deform child strands to follow parent motion */
+       if (do_modifiers || do_strands_child_deform) {
+               struct  DupliCacheIterator *it;
                
-               if (mti->process)
-                       mti->process(md, &ctx, data, frame, frame_prev);
+               it = BKE_dupli_cache_iter_new(data->dupcache);
+               for (; BKE_dupli_cache_iter_valid(it); 
BKE_dupli_cache_iter_next(it)) {
+                       DupliObjectData *dobdata = BKE_dupli_cache_iter_get(it);
+                       DupliObjectDataStrands *link;
+                       
+                       for (link = dobdata->strands.first; link; link = 
link->next) {
+                               if (link->strands_children)
+                                       
BKE_strands_children_deform(link->strands_children, link->strands, 
do_strands_motion);
+                       }
+               }
+               BKE_dupli_cache_iter_free(it);
+       }
+       
+       if (do_modifiers) {
+               for (md = cachelib->modifiers.first; md; md = md->next) {
+                       CacheModifierTypeInfo *mti = 
cache_modifier_type_get(md->type);
+                       
+                       // TODO child modifiers only here
+                       if (mti->process)
+                               mti->process(md, &ctx, data, frame, frame_prev, 
eCacheProcessFlag_DoStrandsChildren);
+               }
        }
 }
 
@@ -1115,7 +1146,7 @@ static void hairsim_foreach_id_link(HairSimCacheModifier 
*hsmd, CacheLibrary *ca
                walk(userdata, cachelib, &hsmd->modifier, (ID 
**)(&hsmd->sim_params.effector_weights->group));
 }
 
-static void hairsim_process(HairSimCacheModifier *hsmd, CacheProcessContext 
*ctx, CacheProcessData *data, int frame, int frame_prev)
+static void hairsim_process(HairSimCacheModifier *hsmd, CacheProcessContext 
*ctx, CacheProcessData *data, int frame, int frame_prev, int process_flag)
 {
 #define MAX_CACHE_EFFECTORS 64
        
@@ -1127,9 +1158,9 @@ static void hairsim_process(HairSimCacheModifier *hsmd, 
CacheProcessContext *ctx
        int tot_cache_effectors;
        struct Implicit_Data *solver_data;
        
-       /* only perform hair sim once */
-//     if (eval_mode != CACHE_LIBRARY_EVAL_REALTIME)
-//             return;
+       /* only applies to parent strands */
+       if (!(process_flag & eCacheProcessFlag_DoStrands))
+               return;
        
        if (!BKE_cache_modifier_find_strands(data->dupcache, ob, 
hsmd->hair_system, NULL, &strands, NULL, NULL))
                return;
@@ -1438,25 +1469,25 @@ static void shrinkwrap_apply(ShrinkWrapCacheModifier 
*smd, ShrinkWrapCacheData *
        }
 }
 
-static void shrinkwrap_process(ShrinkWrapCacheModifier *smd, 
CacheProcessContext *ctx, CacheProcessData *data, int UNUSED(frame), int 
UNUSED(frame_prev))
+static void shrinkwrap_process(ShrinkWrapCacheModifier *smd, 
CacheProcessContext *ctx, CacheProcessData *data, int UNUSED(frame), int 
UNUSED(frame_prev), int process_flag)
 {
        bool do_strands_motion = true;
-       bool do_strands_children = true;
        
        const bool dupli_target = smd->flag & 
eShrinkWrapCacheModifier_Flag_InternalTarget;
        Object *ob = smd->object;
        DupliObject *dob;
        Strands *strands = NULL;
-       StrandsChildren *children = NULL;
        DerivedMesh *target_dm;
        float mat[4][4];
        
        ShrinkWrapCacheData shrinkwrap;
        
-       if (do_strands_children) {
-               BKE_cache_modifier_find_strands(data->dupcache, ob, 
smd->hair_system, NULL, NULL, &children, NULL);
-       }
-       BKE_cache_modifier_find_strands(data->dupcache, ob, smd->hair_system, 
NULL, &strands, NULL, NULL);
+       /* only applies to parent strands */
+       if (!(process_flag & eCacheProcessFlag_DoStrands))
+               return;
+       
+       if (!BKE_cache_modifier_find_strands(data->dupcache, ob, 
smd->hair_system, NULL, &strands, NULL, NULL))
+               return;
        
        if (dupli_target) {
                DupliObjectData *target_data;
@@ -1489,7 +1520,7 @@ static void shrinkwrap_process(ShrinkWrapCacheModifier 
*smd, CacheProcessContext
                        shrinkwrap_data_get_instances(&shrinkwrap, smd->target, 
mat, NULL);
                }
                
-               shrinkwrap_apply(smd, &shrinkwrap, strands, children, 
do_strands_motion);
+               shrinkwrap_apply(smd, &shrinkwrap, strands, NULL, 
do_strands_motion);
                
                shrinkwrap_data_free(&shrinkwrap);
                
@@ -1544,7 +1575,7 @@ static void 
strandskey_foreach_id_link(StrandsKeyCacheModifier *skmd, CacheLibra
        walk(userdata, cachelib, &skmd->modifier, (ID **)(&skmd->object));
 }
 
-static void strandskey_process(StrandsKeyCacheModifier *skmd, 
CacheProcessContext *UNUSED(ctx), CacheProcessData *data, int UNUSED(frame), 
int UNUSED(frame_prev))
+static void strandskey_process(StrandsKeyCacheModifier *skmd, 
CacheProcessContext *UNUSED(ctx), CacheProcessData *data, int UNUSED(frame), 
int UNUSED(frame_prev), int process_flag)
 {
        const bool use_motion = skmd->flag & 
eStrandsKeyCacheModifier_Flag_UseMotionState;
        Object *ob = skmd->object;
@@ -1552,6 +1583,9 @@ static void strandskey_process(StrandsKeyCacheModifier 
*skmd, CacheProcessContex
        KeyBlock *actkb;
        float *shape;
        
+       /* only applies to parents */
+       if (!(process_flag & eCacheProcessFlag_DoStrands))
+               return;
        if (!BKE_cache_modifier_find_strands(data->dupcache, ob, 
skmd->hair_system, NULL, &strands, NULL, NULL))
                return;
        if (use_motion && !strands->state)
@@ -1878,13 +1912,14 @@ static bool 
haircut_find_segment_cut(HaircutCacheModifier *hmd, HaircutCacheData
        return false;
 }
 
-static bool haircut_find_first_strand_cut(HaircutCacheModifier *hmd, 
HaircutCacheData *data, StrandChildIterator *it_strand, float 
(*strand_deform)[3], float *r_cutoff)
+static bool haircut_find_first_strand_cut(HaircutCacheModifier *hmd, 
HaircutCacheData *data, StrandChildIterator *it_strand, float *r_cutoff)
 {
        StrandChildVertexIterator it_vert;
        int vprev = -1;
        float cutoff = 0.0f;
        
        for (BKE_strand_child_vertex_iter_init(&it_vert, it_strand); 
BKE_strand_child_vertex_iter_valid(&it_vert); 
BKE_strand_child_vertex_iter_next(&it_vert)) {
+               StrandsChildVertex *verts = it_strand->verts;
                bool found_cut = false;
                float lambda_min = 1.0f;
                HaircutCacheInstance *inst;
@@ -1892,7 +1927,7 @@ static bool 
haircut_find_first_strand_cut(HaircutCacheModifier *hmd, HaircutCach
                if (it_vert.index == 0) {
                        for (inst = data->instances.first; inst; inst = 
inst->next) {
                                /* test root vertex */
-                               if (haircut_test_

@@ 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