diff options
Diffstat (limited to 'source/blender/editors/mesh/mesh_layers.c')
-rw-r--r-- | source/blender/editors/mesh/mesh_layers.c | 88 |
1 files changed, 34 insertions, 54 deletions
diff --git a/source/blender/editors/mesh/mesh_layers.c b/source/blender/editors/mesh/mesh_layers.c index 2430ecdd110..be476b07a3f 100644 --- a/source/blender/editors/mesh/mesh_layers.c +++ b/source/blender/editors/mesh/mesh_layers.c @@ -169,20 +169,21 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la /*********************** UV texture operators ************************/ +static int layers_poll(bContext *C) +{ + Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + ID *data= (ob)? ob->data: NULL; + return (ob && !ob->id.lib && ob->type==OB_MESH && data && !data->lib); +} + static int uv_texture_add_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - Mesh *me; + Mesh *me= ob->data; BMEditMesh *em; int layernum; - if(!ob || ob->type!=OB_MESH) - return OPERATOR_CANCELLED; - - me= (Mesh*)ob->data; - - if(scene->obedit == ob) { + if(me->edit_btmesh) { em= me->edit_btmesh; layernum= CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY); @@ -193,7 +194,7 @@ static int uv_texture_add_exec(bContext *C, wmOperator *op) BM_add_data_layer(em->bm, &em->bm->ldata, CD_MLOOPUV); CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum); } - else if(ob) { + else { layernum= CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY); if(layernum >= MAX_MTFACE) return OPERATOR_CANCELLED; @@ -214,8 +215,8 @@ static int uv_texture_add_exec(bContext *C, wmOperator *op) mesh_update_customdata_pointers(me); } - DAG_object_flush_update(scene, ob, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob); + DAG_id_flush_update(&me->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); return OPERATOR_FINISHED; } @@ -228,6 +229,7 @@ void MESH_OT_uv_texture_add(wmOperatorType *ot) ot->idname= "MESH_OT_uv_texture_add"; /* api callbacks */ + ot->poll= layers_poll; ot->exec= uv_texture_add_exec; /* flags */ @@ -236,16 +238,11 @@ void MESH_OT_uv_texture_add(wmOperatorType *ot) static int uv_texture_remove_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - Mesh *me; + Mesh *me= ob->data; CustomDataLayer *cdl, *cdl2; int index; - if(!ob || ob->type!=OB_MESH) - return OPERATOR_CANCELLED; - - me= (Mesh*)ob->data; index= CustomData_get_active_layer_index(&me->pdata, CD_MTEXPOLY); cdl= (index == -1)? NULL: &me->pdata.layers[index]; @@ -258,8 +255,8 @@ static int uv_texture_remove_exec(bContext *C, wmOperator *op) delete_customdata_layer(C, ob, cdl, 0); delete_customdata_layer(C, ob, cdl2, 1); - DAG_object_flush_update(scene, ob, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob); + DAG_id_flush_update(&me->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); return OPERATOR_FINISHED; } @@ -272,6 +269,7 @@ void MESH_OT_uv_texture_remove(wmOperatorType *ot) ot->idname= "MESH_OT_uv_texture_remove"; /* api callbacks */ + ot->poll= layers_poll; ot->exec= uv_texture_remove_exec; /* flags */ @@ -284,17 +282,12 @@ static int vertex_color_add_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - Mesh *me; + Mesh *me= ob->data; BMEditMesh *em; MLoopCol *mcol; int layernum; - if(!ob || ob->type!=OB_MESH) - return OPERATOR_CANCELLED; - - me= (Mesh*)ob->data; - - if(scene->obedit == ob) { + if(me->edit_btmesh) { em= me->edit_btmesh; layernum= CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPCOL); @@ -328,8 +321,8 @@ static int vertex_color_add_exec(bContext *C, wmOperator *op) // shadeMeshMCol(scene, ob, me); } - DAG_object_flush_update(scene, ob, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob); + DAG_id_flush_update(&me->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); return OPERATOR_FINISHED; } @@ -342,6 +335,7 @@ void MESH_OT_vertex_color_add(wmOperatorType *ot) ot->idname= "MESH_OT_vertex_color_add"; /* api callbacks */ + ot->poll= layers_poll; ot->exec= vertex_color_add_exec; /* flags */ @@ -350,16 +344,11 @@ void MESH_OT_vertex_color_add(wmOperatorType *ot) static int vertex_color_remove_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - Mesh *me; + Mesh *me= ob->data; CustomDataLayer *cdl; int index; - if(!ob || ob->type!=OB_MESH) - return OPERATOR_CANCELLED; - - me= (Mesh*)ob->data; index= CustomData_get_active_layer_index(&me->ldata, CD_MLOOPCOL); cdl= (index == -1)? NULL: &me->ldata.layers[index]; @@ -368,8 +357,8 @@ static int vertex_color_remove_exec(bContext *C, wmOperator *op) delete_customdata_layer(C, ob, cdl, 1); - DAG_object_flush_update(scene, ob, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob); + DAG_id_flush_update(&me->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); return OPERATOR_FINISHED; } @@ -383,6 +372,7 @@ void MESH_OT_vertex_color_remove(wmOperatorType *ot) /* api callbacks */ ot->exec= vertex_color_remove_exec; + ot->poll= layers_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -392,22 +382,16 @@ void MESH_OT_vertex_color_remove(wmOperatorType *ot) static int sticky_add_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - Mesh *me; - - if(!ob || ob->type!=OB_MESH) - return OPERATOR_CANCELLED; - - me= (Mesh*)ob->data; + Mesh *me= ob->data; if(me->msticky) return OPERATOR_CANCELLED; // XXX RE_make_sticky(); - DAG_object_flush_update(scene, ob, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob); + DAG_id_flush_update(&me->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); return OPERATOR_FINISHED; } @@ -420,6 +404,7 @@ void MESH_OT_sticky_add(wmOperatorType *ot) ot->idname= "MESH_OT_sticky_add"; /* api callbacks */ + ot->poll= layers_poll; ot->exec= sticky_add_exec; /* flags */ @@ -428,14 +413,8 @@ void MESH_OT_sticky_add(wmOperatorType *ot) static int sticky_remove_exec(bContext *C, wmOperator *op) { - Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - Mesh *me; - - if(!ob || ob->type!=OB_MESH) - return OPERATOR_CANCELLED; - - me= (Mesh*)ob->data; + Mesh *me= ob->data; if(!me->msticky) return OPERATOR_CANCELLED; @@ -443,8 +422,8 @@ static int sticky_remove_exec(bContext *C, wmOperator *op) CustomData_free_layer_active(&me->vdata, CD_MSTICKY, me->totvert); me->msticky= NULL; - DAG_object_flush_update(scene, ob, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob); + DAG_id_flush_update(&me->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, me); return OPERATOR_FINISHED; } @@ -457,6 +436,7 @@ void MESH_OT_sticky_remove(wmOperatorType *ot) ot->idname= "MESH_OT_sticky_remove"; /* api callbacks */ + ot->poll= layers_poll; ot->exec= sticky_remove_exec; /* flags */ |