[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44248] branches/bmesh/blender/source/ blender/editors/mesh: sync some changes with trunk and rename bmeshutils.c
Campbell Barton
ideasman42 at gmail.com
Sun Feb 19 18:11:47 CET 2012
Revision: 44248
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44248
Author: campbellbarton
Date: 2012-02-19 17:11:40 +0000 (Sun, 19 Feb 2012)
Log Message:
-----------
sync some changes with trunk and rename bmeshutils.c
Modified Paths:
--------------
branches/bmesh/blender/source/blender/editors/mesh/CMakeLists.txt
branches/bmesh/blender/source/blender/editors/mesh/editmesh_add.c
Added Paths:
-----------
branches/bmesh/blender/source/blender/editors/mesh/bmesh_utils.c
Removed Paths:
-------------
branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
Modified: branches/bmesh/blender/source/blender/editors/mesh/CMakeLists.txt
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/CMakeLists.txt 2012-02-19 16:54:53 UTC (rev 44247)
+++ branches/bmesh/blender/source/blender/editors/mesh/CMakeLists.txt 2012-02-19 17:11:40 UTC (rev 44248)
@@ -43,9 +43,9 @@
mesh_ops.c
editmesh_bvh.c
editmesh_add.c
- bmeshutils.c
bmesh_selecthistory.c
bmesh_select.c
+ bmesh_utils.c
mesh_data.c
bmesh_tools.c
knifetool.c
Copied: branches/bmesh/blender/source/blender/editors/mesh/bmesh_utils.c (from rev 44246, branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c)
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_utils.c (rev 0)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_utils.c 2012-02-19 17:11:40 UTC (rev 44248)
@@ -0,0 +1,1139 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2004 by Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joseph Eagar
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+
+#include "BKE_context.h"
+#include "BKE_library.h"
+#include "BKE_key.h"
+#include "BKE_mesh.h"
+#include "BKE_bmesh.h"
+#include "BKE_report.h"
+#include "BKE_tessmesh.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_mesh.h"
+#include "ED_util.h"
+
+void EDBM_RecalcNormals(BMEditMesh *em)
+{
+ BM_mesh_normals_update(em->bm);
+}
+
+void EDBM_ClearMesh(BMEditMesh *em)
+{
+ /* clear bmesh */
+ BM_mesh_clear(em->bm);
+
+ /* free derived meshes */
+ if (em->derivedCage) {
+ em->derivedCage->needsFree = 1;
+ em->derivedCage->release(em->derivedCage);
+ }
+ if (em->derivedFinal && em->derivedFinal != em->derivedCage) {
+ em->derivedFinal->needsFree = 1;
+ em->derivedFinal->release(em->derivedFinal);
+ }
+
+ em->derivedCage = em->derivedFinal = NULL;
+
+ /* free tesselation data */
+ em->tottri = 0;
+ if (em->looptris)
+ MEM_freeN(em->looptris);
+}
+
+void EDBM_stats_update(BMEditMesh *em)
+{
+ const char iter_types[3] = {BM_VERTS_OF_MESH,
+ BM_EDGES_OF_MESH,
+ BM_FACES_OF_MESH};
+
+ BMIter iter;
+ BMHeader *ele;
+ int *tots[3];
+ int i;
+
+ tots[0] = &em->bm->totvertsel;
+ tots[1] = &em->bm->totedgesel;
+ tots[2] = &em->bm->totfacesel;
+
+ em->bm->totvertsel = em->bm->totedgesel = em->bm->totfacesel = 0;
+
+ for (i = 0; i < 3; i++) {
+ ele = BM_iter_new(&iter, em->bm, iter_types[i], NULL);
+ for ( ; ele; ele = BM_iter_step(&iter)) {
+ if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
+ (*tots[i])++;
+ }
+ }
+ }
+}
+
+int EDBM_InitOpf(BMEditMesh *em, BMOperator *bmop, wmOperator *op, const char *fmt, ...)
+{
+ BMesh *bm = em->bm;
+ va_list list;
+
+ va_start(list, fmt);
+
+ if (!BMO_op_vinitf(bm, bmop, fmt, list)) {
+ BKE_report(op->reports, RPT_ERROR,
+ "Parse error in EDBM_CallOpf");
+ va_end(list);
+ return 0;
+ }
+
+ if (!em->emcopy)
+ em->emcopy = BMEdit_Copy(em);
+ em->emcopyusers++;
+
+ va_end(list);
+
+ return 1;
+}
+
+
+/* returns 0 on error, 1 on success. executes and finishes a bmesh operator */
+int EDBM_FinishOp(BMEditMesh *em, BMOperator *bmop, wmOperator *op, const int report)
+{
+ const char *errmsg;
+
+ BMO_op_finish(em->bm, bmop);
+
+ if (BMO_error_get(em->bm, &errmsg, NULL)) {
+ BMEditMesh *emcopy = em->emcopy;
+
+ if (report) BKE_report(op->reports, RPT_ERROR, errmsg);
+
+ BMEdit_Free(em);
+ *em = *emcopy;
+ BMEdit_RecalcTesselation(em);
+
+ MEM_freeN(emcopy);
+ em->emcopyusers = 0;
+ em->emcopy = NULL;
+ return 0;
+ }
+ else {
+ em->emcopyusers--;
+ if (em->emcopyusers < 0) {
+ printf("warning: em->emcopyusers was less then zero.\n");
+ }
+
+ if (em->emcopyusers <= 0) {
+ BMEdit_Free(em->emcopy);
+ MEM_freeN(em->emcopy);
+ em->emcopy = NULL;
+ }
+ }
+
+ return 1;
+}
+
+int EDBM_CallOpf(BMEditMesh *em, wmOperator *op, const char *fmt, ...)
+{
+ BMesh *bm = em->bm;
+ BMOperator bmop;
+ va_list list;
+
+ va_start(list, fmt);
+
+ if (!BMO_op_vinitf(bm, &bmop, fmt, list)) {
+ BKE_report(op->reports, RPT_ERROR,
+ "Parse error in EDBM_CallOpf");
+ va_end(list);
+ return 0;
+ }
+
+ if (!em->emcopy)
+ em->emcopy = BMEdit_Copy(em);
+ em->emcopyusers++;
+
+ BMO_op_exec(bm, &bmop);
+
+ va_end(list);
+ return EDBM_FinishOp(em, &bmop, op, TRUE);
+}
+
+int EDBM_CallAndSelectOpf(BMEditMesh *em, wmOperator *op, const char *selectslot, const char *fmt, ...)
+{
+ BMesh *bm = em->bm;
+ BMOperator bmop;
+ va_list list;
+
+ va_start(list, fmt);
+
+ if (!BMO_op_vinitf(bm, &bmop, fmt, list)) {
+ BKE_report(op->reports, RPT_ERROR,
+ "Parse error in EDBM_CallOpf");
+ va_end(list);
+ return 0;
+ }
+
+ if (!em->emcopy)
+ em->emcopy = BMEdit_Copy(em);
+ em->emcopyusers++;
+
+ BMO_op_exec(bm, &bmop);
+
+ BM_mesh_elem_flag_disable_all(em->bm, BM_VERT|BM_EDGE|BM_FACE, BM_ELEM_SELECT);
+
+ BMO_slot_buffer_hflag_enable(em->bm, &bmop, selectslot, BM_ELEM_SELECT, BM_ALL);
+
+ va_end(list);
+ return EDBM_FinishOp(em, &bmop, op, TRUE);
+}
+
+int EDBM_CallOpfSilent(BMEditMesh *em, const char *fmt, ...)
+{
+ BMesh *bm = em->bm;
+ BMOperator bmop;
+ va_list list;
+
+ va_start(list, fmt);
+
+ if (!BMO_op_vinitf(bm, &bmop, fmt, list)) {
+ va_end(list);
+ return 0;
+ }
+
+ if (!em->emcopy)
+ em->emcopy = BMEdit_Copy(em);
+ em->emcopyusers++;
+
+ BMO_op_exec(bm, &bmop);
+
+ va_end(list);
+ return EDBM_FinishOp(em, &bmop, NULL, FALSE);
+}
+
+void EDBM_selectmode_to_scene(bContext *C)
+{
+ Scene *scene = CTX_data_scene(C);
+ Object *obedit = CTX_data_edit_object(C);
+ BMEditMesh *em = ((Mesh *)obedit->data)->edit_btmesh;
+
+ if (!em)
+ return;
+
+ scene->toolsettings->selectmode = em->selectmode;
+
+ /* Request redraw of header buttons (to show new select mode) */
+ WM_event_add_notifier(C, NC_SCENE|ND_TOOLSETTINGS, scene);
+}
+
+void EDBM_MakeEditBMesh(ToolSettings *ts, Scene *UNUSED(scene), Object *ob)
+{
+ Mesh *me = ob->data;
+ BMesh *bm;
+
+ if (!me->mpoly && me->totface) {
+ fprintf(stderr, "%s: bmesh conversion issue! may lose lots of geometry! (bmesh internal error)\n", __func__);
+
+ /* BMESH_TODO need to write smarter code here */
+ bm = BKE_mesh_to_bmesh(me, ob);
+ }
+ else {
+ bm = BKE_mesh_to_bmesh(me, ob);
+ }
+
+ if (me->edit_btmesh) {
+ /* this happens when switching shape keys */
+ BMEdit_Free(me->edit_btmesh);
+ MEM_freeN(me->edit_btmesh);
+ }
+
+ /* currently executing operators re-tesselates, so we can avoid doing here
+ * but at some point it may need to be added back. */
+#if 0
+ me->edit_btmesh = BMEdit_Create(bm, TRUE);
+#else
+ me->edit_btmesh = BMEdit_Create(bm, FALSE);
+#endif
+
+ me->edit_btmesh->selectmode = me->edit_btmesh->bm->selectmode = ts->selectmode;
+ me->edit_btmesh->me = me;
+ me->edit_btmesh->ob = ob;
+}
+
+void EDBM_LoadEditBMesh(Scene *scene, Object *ob)
+{
+ Mesh *me = ob->data;
+ BMesh *bm = me->edit_btmesh->bm;
+
+ BMO_op_callf(bm, "object_load_bmesh scene=%p object=%p", scene, ob);
+}
+
+void EDBM_FreeEditBMesh(BMEditMesh *tm)
+{
+ BMEdit_Free(tm);
+}
+
+void EDBM_init_index_arrays(BMEditMesh *tm, int forvert, int foredge, int forface)
+{
+ EDBM_free_index_arrays(tm);
+
+ if (forvert) {
+ BMIter iter;
+ BMVert *ele;
+ int i = 0;
+
+ tm->vert_index = MEM_mallocN(sizeof(void **) * tm->bm->totvert, "tm->vert_index");
+
+ ele = BM_iter_new(&iter, tm->bm, BM_VERTS_OF_MESH, NULL);
+ for ( ; ele; ele = BM_iter_step(&iter)) {
+ tm->vert_index[i++] = ele;
+ }
+ }
+
+ if (foredge) {
+ BMIter iter;
+ BMEdge *ele;
+ int i = 0;
+
+ tm->edge_index = MEM_mallocN(sizeof(void **) * tm->bm->totedge, "tm->edge_index");
+
+ ele = BM_iter_new(&iter, tm->bm, BM_EDGES_OF_MESH, NULL);
+ for ( ; ele; ele = BM_iter_step(&iter)) {
+ tm->edge_index[i++] = ele;
+ }
+ }
+
+ if (forface) {
+ BMIter iter;
+ BMFace *ele;
+ int i = 0;
+
+ tm->face_index = MEM_mallocN(sizeof(void **) * tm->bm->totface, "tm->face_index");
+
+ ele = BM_iter_new(&iter, tm->bm, BM_FACES_OF_MESH, NULL);
+ for ( ; ele; ele = BM_iter_step(&iter)) {
+ tm->face_index[i++] = ele;
+ }
+ }
+}
+
+void EDBM_free_index_arrays(BMEditMesh *tm)
+{
+ if (tm->vert_index) {
+ MEM_freeN(tm->vert_index);
+ tm->vert_index = NULL;
+ }
+
+ if (tm->edge_index) {
+ MEM_freeN(tm->edge_index);
+ tm->edge_index = NULL;
+ }
+
+ if (tm->face_index) {
+ MEM_freeN(tm->face_index);
+ tm->face_index = NULL;
+ }
+}
+
+BMVert *EDBM_get_vert_for_index(BMEditMesh *tm, int index)
+{
+ return tm->vert_index && index < tm->bm->totvert ?tm->vert_index[index]:NULL;
+}
+
+BMEdge *EDBM_get_edge_for_index(BMEditMesh *tm, int index)
+{
+ return tm->edge_index && index < tm->bm->totedge ?tm->edge_index[index]:NULL;
+}
+
+BMFace *EDBM_get_face_for_index(BMEditMesh *tm, int index)
+{
+ return (tm->face_index && index < tm->bm->totface && index >= 0) ? tm->face_index[index] : NULL;
+}
+
+void EDBM_selectmode_flush_ex(BMEditMesh *em, int selectmode)
+{
+ em->bm->selectmode = selectmode;
+ BM_mesh_select_mode_flush(em->bm);
+ em->bm->selectmode = em->selectmode;
+}
+
+void EDBM_selectmode_flush(BMEditMesh *em)
+{
+ EDBM_selectmode_flush_ex(em, em->selectmode);
+}
+
+void EDBM_deselect_flush(BMEditMesh *em)
+{
+ /* function below doesnt use. just do this to keep the values in sync */
+ em->bm->selectmode = em->selectmode;
+ BM_mesh_deselect_flush(em->bm);
+}
+
+
+void EDBM_select_flush(BMEditMesh *em)
+{
+ /* function below doesnt use. just do this to keep the values in sync */
+ em->bm->selectmode = em->selectmode;
+ BM_mesh_select_flush(em->bm);
+}
+
+void EDBM_select_more(BMEditMesh *em)
+{
+ BMOperator bmop;
+ int usefaces = em->selectmode > SCE_SELECT_EDGE;
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list