Revision: 38879
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38879
Author:   dfelinto
Date:     2011-07-31 11:12:38 +0000 (Sun, 31 Jul 2011)
Log Message:
-----------
bugfix [#28111] material.pop breaks mt->mat_nr

create a new parameter for materials.pop() to not remove material slot.
this way the mat_nr is still the old one.

for the default behaviour we now have material remapping (i.e. 
data_delete_material_index_id(id, index)).
This new function is brought from the material_slot remove function.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_material.h
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/makesrna/intern/rna_ID.c

Modified: trunk/blender/source/blender/blenkernel/BKE_material.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_material.h      2011-07-31 
10:54:51 UTC (rev 38878)
+++ trunk/blender/source/blender/blenkernel/BKE_material.h      2011-07-31 
11:12:38 UTC (rev 38879)
@@ -78,7 +78,7 @@
 
 /* rna api */
 void material_append_id(struct ID *id, struct Material *ma);
-struct Material *material_pop_id(struct ID *id, int index);
+struct Material *material_pop_id(struct ID *id, int index, int 
remove_material_slot);
 
 /* rendering */
 

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c   2011-07-31 
10:54:51 UTC (rev 38878)
+++ trunk/blender/source/blender/blenkernel/intern/material.c   2011-07-31 
11:12:38 UTC (rev 38879)
@@ -61,8 +61,8 @@
 #include "BKE_material.h"
 #include "BKE_mesh.h"
 #include "BKE_node.h"
+#include "BKE_curve.h"
 
-
 #include "GPU_material.h"
 
 /* used in UI and render */
@@ -515,6 +515,37 @@
        return NULL;
 }
 
+void data_delete_material_index_id(ID *id, int index)
+{
+       Mesh *me;
+       Curve *cu;
+       Nurb *nu;
+       int curvetype;
+
+       switch(GS(id->name)) {
+       case ID_ME:
+               me=(Mesh *)id;
+               mesh_delete_material_index(me, index);
+               break;
+       case ID_CU:
+               cu= (Curve *)id;
+               nu= cu->nurb.first;
+
+               curvetype=curve_type(cu);
+               if (!ELEM(curvetype, OB_CURVE, OB_SURF))
+                       return;
+               
+               while (nu) {
+                       if(nu->mat_nr && nu->mat_nr>=index) {
+                               nu->mat_nr--;
+                               if (curvetype == OB_CURVE) nu->charidx--;
+                       }
+                       nu= nu->next;
+               }
+               break;
+       }
+}
+
 void material_append_id(ID *id, Material *ma)
 {
        Material ***matar;
@@ -532,7 +563,7 @@
        }
 }
 
-Material *material_pop_id(ID *id, int index)
+Material *material_pop_id(ID *id, int index, int remove_material_slot)
 {
        Material *ret= NULL;
        Material ***matar;
@@ -540,27 +571,36 @@
                short *totcol= give_totcolp_id(id);
                if(index >= 0 && index < (*totcol)) {
                        ret= (*matar)[index];
-                       id_us_min((ID *)ret);                   
-                       if(*totcol <= 1) {
-                               *totcol= 0;
-                               MEM_freeN(*matar);
-                               *matar= NULL;
-                       }
-                       else {
-                               Material **mat;
+                       id_us_min((ID *)ret);
 
-                               if(index + 1 != (*totcol))
-                                       memmove((*matar)+index, 
(*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1)));
+                       if (remove_material_slot) {
+                               if(*totcol <= 1) {
+                                       *totcol= 0;
+                                       MEM_freeN(*matar);
+                                       *matar= NULL;
+                               }
+                               else {
+                                       Material **mat;
+                                       if(index + 1 != (*totcol))
+                                               memmove((*matar)+index, 
(*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1)));
 
-                               (*totcol)--;
-                               
-                               mat= MEM_callocN(sizeof(void *) * (*totcol), 
"newmatar");
-                               memcpy(mat, *matar, sizeof(void *) * (*totcol));
-                               MEM_freeN(*matar);
+                                       (*totcol)--;
+                                       
+                                       mat= MEM_callocN(sizeof(void *) * 
(*totcol), "newmatar");
+                                       memcpy(mat, *matar, sizeof(void *) * 
(*totcol));
+                                       MEM_freeN(*matar);
 
-                               *matar= mat;
-                               test_object_materials(id);
+                                       *matar= mat;
+                                       test_object_materials(id);
+                               }
+
+                               /* decrease mat_nr index */
+                               data_delete_material_index_id(id, index);
                        }
+
+                       /* don't remove material slot, only clear it*/
+                       else
+                               (*matar)[index]= NULL;
                }
        }
        
@@ -1025,8 +1065,6 @@
 {
        Material *mao, ***matarar;
        Object *obt;
-       Curve *cu;
-       Nurb *nu;
        short *totcolp;
        int a, actcol;
        
@@ -1086,25 +1124,10 @@
        }
 
        /* check indices from mesh */
-
-       if(ob->type==OB_MESH) {
-               Mesh *me= get_mesh(ob);
-               mesh_delete_material_index(me, actcol-1);
+       if (ELEM3(ob->type, OB_MESH, OB_CURVE, OB_SURF)) {
+               data_delete_material_index_id(&ob->id, actcol-1);
                freedisplist(&ob->disp);
        }
-       else if ELEM(ob->type, OB_CURVE, OB_SURF) {
-               cu= ob->data;
-               nu= cu->nurb.first;
-               
-               while(nu) {
-                       if(nu->mat_nr && nu->mat_nr>=actcol-1) {
-                               nu->mat_nr--;
-                               if (ob->type == OB_CURVE) nu->charidx--;
-                       }
-                       nu= nu->next;
-               }
-               freedisplist(&ob->disp);
-       }
 
        return TRUE;
 }

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c       2011-07-31 
10:54:51 UTC (rev 38878)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c       2011-07-31 
11:12:38 UTC (rev 38879)
@@ -1254,10 +1254,10 @@
 
 void mesh_delete_material_index(Mesh *me, int index)
 {
+       MFace *mf;
        int i;
 
-       for (i=0; i<me->totface; i++) {
-               MFace *mf = &((MFace*) me->mface)[i];
+       for (i=0, mf=me->mface; i<me->totface; i++, mf++) {
                if (mf->mat_nr && mf->mat_nr>=index) 
                        mf->mat_nr--;
        }

Modified: trunk/blender/source/blender/makesrna/intern/rna_ID.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ID.c       2011-07-31 
10:54:51 UTC (rev 38878)
+++ trunk/blender/source/blender/makesrna/intern/rna_ID.c       2011-07-31 
11:12:38 UTC (rev 38879)
@@ -418,6 +418,7 @@
        RNA_def_function_ui_description(func, "Remove a material from the data 
block.");
        parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "", "Index of material 
to remove.", 0, INT_MAX);
        RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_boolean(func, "remove_material_slot", 1, "", "Remove the 
material slot and assign 1st material to old faces.");
        parm= RNA_def_pointer(func, "material", "Material", "", "Material to 
remove.");
        RNA_def_function_return(func, parm);
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to