Commit: f3e455a0f89df914b95e5ee43b3c7cfd9b37a755
Author: Lukas Tönne
Date:   Sun Sep 23 14:04:20 2018 +0100
Branches: hair_object
https://developer.blender.org/rBf3e455a0f89df914b95e5ee43b3c7cfd9b37a755

Follicle selection flag and "select all" operator.

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

M       source/blender/draw/intern/draw_cache_impl_hair.c
M       source/blender/editors/hair/CMakeLists.txt
A       source/blender/editors/hair/edithair_select.c
M       source/blender/editors/hair/hair_intern.h
M       source/blender/editors/hair/hair_ops.c
M       source/blender/makesdna/DNA_hair_types.h

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

diff --git a/source/blender/draw/intern/draw_cache_impl_hair.c 
b/source/blender/draw/intern/draw_cache_impl_hair.c
index 2673cc354f5..97c2b7b3f2a 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -768,7 +768,7 @@ static void hair_batch_cache_ensure_edit_follicle_pos(
        if (format.attr_len == 0) {
                /* initialize vertex format */
                pos_id = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 
3, GPU_FETCH_FLOAT);
-               data_id = GPU_vertformat_attr_add(&format, "data", GPU_COMP_U8, 
1, GPU_FETCH_INT);
+               data_id = GPU_vertformat_attr_add(&format, "data", 
GPU_COMP_U32, 1, GPU_FETCH_INT);
        }
 
        cache->edit_follicle_pos = GPU_vertbuf_create_with_format(&format);
@@ -783,8 +783,7 @@ static void hair_batch_cache_ensure_edit_follicle_pos(
 
                GPU_vertbuf_attr_set(cache->edit_follicle_pos, pos_id, 
point_index, loc);
 
-               unsigned char flag = 0;
-               GPU_vertbuf_attr_set(cache->edit_follicle_pos, data_id, 
point_index, &flag);
+               GPU_vertbuf_attr_set(cache->edit_follicle_pos, data_id, 
point_index, &follicle->flag);
        }
 }
 
diff --git a/source/blender/editors/hair/CMakeLists.txt 
b/source/blender/editors/hair/CMakeLists.txt
index 1477f1fb221..4f74c24734c 100644
--- a/source/blender/editors/hair/CMakeLists.txt
+++ b/source/blender/editors/hair/CMakeLists.txt
@@ -36,6 +36,7 @@ set(INC_SYS
 set(SRC
        hair_ops.c
        edithair.c
+       edithair_select.c
        edithair_test.c
 
        hair_intern.h
diff --git a/source/blender/editors/hair/edithair_select.c 
b/source/blender/editors/hair/edithair_select.c
new file mode 100644
index 00000000000..c9d30caaf58
--- /dev/null
+++ b/source/blender/editors/hair/edithair_select.c
@@ -0,0 +1,168 @@
+/*
+ * ***** 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) Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/hair/edithair_test.c
+ *  \ingroup edhair
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+
+#include "DNA_hair_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_context.h"
+#include "BKE_hair.h"
+#include "BKE_hair_iterators.h"
+#include "BKE_mesh_sample.h"
+
+#include "DEG_depsgraph.h"
+
+#include "ED_hair.h"
+#include "ED_screen.h"
+#include "ED_view3d.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_resources.h"
+
+#include "BLT_translation.h"
+
+#include "hair_intern.h"  /* own include */
+
+/************************ de select all operator ************************/
+
+static bool hair_has_selected_follicles(EditHair *edit)
+{
+       const HairFollicle *follicle;
+       HairIterator iter;
+       BKE_HAIR_ITER_FOLLICLES(follicle, &iter, edit->pattern) {
+               if (follicle->flag & HAIR_FOLLICLE_SELECT) {
+                       return true;
+               }
+       }
+       return false;
+}
+
+static void hair_follicle_select_action_apply(HairFollicle *follicle, int 
action)
+{
+       switch (action) {
+               case SEL_SELECT:
+                       if (!(follicle->flag & HAIR_FOLLICLE_SELECT)) {
+                               follicle->flag |= HAIR_FOLLICLE_SELECT;
+                       }
+                       break;
+               case SEL_DESELECT:
+                       if (follicle->flag & HAIR_FOLLICLE_SELECT) {
+                               follicle->flag &= ~HAIR_FOLLICLE_SELECT;
+                       }
+                       break;
+               case SEL_INVERT:
+                       if (!(follicle->flag & HAIR_FOLLICLE_SELECT)) {
+                               follicle->flag |= HAIR_FOLLICLE_SELECT;
+                       }
+                       else {
+                               follicle->flag &= ~HAIR_FOLLICLE_SELECT;
+                       }
+                       break;
+       }
+}
+
+static int hair_select_all_exec(bContext *C, wmOperator *op)
+{
+       const ToolSettings *settings = CTX_data_tool_settings(C);
+       Object *obedit = CTX_data_edit_object(C);;
+       HairSystem *hsys = obedit->data;
+       EditHair *edit = hsys->edithair;
+       int action = RNA_enum_get(op->ptr, "action");
+
+       if (action == SEL_TOGGLE) {
+               switch (settings->hair_edit_settings.select_mode) {
+                       case HAIR_SELECT_FOLLICLES: {
+                               action = hair_has_selected_follicles(edit) ? 
SEL_DESELECT : SEL_SELECT;
+                               break;
+                       }
+                       case HAIR_SELECT_VERTICES: {
+                               BLI_assert(false);
+                               break;
+                       }
+                       case HAIR_SELECT_TIPS: {
+                               BLI_assert(false);
+                               break;
+                       }
+               }
+       }
+
+       switch (settings->hair_edit_settings.select_mode) {
+               case HAIR_SELECT_FOLLICLES: {
+                       HairFollicle *follicle;
+                       HairIterator iter;
+                       BKE_HAIR_ITER_FOLLICLES(follicle, &iter, edit->pattern) 
{
+                               hair_follicle_select_action_apply(follicle, 
action);
+                       }
+                       break;
+               }
+               case HAIR_SELECT_VERTICES: {
+                       BLI_assert(false);
+                       break;
+               }
+               case HAIR_SELECT_TIPS: {
+                       BLI_assert(false);
+                       break;
+               }
+       }
+
+       BKE_hair_batch_cache_dirty(hsys, BKE_HAIR_BATCH_DIRTY_SELECT);
+       DEG_id_tag_update(&obedit->id, DEG_TAG_SELECT_UPDATE);
+       WM_event_add_notifier(C, NC_OBJECT|ND_DATA|NA_SELECTED, obedit);
+
+       return OPERATOR_FINISHED;
+}
+
+void HAIR_OT_select_all(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "(De)select All";
+       ot->idname = "HAIR_OT_select_all";
+       ot->description = "(De)select all hair points";
+
+       /* api callbacks */
+       ot->exec = hair_select_all_exec;
+       ot->poll = ED_operator_edithair;
+
+       /* flags */
+       ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+
+       WM_operator_properties_select_all(ot);
+}
diff --git a/source/blender/editors/hair/hair_intern.h 
b/source/blender/editors/hair/hair_intern.h
index 39f475f29eb..7fdc59a72f3 100644
--- a/source/blender/editors/hair/hair_intern.h
+++ b/source/blender/editors/hair/hair_intern.h
@@ -35,6 +35,8 @@
 
 struct wmOperatorType;
 
+void HAIR_OT_select_all(struct wmOperatorType *ot);
+
 void HAIR_OT_add_test_hair(struct wmOperatorType *ot);
 
 #endif /* __HAIR_INTERN_H__ */
diff --git a/source/blender/editors/hair/hair_ops.c 
b/source/blender/editors/hair/hair_ops.c
index ca4cfb26caf..65b6241055b 100644
--- a/source/blender/editors/hair/hair_ops.c
+++ b/source/blender/editors/hair/hair_ops.c
@@ -52,6 +52,8 @@
 
 void ED_operatortypes_hair(void)
 {
+       WM_operatortype_append(HAIR_OT_select_all);
+
        WM_operatortype_append(HAIR_OT_add_test_hair);
 }
 
diff --git a/source/blender/makesdna/DNA_hair_types.h 
b/source/blender/makesdna/DNA_hair_types.h
index 096d532ca31..e863deb9a2e 100644
--- a/source/blender/makesdna/DNA_hair_types.h
+++ b/source/blender/makesdna/DNA_hair_types.h
@@ -37,11 +37,16 @@
 extern "C" {
 #endif
 
+typedef enum HairFollicleFlag
+{
+       HAIR_FOLLICLE_SELECT            = (1 << 0),
+} HairFollicleFlag;
+
 /* Root point (follicle) of a hair on a surface */
 typedef struct HairFollicle {
-       MeshSample mesh_sample;     /* Sample on the scalp mesh for the root 
vertex */
+       int flag;
        unsigned int curve;         /* Index of the curve used by the fiber */
-       int pad;
+       MeshSample mesh_sample;     /* Sample on the scalp mesh for the root 
vertex */
 } HairFollicle;
 
 /* Collection of hair roots on a surface */

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to