4 * ***** BEGIN GPL LICENSE BLOCK *****
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 * The Original Code is Copyright (C) 2009 Blender Foundation.
21 * All rights reserved.
24 * Contributor(s): Blender Foundation
26 * ***** END GPL LICENSE BLOCK *****
33 #include "MEM_guardedalloc.h"
35 #include "DNA_material_types.h"
36 #include "DNA_meshdata_types.h"
37 #include "DNA_object_types.h"
38 #include "DNA_scene_types.h"
39 #include "DNA_view3d_types.h"
42 #include "BLI_editVert.h"
43 #include "BLI_edgehash.h"
44 #include "BLI_utildefines.h"
46 #include "BKE_context.h"
47 #include "BKE_depsgraph.h"
48 #include "BKE_displist.h"
49 #include "BKE_image.h"
50 #include "BKE_library.h"
51 #include "BKE_material.h"
53 #include "BKE_report.h"
55 #include "RNA_access.h"
56 #include "RNA_define.h"
62 #include "ED_object.h"
63 #include "ED_uvedit.h"
64 #include "ED_view3d.h"
66 #include "RE_render_ext.h"
68 #include "mesh_intern.h"
70 static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *layer)
73 CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
74 void *actlayerdata, *rndlayerdata, *clonelayerdata, *stencillayerdata, *layerdata=layer->data;
75 int type= layer->type;
76 int index= CustomData_get_layer_index(data, type);
77 int i, actindex, rndindex, cloneindex, stencilindex;
79 /* ok, deleting a non-active layer needs to preserve the active layer indices.
80 to do this, we store a pointer to the .data member of both layer and the active layer,
81 (to detect if we're deleting the active layer or not), then use the active
82 layer data pointer to find where the active layer has ended up.
84 this is necassary because the deletion functions only support deleting the active
86 actlayerdata = data->layers[CustomData_get_active_layer_index(data, type)].data;
87 rndlayerdata = data->layers[CustomData_get_render_layer_index(data, type)].data;
88 clonelayerdata = data->layers[CustomData_get_clone_layer_index(data, type)].data;
89 stencillayerdata = data->layers[CustomData_get_stencil_layer_index(data, type)].data;
90 CustomData_set_layer_active(data, type, layer - &data->layers[index]);
93 EM_free_data_layer(me->edit_mesh, data, type);
96 CustomData_free_layer_active(data, type, me->totface);
97 mesh_update_customdata_pointers(me);
100 if(!CustomData_has_layer(data, type) && (type == CD_MCOL && (ob->mode & OB_MODE_VERTEX_PAINT)))
101 ED_object_toggle_modes(C, OB_MODE_VERTEX_PAINT);
103 /* reconstruct active layer */
104 if (actlayerdata != layerdata) {
106 actindex = CustomData_get_layer_index(data, type);
107 for (i=actindex; i<data->totlayer; i++) {
108 if (data->layers[i].data == actlayerdata) {
109 actindex = i - actindex;
115 CustomData_set_layer_active(data, type, actindex);
118 if (rndlayerdata != layerdata) {
120 rndindex = CustomData_get_layer_index(data, type);
121 for (i=rndindex; i<data->totlayer; i++) {
122 if (data->layers[i].data == rndlayerdata) {
123 rndindex = i - rndindex;
129 CustomData_set_layer_render(data, type, rndindex);
132 if (clonelayerdata != layerdata) {
134 cloneindex = CustomData_get_layer_index(data, type);
135 for (i=cloneindex; i<data->totlayer; i++) {
136 if (data->layers[i].data == clonelayerdata) {
137 cloneindex = i - cloneindex;
143 CustomData_set_layer_clone(data, type, cloneindex);
146 if (stencillayerdata != layerdata) {
148 stencilindex = CustomData_get_layer_index(data, type);
149 for (i=stencilindex; i<data->totlayer; i++) {
150 if (data->layers[i].data == stencillayerdata) {
151 stencilindex = i - stencilindex;
157 CustomData_set_layer_stencil(data, type, stencilindex);
161 int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set)
169 layernum= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
170 if(layernum >= MAX_MTFACE)
173 EM_add_data_layer(em, &em->fdata, CD_MTFACE, name);
174 if(active_set || layernum==0)
175 CustomData_set_layer_active(&em->fdata, CD_MTFACE, layernum);
178 layernum= CustomData_number_of_layers(&me->fdata, CD_MTFACE);
179 if(layernum >= MAX_MTFACE)
183 CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface, name);
185 CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface, name);
187 if(active_set || layernum==0)
188 CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum);
190 mesh_update_customdata_pointers(me);
193 DAG_id_tag_update(&me->id, 0);
194 WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
199 int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
201 CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
202 CustomDataLayer *cdl;
205 index= CustomData_get_active_layer_index(data, CD_MTFACE);
206 cdl= (index == -1) ? NULL: &data->layers[index];
211 delete_customdata_layer(C, ob, cdl);
212 DAG_id_tag_update(&me->id, 0);
213 WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
218 int ED_mesh_color_add(bContext *C, Scene *scene, Object *ob, Mesh *me, const char *name, int active_set)
227 layernum= CustomData_number_of_layers(&em->fdata, CD_MCOL);
228 if(layernum >= MAX_MCOL)
231 EM_add_data_layer(em, &em->fdata, CD_MCOL, name);
232 if(active_set || layernum==0)
233 CustomData_set_layer_active(&em->fdata, CD_MCOL, layernum);
236 layernum= CustomData_number_of_layers(&me->fdata, CD_MCOL);
237 if(layernum >= MAX_MCOL)
243 CustomData_add_layer_named(&me->fdata, CD_MCOL, CD_DUPLICATE, me->mcol, me->totface, name);
245 CustomData_add_layer_named(&me->fdata, CD_MCOL, CD_DEFAULT, NULL, me->totface, name);
247 if(active_set || layernum==0)
248 CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum);
250 mesh_update_customdata_pointers(me);
253 shadeMeshMCol(scene, ob, me);
256 DAG_id_tag_update(&me->id, 0);
257 WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
262 int ED_mesh_color_remove(bContext *C, Object *ob, Mesh *me)
264 CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
265 CustomDataLayer *cdl;
268 index= CustomData_get_active_layer_index(data, CD_MCOL);
269 cdl= (index == -1)? NULL: &data->layers[index];
274 delete_customdata_layer(C, ob, cdl);
275 DAG_id_tag_update(&me->id, 0);
276 WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
281 /*********************** UV texture operators ************************/
283 static int layers_poll(bContext *C)
285 Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
286 ID *data= (ob)? ob->data: NULL;
287 return (ob && !ob->id.lib && ob->type==OB_MESH && data && !data->lib);
290 static int uv_texture_add_exec(bContext *C, wmOperator *UNUSED(op))
292 Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
295 if(!ED_mesh_uv_texture_add(C, me, NULL, TRUE))
296 return OPERATOR_CANCELLED;
298 return OPERATOR_FINISHED;
301 void MESH_OT_uv_texture_add(wmOperatorType *ot)
304 ot->name= "Add UV Texture";
305 ot->description= "Add UV texture layer";
306 ot->idname= "MESH_OT_uv_texture_add";
309 ot->poll= layers_poll;
310 ot->exec= uv_texture_add_exec;
313 ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
316 static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
318 Scene *scene= CTX_data_scene(C);
319 Base *base= ED_view3d_give_base_under_cursor(C, event->mval);
327 if(base==NULL || base->object->type!=OB_MESH) {
328 BKE_report(op->reports, RPT_ERROR, "Not an Object or Mesh");
329 return OPERATOR_CANCELLED;
332 /* check input variables */
333 if(RNA_property_is_set(op->ptr, "filepath")) {
336 RNA_string_get(op->ptr, "filepath", path);
337 ima= BKE_add_image_file(path);
340 RNA_string_get(op->ptr, "name", name);
341 ima= (Image *)find_id("IM", name);
345 BKE_report(op->reports, RPT_ERROR, "Not an Image.");
346 return OPERATOR_CANCELLED;
349 /* turn mesh in editmode */
350 /* BKE_mesh_get/end_editmesh: ED_uvedit_assign_image also calls this */
352 obedit= base->object;
354 if(me->edit_mesh==NULL) {
355 make_editMesh(scene, obedit);
358 if(me->edit_mesh==NULL)
359 return OPERATOR_CANCELLED;
361 ED_uvedit_assign_image(scene, obedit, ima, NULL);
364 load_editMesh(scene, obedit);
365 free_editMesh(me->edit_mesh);
366 MEM_freeN(me->edit_mesh);
370 WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
372 return OPERATOR_FINISHED;
375 void MESH_OT_drop_named_image(wmOperatorType *ot)
378 ot->name= "Assign Image to UV Texture";
379 ot->description= "Assigns Image to active UV layer, or creates a UV layer";
380 ot->idname= "MESH_OT_drop_named_image";
383 ot->poll= layers_poll;
384 ot->invoke= drop_named_image_invoke;
387 ot->flag= OPTYPE_UNDO;
390 RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Image name to assign.");
391 RNA_def_string(ot->srna, "filepath", "Path", FILE_MAX, "Filepath", "Path to image file");
394 static int uv_texture_remove_exec(bContext *C, wmOperator *UNUSED(op))
396 Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
399 if(!ED_mesh_uv_texture_remove(C, ob, me))
400 return OPERATOR_CANCELLED;
402 return OPERATOR_FINISHED;
405 void MESH_OT_uv_texture_remove(wmOperatorType *ot)
408 ot->name= "Remove UV Texture";
409 ot->description= "Remove UV texture layer";
410 ot->idname= "MESH_OT_uv_texture_remove";
413 ot->poll= layers_poll;
414 ot->exec= uv_texture_remove_exec;
417 ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
420 /*********************** vertex color operators ************************/
422 static int vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op))
424 Scene *scene= CTX_data_scene(C);
425 Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
428 if(!ED_mesh_color_add(C, scene, ob, me, NULL, TRUE))
429 return OPERATOR_CANCELLED;
431 return OPERATOR_FINISHED;
434 void MESH_OT_vertex_color_add(wmOperatorType *ot)
437 ot->name= "Add Vertex Color";
438 ot->description= "Add vertex color layer";
439 ot->idname= "MESH_OT_vertex_color_add";
442 ot->poll= layers_poll;
443 ot->exec= vertex_color_add_exec;
446 ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
449 static int vertex_color_remove_exec(bContext *C, wmOperator *UNUSED(op))
451 Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
454 if(!ED_mesh_color_remove(C, ob, me))
455 return OPERATOR_CANCELLED;
457 return OPERATOR_FINISHED;
460 void MESH_OT_vertex_color_remove(wmOperatorType *ot)
463 ot->name= "Remove Vertex Color";
464 ot->description= "Remove vertex color layer";
465 ot->idname= "MESH_OT_vertex_color_remove";
468 ot->exec= vertex_color_remove_exec;
469 ot->poll= layers_poll;
472 ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
475 /*********************** sticky operators ************************/
477 static int sticky_add_exec(bContext *C, wmOperator *UNUSED(op))
479 Scene *scene= CTX_data_scene(C);
480 View3D *v3d= CTX_wm_view3d(C);
481 Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
485 return OPERATOR_CANCELLED;*/
487 RE_make_sticky(scene, v3d);
489 DAG_id_tag_update(&me->id, 0);
490 WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
492 return OPERATOR_FINISHED;
495 void MESH_OT_sticky_add(wmOperatorType *ot)
498 ot->name= "Add Sticky";
499 ot->description= "Add sticky UV texture layer";
500 ot->idname= "MESH_OT_sticky_add";
503 ot->poll= layers_poll;
504 ot->exec= sticky_add_exec;
507 ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
510 static int sticky_remove_exec(bContext *C, wmOperator *UNUSED(op))
512 Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
516 return OPERATOR_CANCELLED;
518 CustomData_free_layer_active(&me->vdata, CD_MSTICKY, me->totvert);
521 DAG_id_tag_update(&me->id, 0);
522 WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
524 return OPERATOR_FINISHED;
527 void MESH_OT_sticky_remove(wmOperatorType *ot)
530 ot->name= "Remove Sticky";
531 ot->description= "Remove sticky UV texture layer";
532 ot->idname= "MESH_OT_sticky_remove";
535 ot->poll= layers_poll;
536 ot->exec= sticky_remove_exec;
539 ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
542 /************************** Add Geometry Layers *************************/
544 static void mesh_calc_edges(Mesh *mesh, int update)
547 EdgeHashIterator *ehi;
548 MFace *mf = mesh->mface;
549 MEdge *med, *med_orig;
550 EdgeHash *eh = BLI_edgehash_new();
551 int i, totedge, totface = mesh->totface;
557 /* assume existing edges are valid
558 * useful when adding more faces and generating edges from them */
560 for(i= 0; i<mesh->totedge; i++, med++)
561 BLI_edgehash_insert(eh, med->v1, med->v2, med);
564 for (i = 0; i < totface; i++, mf++) {
565 if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
566 BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
567 if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
568 BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
571 if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
572 BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
573 if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
574 BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
576 if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
577 BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
581 totedge = BLI_edgehash_size(eh);
583 /* write new edges into a temporary CustomData */
584 memset(&edata, 0, sizeof(edata));
585 CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
587 ehi = BLI_edgehashIterator_new(eh);
588 med = CustomData_get_layer(&edata, CD_MEDGE);
589 for(i = 0; !BLI_edgehashIterator_isDone(ehi);
590 BLI_edgehashIterator_step(ehi), ++i, ++med) {
592 if(update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
593 *med= *med_orig; /* copy from the original */
595 BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
596 med->flag = ME_EDGEDRAW|ME_EDGERENDER|SELECT; /* select for newly created meshes which are selected [#25595] */
599 BLI_edgehashIterator_free(ehi);
601 /* free old CustomData and assign new one */
602 CustomData_free(&mesh->edata, mesh->totedge);
604 mesh->totedge = totedge;
606 mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE);
608 BLI_edgehash_free(eh, NULL);
611 void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges)
613 if(calc_edges || (mesh->totface && mesh->totedge == 0))
614 mesh_calc_edges(mesh, calc_edges);
616 mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL);
618 DAG_id_tag_update(&mesh->id, 0);
619 WM_event_add_notifier(C, NC_GEOM|ND_DATA, mesh);
622 static void mesh_add_verts(Mesh *mesh, int len)
631 totvert= mesh->totvert + len;
632 CustomData_copy(&mesh->vdata, &vdata, CD_MASK_MESH, CD_DEFAULT, totvert);
633 CustomData_copy_data(&mesh->vdata, &vdata, 0, 0, mesh->totvert);
635 if(!CustomData_has_layer(&vdata, CD_MVERT))
636 CustomData_add_layer(&vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
638 CustomData_free(&mesh->vdata, mesh->totvert);
640 mesh_update_customdata_pointers(mesh);
642 /* scan the input list and insert the new vertices */
644 mvert= &mesh->mvert[mesh->totvert];
645 for(i=0; i<len; i++, mvert++)
646 mvert->flag |= SELECT;
648 /* set final vertex list size */
649 mesh->totvert= totvert;
652 void ED_mesh_transform(Mesh *me, float *mat)
655 MVert *mvert= me->mvert;
657 for(i= 0; i < me->totvert; i++, mvert++)
658 mul_m4_v3((float (*)[4])mat, mvert->co);
660 mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
663 static void mesh_add_edges(Mesh *mesh, int len)
672 totedge= mesh->totedge+len;
674 /* update customdata */
675 CustomData_copy(&mesh->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge);
676 CustomData_copy_data(&mesh->edata, &edata, 0, 0, mesh->totedge);
678 if(!CustomData_has_layer(&edata, CD_MEDGE))
679 CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
681 CustomData_free(&mesh->edata, mesh->totedge);
683 mesh_update_customdata_pointers(mesh);
685 /* set default flags */
686 medge= &mesh->medge[mesh->totedge];
687 for(i=0; i<len; i++, medge++)
688 medge->flag= ME_EDGEDRAW|ME_EDGERENDER|SELECT;
690 mesh->totedge= totedge;
693 static void mesh_add_faces(Mesh *mesh, int len)
702 totface= mesh->totface + len; /* new face count */
704 /* update customdata */
705 CustomData_copy(&mesh->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
706 CustomData_copy_data(&mesh->fdata, &fdata, 0, 0, mesh->totface);
708 if(!CustomData_has_layer(&fdata, CD_MFACE))
709 CustomData_add_layer(&fdata, CD_MFACE, CD_CALLOC, NULL, totface);
711 CustomData_free(&mesh->fdata, mesh->totface);
713 mesh_update_customdata_pointers(mesh);
715 /* set default flags */
716 mface= &mesh->mface[mesh->totface];
717 for(i=0; i<len; i++, mface++)
718 mface->flag= ME_FACE_SEL;
720 mesh->totface= totface;
724 void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges, int faces)
726 if(mesh->edit_mesh) {
727 BKE_report(reports, RPT_ERROR, "Can't add geometry in edit mode.");
732 mesh_add_verts(mesh, verts);
734 mesh_add_edges(mesh, edges);
736 mesh_add_faces(mesh, faces);
740 void ED_mesh_faces_add(Mesh *mesh, ReportList *reports, int count)
742 if(mesh->edit_mesh) {
743 BKE_report(reports, RPT_ERROR, "Can't add faces in edit mode.");
747 mesh_add_faces(mesh, count);
750 void ED_mesh_edges_add(Mesh *mesh, ReportList *reports, int count)
752 if(mesh->edit_mesh) {
753 BKE_report(reports, RPT_ERROR, "Can't add edges in edit mode.");
757 mesh_add_edges(mesh, count);
760 void ED_mesh_vertices_add(Mesh *mesh, ReportList *reports, int count)
762 if(mesh->edit_mesh) {
763 BKE_report(reports, RPT_ERROR, "Can't add vertices in edit mode.");
767 mesh_add_verts(mesh, count);
770 void ED_mesh_calc_normals(Mesh *me)
772 mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);