Proper copy code for multiple point caches.
authorJanne Karhu <jhkarh@gmail.com>
Fri, 14 Aug 2009 16:25:59 +0000 (16:25 +0000)
committerJanne Karhu <jhkarh@gmail.com>
Fri, 14 Aug 2009 16:25:59 +0000 (16:25 +0000)
source/blender/blenkernel/BKE_pointcache.h
source/blender/blenkernel/intern/modifier.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/pointcache.c

index b83afb6b28fb7ea651f4b16d5354243709b37348..c8a7a1cbf90fbb32bd9cc299376834c60b74df65 100644 (file)
@@ -192,7 +192,7 @@ struct PointCache *BKE_ptcache_add(struct ListBase *ptcaches);
 void BKE_ptache_free_mem(struct PointCache *cache);
 void BKE_ptcache_free(struct PointCache *cache);
 void BKE_ptcache_free_list(struct ListBase *ptcaches);
-struct PointCache *BKE_ptcache_copy(struct PointCache *cache);
+struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, struct ListBase *ptcaches_old);
 
 /********************** Baking *********************/
 
index 0c975a10c0ae4edd05ee481b2afec1cdb104cafc..ecba1c1a6ad725d6be2cc743b5d07fcae1f3d083 100644 (file)
@@ -5978,7 +5978,7 @@ static void clothModifier_copyData(ModifierData *md, ModifierData *target)
        
        tclmd->sim_parms = MEM_dupallocN(clmd->sim_parms);
        tclmd->coll_parms = MEM_dupallocN(clmd->coll_parms);
-       tclmd->point_cache = BKE_ptcache_copy(clmd->point_cache);
+       tclmd->point_cache = BKE_ptcache_copy_list(&tclmd->ptcaches, &clmd->ptcaches);
        tclmd->clothObject = NULL;
 }
 
index 150a5aa97aa9f5b6b70db5261c4f8210d6258712..9423f80cba2f09d999e758ef04f2e06181893322 100644 (file)
@@ -1026,7 +1026,7 @@ SoftBody *copy_softbody(SoftBody *sb)
        
        sbn->scratch= NULL;
 
-       sbn->pointcache= BKE_ptcache_copy(sb->pointcache);
+       sbn->pointcache= BKE_ptcache_copy_list(&sbn->ptcaches, &sb->ptcaches);
 
        return sbn;
 }
@@ -1085,7 +1085,7 @@ ParticleSystem *copy_particlesystem(ParticleSystem *psys)
        psysn->reactevents.first = psysn->reactevents.last = NULL;
        psysn->renderdata = NULL;
        
-       psysn->pointcache= BKE_ptcache_copy(psys->pointcache);
+       psysn->pointcache= BKE_ptcache_copy_list(&psysn->ptcaches, &psys->ptcaches);
 
        id_us_plus((ID *)psysn->part);
 
index 7aa01de71d0785436c84f11e38c3eb78e5bfa262..59e2c3f6d72404376ffad93b1c191d273d01282a 100644 (file)
@@ -1630,7 +1630,7 @@ void BKE_ptcache_free_list(ListBase *ptcaches)
        BLI_freelistN(ptcaches);
 }
 
-PointCache *BKE_ptcache_copy(PointCache *cache)
+static PointCache *ptcache_copy(PointCache *cache)
 {
        PointCache *ncache;
 
@@ -1645,7 +1645,18 @@ PointCache *BKE_ptcache_copy(PointCache *cache)
 
        return ncache;
 }
+/* returns first point cache */
+PointCache *BKE_ptcache_copy_list(ListBase *ptcaches_new, ListBase *ptcaches_old)
+{
+       PointCache *cache = ptcaches_old->first;
+
+       ptcaches_new->first = ptcaches_new->last = NULL;
 
+       for(; cache; cache=cache->next)
+               BLI_addtail(ptcaches_new, ptcache_copy(cache));
+
+       return ptcaches_new->first;
+}
 
 
 /* Baking */