Two fixes:
authorJoshua Leung <aligorith@gmail.com>
Thu, 22 Oct 2009 03:12:44 +0000 (03:12 +0000)
committerJoshua Leung <aligorith@gmail.com>
Thu, 22 Oct 2009 03:12:44 +0000 (03:12 +0000)
* RNA Path fixing when renaming data now checks if a path in question cannot be resolved before trying to fix it. This should reduce the number of misindentified cases I hope.

* Silenced compiler warnings for EdgeSlide stuff that mingw was making about unused variables.

source/blender/blenkernel/intern/anim_sys.c
source/blender/editors/transform/transform.c

index 7088081d66f2283c42dcb4eabd51694e6d27f91f..61e754ffbec6aac9654e162cd043dfa5ed2ec648 100644 (file)
@@ -238,6 +238,19 @@ void BKE_animdata_make_local(AnimData *adt)
 
 /* Path Validation -------------------------------------------- */
 
+/* Check if a given RNA Path is valid, by tracing it from the given ID, and seeing if we can resolve it */
+static short check_rna_path_is_valid (ID *owner_id, char *path)
+{
+       PointerRNA id_ptr, ptr;
+       PropertyRNA *prop=NULL;
+       
+       /* make initial RNA pointer to start resolving from */
+       RNA_id_pointer_create(owner_id, &id_ptr);
+       
+       /* try to resolve */
+       return RNA_path_resolve(&id_ptr, path, &ptr, &prop); 
+}
+
 /* Check if some given RNA Path needs fixing - free the given path and set a new one as appropriate 
  * NOTE: we assume that oldName and newName have [" "] padding around them
  */
@@ -249,39 +262,49 @@ static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, cha
        int oldNameLen= strlen(oldName);
        
        /* only start fixing the path if the prefix and oldName feature in the path,
-        * and prefix occurs immediately before oldName (the +2 should take care of any [")
+        * and prefix occurs immediately before oldName
         */
        if ( (prefixPtr && oldNamePtr) && (prefixPtr+prefixLen == oldNamePtr) ) {
-               DynStr *ds= BLI_dynstr_new();
-               char *postfixPtr= oldNamePtr+oldNameLen;
-               char *newPath = NULL;
-               char oldChar;
-               
-               /* add the part of the string that goes up to the start of the prefix */
-               if (prefixPtr > oldpath) {
-                       oldChar= prefixPtr[0]; 
-                       prefixPtr[0]= 0;
-                       BLI_dynstr_append(ds, oldpath);
-                       prefixPtr[0]= oldChar;
+               /* if we haven't aren't able to resolve the path now, try again after fixing it */
+               if (check_rna_path_is_valid(owner_id, oldpath) == 0) {          
+                       DynStr *ds= BLI_dynstr_new();
+                       char *postfixPtr= oldNamePtr+oldNameLen;
+                       char *newPath = NULL;
+                       char oldChar;
+                       
+                       /* add the part of the string that goes up to the start of the prefix */
+                       if (prefixPtr > oldpath) {
+                               oldChar= prefixPtr[0]; 
+                               prefixPtr[0]= 0;
+                               BLI_dynstr_append(ds, oldpath);
+                               prefixPtr[0]= oldChar;
+                       }
+                       
+                       /* add the prefix */
+                       BLI_dynstr_append(ds, prefix);
+                       
+                       /* add the new name (complete with brackets) */
+                       BLI_dynstr_append(ds, newName);
+                       
+                       /* add the postfix */
+                       BLI_dynstr_append(ds, postfixPtr);
+                       
+                       /* create new path, and cleanup old data */
+                       newPath= BLI_dynstr_get_cstring(ds);
+                       BLI_dynstr_free(ds);
+                       
+                       /* check if the new path will solve our problems */
+                       // TODO: will need to check whether this step really helps in practice
+                       if (check_rna_path_is_valid(owner_id, newPath)) {
+                               /* free the old path, and return the new one, since we've solved the issues */
+                               MEM_freeN(oldpath);
+                               return newPath;
+                       }
+                       else {
+                               /* still couldn't resolve the path... so, might as well just leave it alone */
+                               MEM_freeN(newPath);
+                       }
                }
-               
-               /* add the prefix */
-               BLI_dynstr_append(ds, prefix);
-               
-               /* add the new name (complete with brackets) */
-               BLI_dynstr_append(ds, newName);
-               
-               /* add the postfix */
-               BLI_dynstr_append(ds, postfixPtr);
-               
-               /* create new path, and cleanup old data */
-               newPath= BLI_dynstr_get_cstring(ds);
-               BLI_dynstr_free(ds);
-               
-               MEM_freeN(oldpath);
-               
-               /* return the new path */
-               return newPath;
        }
        
        /* the old path doesn't need to be changed */
index 3b001bff12f517d16ff396597637e5ea3532f2f3..7497cd730559d2915aa91afec62764719ae9b68f 100644 (file)
@@ -3942,10 +3942,8 @@ static int createSlideVerts(TransInfo *t)
        LinkNode *edgelist = NULL, *vertlist=NULL, *look;
        GHash *vertgh;
        TransDataSlideVert *tempsv;
-       float perc = 0, percp = 0,vertdist; // XXX, projectMat[4][4];
-       float shiftlabda= 0.0f,len = 0.0f;
-       int i, j, numsel, numadded=0, timesthrough = 0, vertsel=0, prop=1, cancel = 0,flip=0;
-       int wasshift = 0;
+       float vertdist; // XXX, projectMat[4][4];
+       int i, j, numsel, numadded=0, timesthrough = 0, vertsel=0;
        /* UV correction vars */
        GHash **uvarray= NULL;
        SlideData *sld = MEM_callocN(sizeof(*sld), "sld");
@@ -3956,8 +3954,7 @@ static int createSlideVerts(TransInfo *t)
        float projectMat[4][4];
        float start[3] = {0.0f, 0.0f, 0.0f}, end[3] = {0.0f, 0.0f, 0.0f};
        float vec[3];
-       //short mval[2], mvalo[2];
-       float labda = 0.0f, totvec=0.0;
+       float totvec=0.0;
 
        if (!v3d) {
                /*ok, let's try to survive this*/
@@ -3965,8 +3962,7 @@ static int createSlideVerts(TransInfo *t)
        } else {
                view3d_get_object_project_mat(v3d, t->obedit, projectMat);
        }
-
-       //mvalo[0] = -1; mvalo[1] = -1;
+       
        numsel =0;
 
        // Get number of selected edges and clear some flags
@@ -4468,23 +4464,20 @@ int doEdgeSlide(TransInfo *t, float perc)
        Mesh *me= t->obedit->data;
        EditMesh *em = me->edit_mesh;
        SlideData *sld = t->customData;
-       EditEdge *first=NULL,*last=NULL, *temp = NULL;
        EditVert *ev, *nearest = sld->nearest;
        EditVert *centerVert, *upVert, *downVert;
-       LinkNode *edgelist = sld->edgelist, *vertlist=sld->vertlist, *look;
+       LinkNode *vertlist=sld->vertlist, *look;
        GHash *vertgh = sld->vhash;
        TransDataSlideVert *tempsv;
-       float shiftlabda= 0.0f,len = 0.0f;
-       int i = 0, numadded=0, timesthrough = 0, vertsel=0, prop=1, cancel = 0,flip=0;
-       int wasshift = 0;
+       float len = 0.0f;
+       int prop=1, flip=0;
        /* UV correction vars */
        GHash **uvarray= sld->uvhash;
        int  uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
        int uvlay_idx;
-       TransDataSlideUv *slideuvs=sld->slideuv, *suv=sld->slideuv, *suv_last=NULL;
+       TransDataSlideUv *suv=sld->slideuv;
        float uv_tmp[2];
        LinkNode *fuv_link;
-       float labda = 0.0f;
 
        len = 0.0f;
 
@@ -4579,7 +4572,6 @@ int doEdgeSlide(TransInfo *t, float perc)
 
 int EdgeSlide(TransInfo *t, short mval[2])
 {
-       TransData *td = t->data;
        char str[50];
        float final;