Commit: 29c0a6b43584d49dc26fc1ff62030e815c6e627c
Author: Lukas Tönne
Date:   Thu Feb 26 09:43:33 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB29c0a6b43584d49dc26fc1ff62030e815c6e627c

Replaced point cache in cloth modifiers (also hair) with the new caching
system.

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

M       source/blender/blenkernel/BKE_cache_library.h
M       source/blender/blenkernel/BKE_cloth.h
M       source/blender/blenkernel/BKE_pointcache.h
M       source/blender/blenkernel/intern/bpath.c
M       source/blender/blenkernel/intern/cache_library.c
M       source/blender/blenkernel/intern/cloth.c
M       source/blender/blenkernel/intern/object.c
M       source/blender/blenkernel/intern/particle_system.c
M       source/blender/blenkernel/intern/pointcache.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/versioning_legacy.c
M       source/blender/blenloader/intern/writefile.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/intern/MOD_cloth.c

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

diff --git a/source/blender/blenkernel/BKE_cache_library.h 
b/source/blender/blenkernel/BKE_cache_library.h
index 467780e..7c56ad8 100644
--- a/source/blender/blenkernel/BKE_cache_library.h
+++ b/source/blender/blenkernel/BKE_cache_library.h
@@ -39,6 +39,8 @@ struct Main;
 struct Object;
 struct Scene;
 
+struct ClothModifierData;
+
 struct CacheLibrary *BKE_cache_library_add(struct Main *bmain, const char 
*name);
 struct CacheLibrary *BKE_cache_library_copy(struct CacheLibrary *cachelib);
 void BKE_cache_library_free(struct CacheLibrary *cachelib);
@@ -86,5 +88,7 @@ void BKE_cache_library_clear(struct CacheLibrary *cachelib);
 void BKE_cache_library_group_update(struct Main *bmain, struct CacheLibrary 
*cachelib);
 
 bool BKE_cache_read_derived_mesh(struct Main *bmain, struct Scene *scene, 
float frame, struct Object *ob, struct DerivedMesh **r_dm);
+bool BKE_cache_read_cloth(struct Main *bmain, struct Scene *scene, float 
frame, struct Object *ob, struct ClothModifierData *clmd);
+bool BKE_cache_read_hair_dynamics(struct Main *bmain, struct Scene *scene, 
float frame, struct Object *ob, struct ParticleSystem *psys);
 
 #endif
diff --git a/source/blender/blenkernel/BKE_cloth.h 
b/source/blender/blenkernel/BKE_cloth.h
index beb4f22..1a13d05 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -241,9 +241,6 @@ int cloth_uses_vgroup(struct ClothModifierData *clmd);
 void bvhtree_update_from_cloth (struct ClothModifierData *clmd, int moving );
 void bvhselftree_update_from_cloth (struct ClothModifierData *clmd, int moving 
);
 
-// needed for button_object.c
-void cloth_clear_cache (struct Object *ob, struct ClothModifierData *clmd, 
float framenr );
-
 // needed for cloth.c
 int cloth_add_spring (struct ClothModifierData *clmd, unsigned int indexA, 
unsigned int indexB, float restlength, int spring_type);
 
diff --git a/source/blender/blenkernel/BKE_pointcache.h 
b/source/blender/blenkernel/BKE_pointcache.h
index e18e9d4..cf0513d 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -260,7 +260,6 @@ void BKE_ptcache_make_particle_key(struct ParticleKey *key, 
int index, void **da
 /**************** Creating ID's ****************************/
 void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct 
SoftBody *sb);
 void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct 
ParticleSystem *psys);
-void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct 
ClothModifierData *clmd);
 void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct 
SmokeModifierData *smd);
 void BKE_ptcache_id_from_dynamicpaint(PTCacheID *pid, struct Object *ob, 
struct DynamicPaintSurface *surface);
 void BKE_ptcache_id_from_rigidbody(PTCacheID *pid, struct Object *ob, struct 
RigidBodyWorld *rbw);
diff --git a/source/blender/blenkernel/intern/bpath.c 
b/source/blender/blenkernel/intern/bpath.c
index 3488cff..76a4da6 100644
--- a/source/blender/blenkernel/intern/bpath.c
+++ b/source/blender/blenkernel/intern/bpath.c
@@ -482,10 +482,6 @@ void BKE_bpath_traverse_id(Main *bmain, ID *id, 
BPathVisitor visit_cb, const int
                                                
BPATH_TRAVERSE_POINTCACHE(smd->domain->ptcaches[0]);
                                        }
                                }
-                               else if (md->type == eModifierType_Cloth) {
-                                       ClothModifierData *clmd = 
(ClothModifierData *) md;
-                                       
BPATH_TRAVERSE_POINTCACHE(clmd->ptcaches);
-                               }
                                else if (md->type == eModifierType_Ocean) {
                                        OceanModifierData *omd = 
(OceanModifierData *) md;
                                        rewrite_path_fixed(omd->cachepath, 
visit_cb, absbase, bpath_user_data);
diff --git a/source/blender/blenkernel/intern/cache_library.c 
b/source/blender/blenkernel/intern/cache_library.c
index 2a4956f..a5bfd92 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -525,3 +525,25 @@ bool BKE_cache_read_derived_mesh(Main *bmain, Scene 
*scene, float frame, Object
        }
        return false;
 }
+
+bool BKE_cache_read_cloth(Main *bmain, Scene *scene, float frame, Object *ob, 
struct ClothModifierData *clmd)
+{
+//     CacheLibrary *cachelib;
+       
+//     for (cachelib = bmain->cache_library.first; cachelib; cachelib = 
cachelib->id.next) {
+//             if (PTC_cachelib_read_sample_cloth(scene, frame, cachelib, ob, 
clmd) != PTC_READ_SAMPLE_INVALID)
+//                     return true;
+//     }
+       return false;
+}
+
+bool BKE_cache_read_hair_dynamics(Main *bmain, Scene *scene, float frame, 
Object *ob, struct ParticleSystem *psys)
+{
+       CacheLibrary *cachelib;
+       
+       for (cachelib = bmain->cache_library.first; cachelib; cachelib = 
cachelib->id.next) {
+               if (PTC_cachelib_read_sample_hair_dynamics(scene, frame, 
cachelib, ob, psys) != PTC_READ_SAMPLE_INVALID)
+                       return true;
+       }
+       return false;
+}
diff --git a/source/blender/blenkernel/intern/cloth.c 
b/source/blender/blenkernel/intern/cloth.c
index 3173489..6956015 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -34,18 +34,19 @@
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_particle_types.h"
 
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
 #include "BLI_edgehash.h"
 #include "BLI_linklist.h"
 
+#include "BKE_cache_library.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_cloth.h"
 #include "BKE_effect.h"
 #include "BKE_global.h"
 #include "BKE_modifier.h"
-#include "BKE_pointcache.h"
 
 #include "BPH_mass_spring.h"
 
@@ -126,9 +127,6 @@ void cloth_init(ClothModifierData *clmd )
 
        if (!clmd->sim_parms->effector_weights)
                clmd->sim_parms->effector_weights = 
BKE_add_effector_weights(NULL);
-
-       if (clmd->point_cache)
-               clmd->point_cache->step = 1;
 }
 
 static BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float 
epsilon)
@@ -304,35 +302,16 @@ void bvhselftree_update_from_cloth(ClothModifierData 
*clmd, int moving)
        }
 }
 
-void cloth_clear_cache(Object *ob, ClothModifierData *clmd, float framenr)
-{
-       PTCacheID pid;
-       
-       BKE_ptcache_id_from_cloth(&pid, ob, clmd);
-
-       // don't do anything as long as we're in editmode!
-       if (pid.cache->edit && ob->mode & OB_MODE_PARTICLE_EDIT)
-               return;
-       
-       BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_AFTER, framenr);
-}
-
 static int do_init_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh 
*result, int framenr)
 {
-       PointCache *cache;
-
-       cache= clmd->point_cache;
-
        /* initialize simulation data if it didn't exist already */
        if (clmd->clothObject == NULL) {
                if (!cloth_from_object(ob, clmd, result, framenr, 1)) {
-                       BKE_ptcache_invalidate(cache);
                        modifier_setError(&(clmd->modifier), "Can't initialize 
cloth");
                        return 0;
                }
        
                if (clmd->clothObject == NULL) {
-                       BKE_ptcache_invalidate(cache);
                        modifier_setError(&(clmd->modifier), "Null cloth 
object");
                        return 0;
                }
@@ -448,99 +427,66 @@ static DerivedMesh *cloth_to_triangles(DerivedMesh *dm)
  ************************************************/
 void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, 
DerivedMesh *dm, float (*vertexCos)[3])
 {
-       PointCache *cache;
-       PTCacheID pid;
-       float timescale;
-       int framenr, startframe, endframe;
-       int cache_result;
+       const int startframe = scene->r.sfra;
+       int framenr;
+       bool cache_result;
 
        clmd->scene= scene;     /* nice to pass on later :) */
        framenr= (int)scene->r.cfra;
-       cache= clmd->point_cache;
 
-       BKE_ptcache_id_from_cloth(&pid, ob, clmd);
-       BKE_ptcache_id_time(&pid, scene, framenr, &startframe, &endframe, 
&timescale);
-       clmd->sim_parms->timescale= timescale;
+       clmd->sim_parms->timescale = 1.0f;
 
        if (clmd->sim_parms->reset || (clmd->clothObject && dm->getNumVerts(dm) 
!= clmd->clothObject->numverts)) {
                clmd->sim_parms->reset = 0;
-               cache->flag |= PTCACHE_OUTDATED;
-               BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
-               BKE_ptcache_validate(cache, 0);
-               cache->last_exact= 0;
-               cache->flag &= ~PTCACHE_REDO_NEEDED;
        }
        
        // unused in the moment, calculated separately in implicit.c
        clmd->sim_parms->dt = clmd->sim_parms->timescale / 
clmd->sim_parms->stepsPerFrame;
 
-       /* simulation is only active during a specific period */
-       if (framenr < startframe) {
-               BKE_ptcache_invalidate(cache);
-               return;
-       }
-       else if (framenr > endframe) {
-               framenr= endframe;
-       }
-
        /* initialize simulation data if it didn't exist already */
        if (!do_init_cloth(ob, clmd, dm, framenr))
                return;
 
        if (framenr == startframe) {
-               BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
-               do_init_cloth(ob, clmd, dm, framenr);
-               BKE_ptcache_validate(cache, framenr);
-               cache->flag &= ~PTCACHE_REDO_NEEDED;
-               clmd->clothObject->last_frame= framenr;
+               cloth_from_object(ob, clmd, dm, framenr, true);
+               BKE_cloth_solver_set_positions(clmd);
+               clmd->clothObject->last_frame = framenr;
                return;
        }
 
        /* try to read from cache */
-       cache_result = BKE_ptcache_read(&pid, (float)framenr+scene->r.subframe);
+       cache_result = false;
+       if (clmd->hairdata) {
+               ParticleSystem *psys;
+               /* horrible */
+               for (psys = ob->particlesystem.first; psys; psys = psys->next) {
+                       if (psys->clmd == clmd)
+                               break;
+               }
+               
+               if (psys)
+                       cache_result = BKE_cache_read_hair_dynamics(G.main, 
scene, scene->r.cfra, ob, psys);
+       }
+       else {
+               cache_result = BKE_cache_read_cloth(G.main, scene, 
scene->r.cfra, ob, clmd);
+       }
 
-       if (cache_result == PTCACHE_READ_EXACT || cache_result == 
PTCACHE_READ_INTERPOLATED) {
+       if (cache_result) {
                BKE_cloth_solver_set_positions(clmd);
                cloth_to_object (ob, clmd, vertexCos);
-
-               BKE_ptcache_validate(cache, framenr);
-
-               if (cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & 
PTCACHE_REDO_NEEDED)
-                       BKE_ptcache_write(&pid, framenr);
-
                clmd->clothObject->last_frame= framenr;
-
                return;
        }
-       else if (cache_result==PTCACHE_READ_OLD) {
+       else {
+               if (framenr == clmd->clothObject->last_frame + 1) {
+                       if (do_step_cloth(ob, clmd, dm, framenr)) {
+                               clmd->clothObject->last_frame= framenr;
+                       }
+               }
+               
                BKE_cloth_solver_set_positions(clmd);
+               cloth_to_object (ob, clmd, vertexCos);
        }
-       else if ( /*ob->id.lib ||*/ (cache->flag & PTCACHE_BAKED)) { /* 2.4x 
disabled lib, but this can be used in some cases, testing further - campbell */
-               /* if baked and nothing in cache, 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to