From b57fc113aa12134e19ff721a52614aed51d0bda5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Mar 2013 20:54:48 +0000 Subject: [PATCH] python api: add functionality to remove uv-texture layers. --- source/blender/editors/include/ED_mesh.h | 8 ++- source/blender/editors/mesh/mesh_data.c | 67 +++++++++++++------ .../editors/physics/dynamicpaint_ops.c | 3 +- .../editors/uvedit/uvedit_unwrap_ops.c | 2 +- source/blender/makesrna/intern/rna_mesh.c | 38 +++++------ .../bad_level_call_stubs/stubs.c | 5 +- 6 files changed, 77 insertions(+), 46 deletions(-) diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 07073e46642..f84281a4f08 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -254,11 +254,13 @@ void ED_mesh_calc_tessface(struct Mesh *mesh); void ED_mesh_material_link(struct Mesh *me, struct Material *ma); void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges, int calc_tessface); -int ED_mesh_uv_texture_add(struct bContext *C, struct Mesh *me, const char *name, int active_set); -int ED_mesh_uv_texture_remove(struct bContext *C, struct Object *ob, struct Mesh *me); +int ED_mesh_uv_texture_add(struct Mesh *me, const char *name, const bool active_set); +bool ED_mesh_uv_texture_remove_index(struct Mesh *me, const int n); +bool ED_mesh_uv_texture_remove_active(struct Mesh *me); +bool ED_mesh_uv_texture_remove_named(struct Mesh *me, const char *name); int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me); int ED_mesh_uv_loop_reset_ex(struct Mesh *me, const int layernum); -int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set); +int ED_mesh_color_add(struct Mesh *me, const char *name, const bool active_set); bool ED_mesh_color_remove_index(struct Mesh *me, const int n); bool ED_mesh_color_remove_active(struct Mesh *me); bool ED_mesh_color_remove_named(struct Mesh *me, const char *name); diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index 751529faf82..20633aa0c87 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -340,7 +340,7 @@ int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me) } /* note: keep in sync with ED_mesh_color_add */ -int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set) +int ED_mesh_uv_texture_add(Mesh *me, const char *name, const bool active_set) { BMEditMesh *em; int layernum_dst; @@ -411,37 +411,68 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s } DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); + WM_main_add_notifier(NC_GEOM | ND_DATA, me); return layernum_dst; } -int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me) +bool ED_mesh_uv_texture_remove_index(Mesh *me, const int n) { CustomData *pdata = GET_CD_DATA(me, pdata), *ldata = GET_CD_DATA(me, ldata); CustomDataLayer *cdlp, *cdlu; int index; - index = CustomData_get_active_layer_index(pdata, CD_MTEXPOLY); + index = CustomData_get_layer_index_n(pdata, CD_MTEXPOLY, n); cdlp = (index == -1) ? NULL : &pdata->layers[index]; - index = CustomData_get_active_layer_index(ldata, CD_MLOOPUV); + index = CustomData_get_layer_index_n(ldata, CD_MLOOPUV, n); cdlu = (index == -1) ? NULL : &ldata->layers[index]; - + if (!cdlp || !cdlu) - return 0; + return false; + + delete_customdata_layer(me, cdlp); + delete_customdata_layer(me, cdlu); - delete_customdata_layer(ob->data, cdlp); - delete_customdata_layer(ob->data, cdlu); - DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); + WM_main_add_notifier(NC_GEOM | ND_DATA, me); - return 1; + return true; +} +bool ED_mesh_uv_texture_remove_active(Mesh *me) +{ + /* texpoly/uv are assumed to be in sync */ + CustomData *pdata = GET_CD_DATA(me, pdata); + const int n = CustomData_get_active_layer(pdata, CD_MTEXPOLY); + + /* double check active layers align! */ +#ifdef DEBUG + CustomData *ldata = GET_CD_DATA(me, ldata); + BLI_assert(CustomData_get_active_layer(ldata, CD_MLOOPUV) == n); +#endif + + if (n != -1) { + return ED_mesh_uv_texture_remove_index(me, n); + } + else { + return false; + } +} +bool ED_mesh_uv_texture_remove_named(Mesh *me, const char *name) +{ + /* texpoly/uv are assumed to be in sync */ + CustomData *pdata = GET_CD_DATA(me, pdata); + const int n = CustomData_get_named_layer(pdata, CD_MTEXPOLY, name); + if (n != -1) { + return ED_mesh_uv_texture_remove_index(me, n); + } + else { + return false; + } } /* note: keep in sync with ED_mesh_uv_texture_add */ -int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mesh *me, const char *name, int active_set) +int ED_mesh_color_add(Mesh *me, const char *name, const bool active_set) { BMEditMesh *em; int layernum; @@ -489,7 +520,7 @@ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mes } DAG_id_tag_update(&me->id, 0); - WM_event_add_notifier(C, NC_GEOM | ND_DATA, me); + WM_main_add_notifier(NC_GEOM | ND_DATA, me); return layernum; } @@ -523,7 +554,6 @@ bool ED_mesh_color_remove_active(Mesh *me) return false; } } - bool ED_mesh_color_remove_named(Mesh *me, const char *name) { CustomData *ldata = GET_CD_DATA(me, ldata); @@ -550,7 +580,7 @@ static int mesh_uv_texture_add_exec(bContext *C, wmOperator *UNUSED(op)) Object *ob = ED_object_context(C); Mesh *me = ob->data; - if (ED_mesh_uv_texture_add(C, me, NULL, true) == -1) + if (ED_mesh_uv_texture_add(me, NULL, true) == -1) return OPERATOR_CANCELLED; return OPERATOR_FINISHED; @@ -670,7 +700,7 @@ static int mesh_uv_texture_remove_exec(bContext *C, wmOperator *UNUSED(op)) Object *ob = ED_object_context(C); Mesh *me = ob->data; - if (!ED_mesh_uv_texture_remove(C, ob, me)) + if (!ED_mesh_uv_texture_remove_active(me)) return OPERATOR_CANCELLED; return OPERATOR_FINISHED; @@ -695,11 +725,10 @@ void MESH_OT_uv_texture_remove(wmOperatorType *ot) static int mesh_vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op)) { - Scene *scene = CTX_data_scene(C); Object *ob = ED_object_context(C); Mesh *me = ob->data; - if (ED_mesh_color_add(C, scene, ob, me, NULL, true) == -1) + if (ED_mesh_color_add(me, NULL, true) == -1) return OPERATOR_CANCELLED; return OPERATOR_FINISHED; diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c index 73d3c02c9f1..aa4652af0ba 100644 --- a/source/blender/editors/physics/dynamicpaint_ops.c +++ b/source/blender/editors/physics/dynamicpaint_ops.c @@ -202,7 +202,6 @@ void DPAINT_OT_type_toggle(wmOperatorType *ot) static int output_toggle_exec(bContext *C, wmOperator *op) { Object *ob = ED_object_context(C); - Scene *scene = CTX_data_scene(C); DynamicPaintSurface *surface; DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint); int output = RNA_enum_get(op->ptr, "output"); /* currently only 1/0 */ @@ -223,7 +222,7 @@ static int output_toggle_exec(bContext *C, wmOperator *op) /* Vertex Color Layer */ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) { if (!exists) - ED_mesh_color_add(C, scene, ob, ob->data, name, 1); + ED_mesh_color_add(ob->data, name, true); else ED_mesh_color_remove_named(ob->data, name); } diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index 9de43fc9d6b..b80862d4db5 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -121,7 +121,7 @@ static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit) return 1; if (em && em->bm->totface && !CustomData_has_layer(&em->bm->pdata, CD_MTEXPOLY)) - ED_mesh_uv_texture_add(C, obedit->data, NULL, TRUE); + ED_mesh_uv_texture_add(obedit->data, NULL, true); if (!ED_uvedit_test(obedit)) return 0; diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 8a98b4b055e..fc1fe0b08de 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -1268,12 +1268,12 @@ static int rna_Mesh_tot_face_get(PointerRNA *ptr) return me->edit_btmesh ? me->edit_btmesh->bm->totfacesel : 0; } -static PointerRNA rna_Mesh_vertex_color_new(struct Mesh *me, struct bContext *C, const char *name) +static PointerRNA rna_Mesh_vertex_color_new(struct Mesh *me, const char *name) { PointerRNA ptr; CustomData *ldata; CustomDataLayer *cdl = NULL; - int index = ED_mesh_color_add(C, NULL, NULL, me, name, FALSE); + int index = ED_mesh_color_add(me, name, false); if (index != -1) { ldata = rna_mesh_ldata_helper(me); @@ -1291,8 +1291,7 @@ static void rna_Mesh_vertex_color_remove(struct Mesh *me, ReportList *reports, C } } -static PointerRNA rna_Mesh_tessface_vertex_color_new(struct Mesh *me, struct bContext *C, ReportList *reports, - const char *name) +static PointerRNA rna_Mesh_tessface_vertex_color_new(struct Mesh *me, ReportList *reports, const char *name) { PointerRNA ptr; CustomData *fdata; @@ -1309,7 +1308,7 @@ static PointerRNA rna_Mesh_tessface_vertex_color_new(struct Mesh *me, struct bCo return PointerRNA_NULL; } - index = ED_mesh_color_add(C, NULL, NULL, me, name, FALSE); + index = ED_mesh_color_add(me, name, false); if (index != -1) { fdata = rna_mesh_fdata_helper(me); @@ -1365,12 +1364,12 @@ static PointerRNA rna_Mesh_polygon_string_property_new(struct Mesh *me, struct b return ptr; } -static PointerRNA rna_Mesh_uv_texture_new(struct Mesh *me, struct bContext *C, const char *name) +static PointerRNA rna_Mesh_uv_texture_new(struct Mesh *me, const char *name) { PointerRNA ptr; CustomData *pdata; CustomDataLayer *cdl = NULL; - int index = ED_mesh_uv_texture_add(C, me, name, FALSE); + int index = ED_mesh_uv_texture_add(me, name, false); if (index != -1) { pdata = rna_mesh_pdata_helper(me); @@ -1381,11 +1380,17 @@ static PointerRNA rna_Mesh_uv_texture_new(struct Mesh *me, struct bContext *C, c return ptr; } +static void rna_Mesh_uv_texture_layers_remove(struct Mesh *me, ReportList *reports, CustomDataLayer *layer) +{ + if (ED_mesh_uv_texture_remove_named(me, layer->name) == false) { + BKE_reportf(reports, RPT_ERROR, "texture layer '%s' not found", layer->name); + } +} + /* while this is supposed to be readonly, * keep it to support importers that only make tessfaces */ -static PointerRNA rna_Mesh_tessface_uv_texture_new(struct Mesh *me, struct bContext *C, ReportList *reports, - const char *name) +static PointerRNA rna_Mesh_tessface_uv_texture_new(struct Mesh *me, ReportList *reports, const char *name) { PointerRNA ptr; CustomData *fdata; @@ -1402,7 +1407,7 @@ static PointerRNA rna_Mesh_tessface_uv_texture_new(struct Mesh *me, struct bCont return PointerRNA_NULL; } - index = ED_mesh_uv_texture_add(C, me, name, FALSE); + index = ED_mesh_uv_texture_add(me, name, false); if (index != -1) { fdata = rna_mesh_fdata_helper(me); @@ -2373,7 +2378,7 @@ static void rna_def_tessface_vertex_colors(BlenderRNA *brna, PropertyRNA *cprop) /* eventually deprecate this */ func = RNA_def_function(srna, "new", "rna_Mesh_tessface_vertex_color_new"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS); + RNA_def_function_flag(func, FUNC_USE_REPORTS); RNA_def_function_ui_description(func, "Add a vertex color layer to Mesh"); RNA_def_string(func, "name", "Col", 0, "", "Vertex color name"); parm = RNA_def_pointer(func, "layer", "MeshColorLayer", "", "The newly created layer"); @@ -2408,7 +2413,6 @@ static void rna_def_loop_colors(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_struct_ui_text(srna, "Loop Colors", "Collection of vertex colors"); func = RNA_def_function(srna, "new", "rna_Mesh_vertex_color_new"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Add a vertex color layer to Mesh"); RNA_def_string(func, "name", "Col", 0, "", "Vertex color name"); parm = RNA_def_pointer(func, "layer", "MeshLoopColorLayer", "", "The newly created layer"); @@ -2547,7 +2551,7 @@ static void rna_def_tessface_uv_textures(BlenderRNA *brna, PropertyRNA *cprop) /* eventually deprecate this */ func = RNA_def_function(srna, "new", "rna_Mesh_tessface_uv_texture_new"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS); + RNA_def_function_flag(func, FUNC_USE_REPORTS); RNA_def_function_ui_description(func, "Add a UV tessface-texture layer to Mesh (only for meshes with no polygons)"); RNA_def_string(func, "name", "UVMap", 0, "", "UV map name"); parm = RNA_def_pointer(func, "layer", "MeshTextureFaceLayer", "", "The newly created layer"); @@ -2584,21 +2588,17 @@ static void rna_def_uv_textures(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_struct_ui_text(srna, "UV Maps", "Collection of UV maps"); func = RNA_def_function(srna, "new", "rna_Mesh_uv_texture_new"); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function_ui_description(func, "Add a UV map layer to Mesh"); RNA_def_string(func, "name", "UVMap", 0, "", "UV map name"); parm = RNA_def_pointer(func, "layer", "MeshTexturePolyLayer", "", "The newly created layer"); RNA_def_property_flag(parm, PROP_RNAPTR); RNA_def_function_return(func, parm); -#if 0 func = RNA_def_function(srna, "remove", "rna_Mesh_uv_texture_layers_remove"); RNA_def_function_ui_description(func, "Remove a vertex color layer"); RNA_def_function_flag(func, FUNC_USE_REPORTS); - parm = RNA_def_pointer(func, "layer", "Layer", "", "The layer to remove"); - RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR); - RNA_def_property_clear_flag(parm, PROP_THICK_WRAP); -#endif + parm = RNA_def_pointer(func, "layer", "MeshTexturePolyLayer", "", "The layer to remove"); + RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL); prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "MeshTexturePolyLayer"); diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 19f128e094d..ea16e5d4d1f 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -370,9 +370,10 @@ void ED_mesh_vertices_remove(struct Mesh *mesh, struct ReportList *reports, int void ED_mesh_edges_remove(struct Mesh *mesh, struct ReportList *reports, int count) {} void ED_mesh_faces_remove(struct Mesh *mesh, struct ReportList *reports, int count) {} void ED_mesh_material_link(struct Mesh *mesh, struct Material *ma) {} -int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me) {return 0;} -int ED_mesh_uv_texture_add(struct bContext *C, struct Mesh *me) {return 0;} +int ED_mesh_color_add(struct Mesh *me, const char *name, const bool active_set) { return -1; } +int ED_mesh_uv_texture_add(struct Mesh *me, const char *name, const bool active_set) { return -1; } bool ED_mesh_color_remove_named(struct Mesh *me, const char *name) { return false; } +bool ED_mesh_uv_texture_remove_named(struct Mesh *me, const char *name) { return false; } void ED_object_constraint_dependency_update(struct Scene *scene, struct Object *ob) {} void ED_object_constraint_update(struct Object *ob) {} struct bDeformGroup *ED_vgroup_add_name(struct Object *ob, char *name) {return (struct bDeformGroup *) NULL;}