[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38879] trunk/blender/source/blender: bugfix [#28111] material.pop breaks mt->mat_nr
Dalai Felinto
dfelinto at gmail.com
Sun Jul 31 13:12:38 CEST 2011
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);
}
More information about the Bf-blender-cvs
mailing list