[Bf-blender-cvs] [9c4477c] temp_facegroups: Copy BKE_facemap stuff from wiggly-widgets branch

Julian Eisel noreply at git.blender.org
Wed May 18 23:59:58 CEST 2016


Commit: 9c4477c9536b42f71571e32701b040dc99ac69b8
Author: Julian Eisel
Date:   Wed May 18 23:51:23 2016 +0200
Branches: temp_facegroups
https://developer.blender.org/rB9c4477c9536b42f71571e32701b040dc99ac69b8

Copy BKE_facemap stuff from wiggly-widgets branch

Idea is to split face maps of from wiggly-widgets into this branch to prepare review/merge.
Used term "facegroup" for file names since I plan to rename "face maps" to "face groups" anyway.

===================================================================

A	source/blender/blenkernel/BKE_facegroup.h
M	source/blender/blenkernel/CMakeLists.txt
A	source/blender/blenkernel/intern/facegroup.c
M	source/blender/makesdna/DNA_customdata_types.h
M	source/blender/makesdna/DNA_object_types.h

===================================================================

diff --git a/source/blender/blenkernel/BKE_facegroup.h b/source/blender/blenkernel/BKE_facegroup.h
new file mode 100644
index 0000000..7bbb60a
--- /dev/null
+++ b/source/blender/blenkernel/BKE_facegroup.h
@@ -0,0 +1,60 @@
+/*
+ * ***** 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) 2014 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BKE_facegroup
+ *  \ingroup bke
+ *
+ * \brief Functions for dealing with objects and facemaps.
+ */
+
+
+#ifndef __BKE_FACEGROUP_H__
+#define __BKE_FACEGROUP_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct bFaceMap;
+struct ListBase;
+struct Object;
+
+/* Face map operations */
+struct bFaceMap *BKE_object_facemap_add(struct Object *ob);
+struct bFaceMap *BKE_object_facemap_add_name(struct Object *ob, const char *name);
+void BKE_object_facemap_remove(struct Object *ob, struct bFaceMap *fmap);
+void BKE_object_fmap_remove_all(struct Object *ob);
+
+int fmap_name_index(struct Object *ob, const char *name);
+void fmap_unique_name(struct bFaceMap *fmap, struct Object *ob);
+struct bFaceMap *fmap_find_name(struct Object *ob, const char *name);
+void fmap_copy_list(struct ListBase *outbase, struct ListBase *inbase);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* __BKE_FACEGROUP_H__ */
+
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index afab0cc..1a7b04a 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -104,6 +104,7 @@ set(SRC
 	intern/editmesh.c
 	intern/editmesh_bvh.c
 	intern/effect.c
+	intern/facegroup.c
 	intern/fcurve.c
 	intern/fluidsim.c
 	intern/fmodifier.c
@@ -228,6 +229,7 @@ set(SRC
 	BKE_editmesh.h
 	BKE_editmesh_bvh.h
 	BKE_effect.h
+	BKE_facegroup.h
 	BKE_fcurve.h
 	BKE_fluidsim.h
 	BKE_font.h
diff --git a/source/blender/blenkernel/intern/facegroup.c b/source/blender/blenkernel/intern/facegroup.c
new file mode 100644
index 0000000..eaecdc4
--- /dev/null
+++ b/source/blender/blenkernel/intern/facegroup.c
@@ -0,0 +1,260 @@
+/*
+ * ***** 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) 2014 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/facegroup.c
+ *  \ingroup bke
+ */
+
+#include <string.h>
+
+#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
+
+#include "WM_types.h"
+#include "WM_api.h"
+
+#include "BKE_context.h"
+#include "BKE_customdata.h"
+#include "BKE_facegroup.h"
+#include "BKE_editmesh.h"
+#include "BKE_object.h"
+#include "BKE_object_deform.h"
+
+#include "BKE_depsgraph.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_path_util.h"
+#include "BLI_string.h"
+#include "BLI_listbase.h"
+
+#include "BLT_translation.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "RNA_define.h"
+#include "RNA_access.h"
+
+
+static bool fmap_unique_check(void *arg, const char *name)
+{
+	struct {Object *ob; void *fm; } *data = arg;
+
+	bFaceMap *fmap;
+
+	for (fmap = data->ob->fmaps.first; fmap; fmap = fmap->next) {
+		if (data->fm != fmap) {
+			if (!strcmp(fmap->name, name)) {
+				return true;
+			}
+		}
+	}
+
+	return false;
+}
+
+static bFaceMap *fmap_duplicate(bFaceMap *infmap)
+{
+	bFaceMap *outfmap;
+
+	if (!infmap)
+		return NULL;
+
+	outfmap = MEM_callocN(sizeof(bFaceMap), "copy facemap");
+
+	/* For now, just copy everything over. */
+	memcpy(outfmap, infmap, sizeof(bFaceMap));
+
+	outfmap->next = outfmap->prev = NULL;
+
+	return outfmap;
+}
+
+void fmap_copy_list(ListBase *outbase, ListBase *inbase)
+{
+	bFaceMap *fmap, *fmapn;
+
+	BLI_listbase_clear(outbase);
+
+	for (fmap = inbase->first; fmap; fmap = fmap->next) {
+		fmapn = fmap_duplicate(fmap);
+		BLI_addtail(outbase, fmapn);
+	}
+}
+
+void fmap_unique_name(bFaceMap *fmap, Object *ob)
+{
+	struct {Object *ob; void *fmap; } data;
+	data.ob = ob;
+	data.fmap = fmap;
+
+	BLI_uniquename_cb(fmap_unique_check, &data, DATA_("Group"), '.', fmap->name, sizeof(fmap->name));
+}
+
+bFaceMap *BKE_object_facemap_add_name(Object *ob, const char *name)
+{
+	bFaceMap *fmap;
+
+	if (!ob || ob->type != OB_MESH)
+		return NULL;
+
+	fmap = MEM_callocN(sizeof(bFaceMap), __func__);
+
+	BLI_strncpy(fmap->name, name, sizeof(fmap->name));
+
+	BLI_addtail(&ob->fmaps, fmap);
+
+	ob->actfmap = BLI_listbase_count(&ob->fmaps);
+
+	fmap_unique_name(fmap, ob);
+
+	return fmap;
+}
+
+bFaceMap *BKE_object_facemap_add(Object *ob)
+{
+	return BKE_object_facemap_add_name(ob, DATA_("FaceMap"));
+}
+
+
+static void object_fmap_remove_edit_mode(Object *ob, bFaceMap *fmap, bool do_selected, bool purge)
+{
+	const int fmap_nr = BLI_findindex(&ob->fmaps, fmap);
+
+	if (ob->type == OB_MESH) {
+		Mesh *me = ob->data;
+
+		if (me->edit_btmesh) {
+			BMEditMesh *em = me->edit_btmesh;
+			const int cd_fmap_offset = CustomData_get_offset(&em->bm->pdata, CD_FACEMAP);
+
+			if (cd_fmap_offset != -1) {
+				BMFace *efa;
+				BMIter iter;
+				int *map;
+
+				if (purge) {
+					BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+						map = BM_ELEM_CD_GET_VOID_P(efa, cd_fmap_offset);
+
+						if (map) {
+							if (*map == fmap_nr)
+								*map = -1;
+							else if (*map > fmap_nr)
+								*map -= 1;
+						}
+					}
+				}
+				else {
+					BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+						map = BM_ELEM_CD_GET_VOID_P(efa, cd_fmap_offset);
+
+						if (map && *map == fmap_nr && (!do_selected || BM_elem_flag_test(efa, BM_ELEM_SELECT))) {
+							*map = -1;
+						}
+					}
+				}
+			}
+
+			if (ob->actfmap == BLI_listbase_count(&ob->fmaps))
+				ob->actfmap--;
+
+			BLI_remlink(&ob->fmaps, fmap);
+			MEM_freeN(fmap);
+		}
+	}
+}
+
+static void object_fmap_remove_object_mode(Object *ob, bFaceMap *fmap, bool purge)
+{
+	const int fmap_nr = BLI_findindex(&ob->fmaps, fmap);
+
+	if (ob->type == OB_MESH) {
+		Mesh *me = ob->data;
+
+		if (CustomData_has_layer(&me->pdata, CD_FACEMAP)) {
+			int *map = CustomData_get_layer(&me->pdata, CD_FACEMAP);
+			int i;
+
+			if (map) {
+				for (i = 0; i < me->totpoly; i++) {
+					if (map[i] == fmap_nr)
+						map[i] = -1;
+					else if (purge && map[i] > fmap_nr)
+						map[i]--;
+				}
+			}
+		}
+
+		if (ob->actfmap == BLI_listbase_count(&ob->fmaps))
+			ob->actfmap--;
+
+		BLI_remlink(&ob->fmaps, fmap);
+		MEM_freeN(fmap);
+	}
+}
+
+static void fmap_remove_exec(Object *ob, bFaceMap *fmap, const bool is_edit_mode, const bool purge)
+{
+	if (is_edit_mode)
+		object_fmap_remove_edit_mode(ob, fmap, false, purge);
+	else
+		object_fmap_remove_object_mode(ob, fmap, purge);
+}
+
+void BKE_object_facemap_remove(Object *ob, bFaceMap *fmap)
+{
+	fmap_remove_exec(ob, fmap, BKE_object_is_in_editmode(ob), true);
+}
+
+void BKE_object_fmap_remove_all(Object *ob)
+{
+	bFaceMap *fmap = (bFaceMap *)ob->fmaps.first;
+
+	if (fmap) {
+		const bool edit_mode = BKE_object_is_in_editmode_vgroup(ob);
+
+		while (fmap) {
+			bFaceMap *next_fmap = fmap->next;
+			fmap_remove_exec(ob, fmap, edit_mode, false);
+			fmap = next_fmap;
+		}
+	}
+	/* remove all dverts */
+	if (ob->type == OB_MESH) {
+		Mesh *me = ob->data;
+		CustomData_free_layer(&me->pdata, CD_FACEMAP, me->totpoly, 0);
+	}
+	ob->actfmap = 0;
+}
+
+int fmap_name_index(Object *ob, const char *name)
+{
+	return (name) ? BLI_findstringindex(&ob->fmaps, name, offsetof(bFaceMap, name)) : -1;
+}
+
+bFaceMap *fmap_find_name(Object *ob, const char *name)
+{
+	return BLI_findstring(&ob->fmaps, name, offsetof(bFaceMap, name));
+}
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index 3807bb2..5be7fa4 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -63,10 +63,9 @@ typedef struct CustomDataExternal {
  * layers, each with a data type (e.g. MTFace, MDeformVert, etc.). */
 typedef struct CustomData {
 	CustomDataLayer *layers;      /* CustomDataLayers, ordered by type */
-	int typemap[42];              /* runtime only! - maps types to indices of first layer of that type,
+	int typemap[43];              /* runtime only! - maps types to indices of first layer of that type,
 	                               * MUST be >= CD_NUMTYPES, but we cant use a define here.
 	                               * Correct size is ensured in CustomData_update_typemap assert() */
-	int pad_i1;
 	int totlayer, maxlayer;       /* number of layers, size of layers array */
 	int totsize;                  /* in editmode, total size of all data layers */
 	struct BLI_mempool *pool;     /* (BMesh Only): Memory pool for allocation of blocks */
@@ -123,8 +122,9 @@ typedef enum CustomDataType {
 	CD_MLOOPTANG

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list