Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaia Clary <gaia.clary@machinimatrix.org>2013-06-15 13:42:58 +0400
committerGaia Clary <gaia.clary@machinimatrix.org>2013-06-15 13:42:58 +0400
commita8beff3c5efc665ab14e3ca7af785499c33d3a86 (patch)
tree55b7938641dc55ee9b652bdce3602b9a6ef06098 /source/blender/blenkernel/intern/mesh.c
parentd4cbd78a793a7f724c5a8932b52a76a722fc8772 (diff)
added basic utility functions for working with mselect (selected mesh elements)
Diffstat (limited to 'source/blender/blenkernel/intern/mesh.c')
-rw-r--r--source/blender/blenkernel/intern/mesh.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 3bb2d6fdba4..0ef92ca75a3 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -3767,3 +3767,130 @@ void BKE_mesh_do_versions_cd_flag_init(Mesh *mesh)
}
}
+
+
+/* -------------------------------------------------------------------- */
+/* MSelect functions (currently used in weight paint mode) */
+
+void BKE_mesh_mselect_clear(Mesh *me)
+{
+ MEM_freeN(me->mselect);
+ me->mselect = NULL;
+ me->totselect = 0;
+}
+
+void BKE_mesh_mselect_validate(Mesh *me)
+{
+ MSelect *mselect_src, *mselect_dst;
+ int i_src, i_dst;
+
+ if (me->totselect == 0)
+ return;
+
+ mselect_src = me->mselect;
+ mselect_dst = MEM_mallocN(sizeof(MSelect) * (me->totselect), "Mesh selection history");
+
+ for (i_src = 0, i_dst = 0; i_src < me->totselect; i_src++) {
+ int index = mselect_src[i_src].index;
+ switch (mselect_src[i_src].type) {
+ case ME_VSEL:
+ {
+ if (me->mvert[index].flag & SELECT) {
+ mselect_dst[i_dst] = mselect_src[i_src];
+ i_dst++;
+ }
+ break;
+ }
+ case ME_ESEL:
+ {
+ if (me->medge[index].flag & SELECT) {
+ mselect_dst[i_dst] = mselect_src[i_src];
+ i_dst++;
+ }
+ break;
+ }
+ case ME_FSEL:
+ {
+ if (me->mpoly[index].flag & SELECT) {
+ mselect_dst[i_dst] = mselect_src[i_src];
+ i_dst++;
+ }
+ break;
+ }
+ default:
+ {
+ BLI_assert(0);
+ break;
+ }
+ }
+ }
+
+ MEM_freeN(mselect_src);
+
+ if (i_dst == 0) {
+ MEM_freeN(mselect_dst);
+ mselect_dst = NULL;
+ }
+ else if (i_dst != me->totselect) {
+ mselect_dst = MEM_reallocN(mselect_dst, sizeof(MSelect) * i_dst);
+ }
+
+ me->totselect = i_dst;
+ me->mselect = mselect_dst;
+
+}
+
+/**
+ * Return the index within me->mselect, or -1
+ */
+int BKE_mesh_mselect_find(Mesh *me, int index, int type)
+{
+ int i;
+
+ BLI_assert(ELEM3(type, ME_VSEL, ME_ESEL, ME_FSEL));
+
+ for (i = 0; i < me->totselect; i++) {
+ if ((me->mselect[i].index == index) &&
+ (me->mselect[i].type == type))
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+/**
+ * Return The index of the active element.
+ */
+int BKE_mesh_mselect_active_get(Mesh *me, int type)
+{
+ BLI_assert(ELEM3(type, ME_VSEL, ME_ESEL, ME_FSEL));
+
+ if (me->totselect) {
+ if (me->mselect[me->totselect - 1].type == type) {
+ return me->mselect[me->totselect - 1].index;
+ }
+ }
+ return -1;
+}
+
+void BKE_mesh_mselect_active_set(Mesh *me, int index, int type)
+{
+ const int msel_index = BKE_mesh_mselect_find(me, index, type);
+
+ if (msel_index == -1) {
+ /* add to the end */
+ me->mselect = MEM_reallocN(me->mselect, sizeof(MSelect) * (me->totselect + 1));
+ me->mselect[me->totselect].index = index;
+ me->mselect[me->totselect].type = type;
+ me->totselect++;
+ }
+ else if (msel_index != me->totselect - 1) {
+ /* move to the end */
+ SWAP(MSelect, me->mselect[msel_index], me->mselect[me->totselect - 1]);
+ }
+
+ BLI_assert((me->mselect[me->totselect - 1].index == index) &&
+ (me->mselect[me->totselect - 1].type == type));
+}