Commit: cb7d8a4a0f40603c7e98ff70d488edca41c38fef
Author: Lukas Toenne
Date:   Thu Dec 20 13:28:06 2018 +0000
Branches: hair_object
https://developer.blender.org/rBcb7d8a4a0f40603c7e98ff70d488edca41c38fef

Operator for hair edit brush strokes (to be implemented).

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

M       release/scripts/presets/keyconfig/keymap_data/blender_default.py
M       source/blender/editors/hair/CMakeLists.txt
M       source/blender/editors/hair/edithair.c
A       source/blender/editors/hair/edithair_brush.c
M       source/blender/editors/hair/hair_intern.h
M       source/blender/editors/hair/hair_ops.c
M       source/blender/editors/include/ED_hair.h

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

diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py 
b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 2b7622315c8..5c5c3c22206 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -4069,6 +4069,8 @@ def km_hair(params):
          {"properties": [("unselected", False)]}),
         ("hair.hide", {"type": 'H', "value": 'PRESS', "shift": True},
          {"properties": [("unselected", True)]}),
+        ("hair.brush_edit", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+        ("hair.brush_edit", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": 
True}, None),
         *_template_items_proportional_editing(connected=False),
     ])
 
diff --git a/source/blender/editors/hair/CMakeLists.txt 
b/source/blender/editors/hair/CMakeLists.txt
index 4f74c24734c..3d309cd2508 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_brush.c
        edithair_select.c
        edithair_test.c
 
diff --git a/source/blender/editors/hair/edithair.c 
b/source/blender/editors/hair/edithair.c
index 5989143d2ec..8831c03e3be 100644
--- a/source/blender/editors/hair/edithair.c
+++ b/source/blender/editors/hair/edithair.c
@@ -56,6 +56,7 @@
 #include "ED_screen.h"
 #include "ED_types.h"
 #include "ED_util.h"
+#include "ED_view3d.h"
 
 #include "hair_intern.h"
 
@@ -99,8 +100,45 @@ void ED_hair_edithair_free(Object *ob)
        }
 }
 
-int ED_hair_object_poll(bContext *C)
+bool ED_hair_poll_object(bContext *C)
 {
        Object *ob = ED_object_context(C);
        return ob && ob->type == OB_HAIR;
 }
+
+
+bool ED_hair_poll_editmode(bContext *C)
+{
+       Object *ob = ED_object_context(C);
+       return ob && ob->type == OB_HAIR && (ob->mode & OB_MODE_EDIT);
+}
+
+bool ED_hair_poll_view3d(bContext *C)
+{
+       if (!ED_hair_poll_editmode) {
+               return false;
+       }
+
+       ScrArea *sa = CTX_wm_area(C);
+       ARegion *ar = CTX_wm_region(C);
+       return (sa && sa->spacetype == SPACE_VIEW3D) &&
+              (ar && ar->regiontype == RGN_TYPE_WINDOW);
+}
+
+void ED_hair_init_view3d(bContext *C, ViewContext *vc)
+{
+       ED_view3d_viewcontext_init(C, vc);
+
+       if (V3D_IS_ZBUF(vc->v3d)) {
+               if (vc->v3d->flag & V3D_INVALID_BACKBUF) {
+                       /* needed or else the draw matrix can be incorrect */
+                       view3d_operator_needs_opengl(C);
+
+                       ED_view3d_backbuf_validate(vc);
+                       /* we may need to force an update here by setting the 
rv3d as dirty
+                        * for now it seems ok, but take care!:
+                        * rv3d->depths->dirty = 1; */
+                       ED_view3d_depth_update(vc->ar);
+               }
+       }
+}
diff --git a/source/blender/editors/hair/edithair_brush.c 
b/source/blender/editors/hair/edithair_brush.c
new file mode 100644
index 00000000000..15cab0b6198
--- /dev/null
+++ b/source/blender/editors/hair/edithair_brush.c
@@ -0,0 +1,454 @@
+/*
+ * ***** 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_brush.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_customdata.h"
+#include "BKE_hair.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 */
+
+// typedef struct HairOperator {
+// } HairOperator;
+
+/************************* Brush edit operator ********************/
+
+typedef struct BrushEdit {
+       Scene *scene;
+       ViewLayer *view_layer;
+       Object *ob;
+       EditHair *edit;
+
+       bool first;
+       float lastmouse[2];
+       float zfac;
+
+       ViewContext vc;
+} BrushEdit;
+
+static bool brush_edit_init(bContext *C, wmOperator *op)
+{
+       Scene *scene = CTX_data_scene(C);
+       ViewLayer *view_layer = CTX_data_view_layer(C);
+       ARegion *ar = CTX_wm_region(C);
+       const HairEditSettings *hset = &scene->toolsettings->hair_edit;
+       Object *ob = CTX_data_active_object(C);
+       HairSystem *hsys = ob->data;
+       EditHair *edit = hsys->edithair;
+       
+       if (hset->brushtype < 0)
+               return false;
+
+       BrushEdit *bedit;
+       bedit = MEM_callocN(sizeof(BrushEdit), "BrushEdit");
+       op->customdata = bedit;
+
+       bedit->scene = scene;
+       bedit->view_layer = view_layer;
+       bedit->ob = ob;
+       bedit->edit = edit;
+       bedit->first = true;
+
+       /* set the 'distance factor' for grabbing (used in comb etc) */
+       float min[3], max[3];
+       INIT_MINMAX(min, max);
+       // TODO implement selection mechanism for affected hair points/scalp 
area
+       BKE_hair_minmax(hsys, min, max);
+       mid_v3_v3v3(min, min, max);
+       bedit->zfac = ED_view3d_calc_zfac(ar->regiondata, min, NULL);
+
+       ED_hair_init_view3d(C, &bedit->vc);
+
+       return true;
+}
+
+static void brush_edit_exit(wmOperator *op)
+{
+       BrushEdit *bedit = op->customdata;
+
+       MEM_freeN(bedit);
+}
+
+static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
+{
+       Depsgraph *depsgraph = CTX_data_depsgraph(C);
+       BrushEdit *bedit = op->customdata;
+
+       float mouse[2];
+       RNA_float_get_array(itemptr, "mouse", mouse);
+       bool flip = RNA_boolean_get(itemptr, "pen_flip");
+
+       if (bedit->first) {
+               bedit->lastmouse[0] = mouse[0];
+               bedit->lastmouse[1] = mouse[1];
+       }
+
+#if 0
+       BrushEdit *bedit = op->customdata;
+       Depsgraph *depsgraph = CTX_data_depsgraph(C);
+       Scene *scene = bedit->scene;
+       Object *ob = bedit->ob;
+       PTCacheEdit *edit = bedit->edit;
+       ParticleEditSettings *pset = PE_settings(scene);
+       ParticleSystemModifierData *psmd_eval = edit->psmd_eval;
+       ParticleBrushData *brush = &pset->brush[pset->brushtype];
+       ARegion *ar = CTX_wm_region(C);
+       float vec[3], mousef[2];
+       int mval[2];
+       int flip, mouse[2], removed = 0, added = 0, selected = 0, tot_steps = 
1, step = 1;
+       float dx, dy, dmax;
+       int lock_root = pset->flag & PE_LOCK_FIRST;
+
+       if (!PE_start_edit(edit))
+               return;
+
+       RNA_float_get_array(itemptr, "mouse", mousef);
+       mouse[0] = mousef[0];
+       mouse[1] = mousef[1];
+       flip = RNA_boolean_get(itemptr, "pen_flip");
+
+       if (bedit->first) {
+               bedit->lastmouse[0] = mouse[0];
+               bedit->lastmouse[1] = mouse[1];
+       }
+
+       dx = mouse[0] - bedit->lastmouse[0];
+       dy = mouse[1] - bedit->lastmouse[1];
+
+       mval[0] = mouse[0];
+       mval[1] = mouse[1];
+
+
+       /* disable locking temporatily for disconnected hair */
+       if (edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR)
+               pset->flag &= ~PE_LOCK_FIRST;
+
+       if (((pset->brushtype == PE_BRUSH_ADD) ?
+            (sqrtf(dx * dx + dy * dy) > pset->brush[PE_BRUSH_ADD].step) : (dx 
!= 0 || dy != 0)) || bedit->first)
+       {
+               PEData data = bedit->data;
+               data.context = C; // TODO(mai): why isnt this set in 
bedit->data?
+
+               view3d_operator_needs_opengl(C);
+               selected = (short)count_selected_keys(scene, edit);
+
+               dmax = max_ff(fabsf(dx), fabsf(dy));
+               tot_steps = dmax / (0.2f * pe_brush_size_get(scene, brush)) + 1;
+
+               dx /= (float)tot_steps;
+               dy /= (float)tot_steps;
+
+               for (step = 1; step <= tot_steps; step++) {
+                       mval[0] = bedit->lastmouse[0] + step * dx;
+                       mval[1] = bedit->lastmouse[1] + step * dy;
+
+                       switch (pset->brushtype) {
+                               case PE_BRUSH_COMB:
+                               {
+                                       const float mval_f[2] = {dx, dy};
+                                       data.mval = mval;
+                                       data.rad = pe_brush_size_get(scene, 
brush);
+
+                                       data.combfac = (brush->strength - 0.5f) 
* 2.0f;
+                                       if (data.combfac < 0.0f)
+                                               data.combfac = 1.0f - 9.0f * 
data.combfac;
+                                       else
+                                               data.combfac = 1.0f - 
data.combfac;
+
+                                       invert_m4_m4(ob->imat, ob->obmat);
+
+                                       ED_view3d_win_to_delta(ar, mval_f, vec, 
bedit->zfac);
+                                       data.dvec = vec;
+
+                                       foreach_mouse_hit_key(&data, 
brush_comb, selected);
+                                       break;
+                               }
+                               case PE_BRUSH_CUT:
+                               {
+                                       if (edit->psys && edit->pathcache) {
+                                               data.mval = mval;
+                                               data.rad = 
pe_brush_size_get(scene, brush);
+                                               data.cutfac = brush->strength;
+
+                                               if (selected)
+                                                       
foreach_selected_point(&data, brush_cut);
+                                               else
+                                                       foreach_point(&data, 
brush_cut);
+
+                                               removed = 
remove_tagged_particles(ob, edit->psys, pe_x_mirror(ob));
+                                               if (pset->flag & 
PE_KEEP_LENGTHS)
+                                                       recalc_lengths(edit);
+                                       }
+                                       else
+                                               removed = 0;
+
+                                       break;
+                               }
+                               case PE_BRUSH_LENGTH:
+                               {
+                                       data.mval = mval;
+
+                                       data.rad = pe_brush_size_get(scene, 
brush);
+                                       data.growfac = brush->strength / 50.0f;
+
+                                       if (brush->invert ^ flip)
+                                               data.growfac = 1.0f - 
data.growfac;
+                                       else
+                                               data.growfac = 1.0f + 
data.growfac;
+
+                                       foreach_mouse_hit_point(&data, 
brush_length, selected);
+
+                                       if (pset->flag & PE_KEEP_LENGTHS)
+                                               recalc_lengths(edit);
+                                       break;
+                               }
+                               case PE_BRUSH_PUFF:
+                               {
+                                       if (edit->psys) {
+                                               data.mesh = 
psmd_eval->mesh_final;
+                                               data.mval = mval;
+                                               data.rad = 
pe_brush_size_get(scene, brush);
+                                               data.select = selected;
+
+                                               data.pufffac = (brush->strength 
- 0.5f) * 2.0f;
+                                               if (data.pufffac < 0.0f)
+                                                       data.pufffac = 1.0f - 
9.0f * data.pufffac;
+                                               else
+                                                       data.pufffac = 1.0f - 
data.pufffac;
+
+                                               data.invert = (brush->invert ^ 
flip);
+                                               invert_m4_m4(ob->imat, ob->

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to