Revision: 16924
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16924
Author:   blendix
Date:     2008-10-04 23:26:48 +0200 (Sat, 04 Oct 2008)

Log Message:
-----------
Fix for part of bug #17759: point cache clearing did too much, also
clearing other physics systems on the same object.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/pointcache.c

Modified: trunk/blender/source/blender/blenkernel/intern/pointcache.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pointcache.c 2008-10-04 
21:04:16 UTC (rev 16923)
+++ trunk/blender/source/blender/blenkernel/intern/pointcache.c 2008-10-04 
21:26:48 UTC (rev 16924)
@@ -70,6 +70,12 @@
 #include <unistd.h>
 #endif
 
+#ifdef _WIN32
+#ifndef snprintf
+#define snprintf _snprintf
+#endif
+#endif
+
 /* Creating ID's */
 
 void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
@@ -164,6 +170,9 @@
        - stack_index: index in the modifier stack. we can have cache for more 
then one stack_index
 */
 
+#define MAX_PTCACHE_PATH FILE_MAX
+#define MAX_PTCACHE_FILE ((FILE_MAXDIR+FILE_MAXFILE)*2)
+
 static int ptcache_path(PTCacheID *pid, char *filename)
 {
        Library *lib;
@@ -172,7 +181,7 @@
        lib= (pid)? pid->ob->id.lib: NULL;
 
        if (G.relbase_valid || lib) {
-               char file[FILE_MAX]; /* we dont want the dir, only the file */
+               char file[MAX_PTCACHE_PATH]; /* we dont want the dir, only the 
file */
                char *blendfilename;
 
                blendfilename= (lib)? lib->filename: G.sce;
@@ -184,7 +193,7 @@
                if (i > 6)
                        file[i-6] = '\0';
                
-               sprintf(filename, "//"PTCACHE_PATH"%s", file); /* add blend 
file name to pointcache dir */
+               snprintf(filename, MAX_PTCACHE_PATH, "//"PTCACHE_PATH"%s", 
file); /* add blend file name to pointcache dir */
                BLI_convertstringcode(filename, blendfilename);
                BLI_add_slash(filename);
                return strlen(filename);
@@ -192,7 +201,7 @@
        
        /* use the temp path. this is weak but better then not using point 
cache at all */
        /* btempdir is assumed to exist and ALWAYS has a trailing slash */
-       sprintf(filename, "%s"PTCACHE_PATH"%d", btempdir, abs(getpid()));
+       snprintf(filename, MAX_PTCACHE_PATH, "%s"PTCACHE_PATH"%d", btempdir, 
abs(getpid()));
        BLI_add_slash(filename);
        return strlen(filename);
 }
@@ -215,13 +224,13 @@
        idname = (pid->ob->id.name+2);
        /* convert chars to hex so they are always a valid filename */
        while('\0' != *idname) {
-               sprintf(newname, "%02X", (char)(*idname++));
+               snprintf(newname, MAX_PTCACHE_FILE, "%02X", (char)(*idname++));
                newname+=2;
                len += 2;
        }
        
        if (do_ext) {
-               sprintf(newname, "_%06d_%02d"PTCACHE_EXT, cfra, 
pid->stack_index); /* always 6 chars */
+               snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, 
cfra, pid->stack_index); /* always 6 chars */
                len += 16;
        }
        
@@ -290,9 +299,10 @@
        /* mode is same as fopen's modes */
        DIR *dir; 
        struct dirent *de;
-       char path[FILE_MAX];
-       char filename[(FILE_MAXDIR+FILE_MAXFILE)*2];
-       char path_full[(FILE_MAXDIR+FILE_MAXFILE)*2];
+       char path[MAX_PTCACHE_PATH];
+       char filename[MAX_PTCACHE_FILE];
+       char path_full[MAX_PTCACHE_FILE];
+       char ext[MAX_PTCACHE_PATH];
 
        if(!pid->cache)
                return;
@@ -315,9 +325,11 @@
                dir = opendir(path);
                if (dir==NULL)
                        return;
+
+               snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, 
pid->stack_index);
                
                while ((de = readdir(dir)) != NULL) {
-                       if (strstr(de->d_name, PTCACHE_EXT)) { /* do we have 
the right extension?*/
+                       if (strstr(de->d_name, ext)) { /* do we have the right 
extension?*/
                                if (strncmp(filename, de->d_name, len ) == 0) { 
/* do we have the right prefix */
                                        if (mode == PTCACHE_CLEAR_ALL) {
                                                BLI_join_dirfile(path_full, 
path, de->d_name);
@@ -326,8 +338,9 @@
                                                /* read the number of the file 
*/
                                                int frame, len2 = 
strlen(de->d_name);
                                                char num[7];
+
                                                if (len2 > 15) { /* could crash 
if trying to copy a string out of this range*/
-                                                       strncpy(num, de->d_name 
+ (strlen(de->d_name) - 15), 6);
+                                                       BLI_strncpy(num, 
de->d_name + (strlen(de->d_name) - 15), sizeof(num));
                                                        frame = atoi(num);
                                                        
                                                        
if((mode==PTCACHE_CLEAR_BEFORE && frame < cfra) || 
@@ -353,7 +366,7 @@
 
 int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
 {
-       char filename[(FILE_MAXDIR+FILE_MAXFILE)*2];
+       char filename[MAX_PTCACHE_FILE];
 
        if(!pid->cache)
                return 0;
@@ -499,8 +512,8 @@
 /* Use this when quitting blender, with unsaved files */
 void BKE_ptcache_remove(void)
 {
-       char path[FILE_MAX];
-       char path_full[FILE_MAX];
+       char path[MAX_PTCACHE_PATH];
+       char path_full[MAX_PTCACHE_PATH];
        int rmdir = 1;
        
        ptcache_path(NULL, path);


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

Reply via email to