diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2014-12-03 18:35:50 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2015-04-20 13:23:13 +0300 |
commit | 687b5a1ec0e21db807eb45f860f65eb52ffa92af (patch) | |
tree | ab650222ffc65af8865b2cf9533c98c1d5befc96 /source/blender/editors/hair | |
parent | 59efe23830dd84b1d56e83325eb9f25b7df0112b (diff) |
Implemented basic cursor drawing for hair edit mode brushes.
Diffstat (limited to 'source/blender/editors/hair')
-rw-r--r-- | source/blender/editors/hair/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/hair/hair_cursor.c | 109 | ||||
-rw-r--r-- | source/blender/editors/hair/hair_edit.c | 27 | ||||
-rw-r--r-- | source/blender/editors/hair/hair_intern.h | 4 |
4 files changed, 139 insertions, 2 deletions
diff --git a/source/blender/editors/hair/CMakeLists.txt b/source/blender/editors/hair/CMakeLists.txt index e131dad3bfd..3e9e256aa93 100644 --- a/source/blender/editors/hair/CMakeLists.txt +++ b/source/blender/editors/hair/CMakeLists.txt @@ -38,6 +38,7 @@ set(INC_SYS ) set(SRC + hair_cursor.c hair_edit.c hair_ops.c hair_stroke.c diff --git a/source/blender/editors/hair/hair_cursor.c b/source/blender/editors/hair/hair_cursor.c new file mode 100644 index 00000000000..dadd0cf114e --- /dev/null +++ b/source/blender/editors/hair/hair_cursor.c @@ -0,0 +1,109 @@ +/* + * ***** 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/hair_cursor.c + * \ingroup edhair + */ + +#include "MEM_guardedalloc.h" + +#include "BLI_utildefines.h" +#include "BLI_math.h" + +#include "DNA_brush_types.h" +#include "DNA_scene_types.h" +#include "DNA_screen_types.h" +#include "DNA_view3d_types.h" + +#include "BKE_brush.h" +#include "BKE_context.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "BIF_gl.h" +#include "BIF_glutil.h" + +#include "ED_view3d.h" + +#include "hair_intern.h" + +static void hair_draw_cursor(bContext *C, int x, int y, void *UNUSED(customdata)) +{ + Scene *scene = CTX_data_scene(C); + UnifiedPaintSettings *ups = &scene->toolsettings->unified_paint_settings; + HairEditSettings *settings = &scene->toolsettings->hair_edit; + Brush *brush = settings->brush; + + float final_radius; + float translation[2]; + float outline_alpha, *outline_col; + + if (!brush) + return; + + final_radius = BKE_brush_size_get(scene, brush); + + /* set various defaults */ + translation[0] = x; + translation[1] = y; + outline_alpha = 0.5; + outline_col = brush->add_col; + + /* make lines pretty */ + glEnable(GL_BLEND); + glEnable(GL_LINE_SMOOTH); + + /* set brush color */ + glColor4f(outline_col[0], outline_col[1], outline_col[2], outline_alpha); + + /* draw brush outline */ + glTranslatef(translation[0], translation[1], 0); + + /* draw an inner brush */ + if (ups->stroke_active && BKE_brush_use_size_pressure(scene, brush)) { + /* inner at full alpha */ + glutil_draw_lined_arc(0.0, M_PI*2.0f, final_radius * ups->size_pressure_value, 40); + /* outer at half alpha */ + glColor4f(outline_col[0], outline_col[1], outline_col[2], outline_alpha * 0.5f); + } + glutil_draw_lined_arc(0.0, M_PI*2.0f, final_radius, 40); + glTranslatef(-translation[0], -translation[1], 0); + + /* restore GL state */ + glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); +} + +void hair_edit_cursor_start(bContext *C, int (*poll)(bContext *C)) +{ + Scene *scene = CTX_data_scene(C); + HairEditSettings *settings = &scene->toolsettings->hair_edit; + + if (!settings->paint_cursor) + settings->paint_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), poll, hair_draw_cursor, NULL); +} diff --git a/source/blender/editors/hair/hair_edit.c b/source/blender/editors/hair/hair_edit.c index c3ce3e67c59..8602eac7def 100644 --- a/source/blender/editors/hair/hair_edit.c +++ b/source/blender/editors/hair/hair_edit.c @@ -156,6 +156,23 @@ int hair_edit_toggle_poll(bContext *C) return has_hair_data(ob); } +static void toggle_hair_cursor(bContext *C, bool enable) +{ + wmWindowManager *wm = CTX_wm_manager(C); + Scene *scene = CTX_data_scene(C); + HairEditSettings *settings = &scene->toolsettings->hair_edit; + + if (enable) { + hair_edit_cursor_start(C, hair_edit_toggle_poll); + } + else { + if (settings->paint_cursor) { + WM_paint_cursor_end(wm, settings->paint_cursor); + settings->paint_cursor = NULL; + } + } +} + static int hair_edit_toggle_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); @@ -173,14 +190,14 @@ static int hair_edit_toggle_exec(bContext *C, wmOperator *op) init_hair_edit(scene, ob); ob->mode |= mode_flag; -// toggle_particle_cursor(C, 1); + toggle_hair_cursor(C, true); WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_HAIR, NULL); } else { apply_hair_edit(ob); ob->mode &= ~mode_flag; -// toggle_particle_cursor(C, 0); + toggle_hair_cursor(C, false); WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_HAIR, NULL); } @@ -401,6 +418,12 @@ static void hair_stroke_apply_event(bContext *C, wmOperator *op, const wmEvent * DAG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); } + else { + /* even if nothing was changed, still trigger redraw + * for brush drawing during the modal operator + */ + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + } } static int hair_stroke_invoke(bContext *C, wmOperator *op, const wmEvent *event) diff --git a/source/blender/editors/hair/hair_intern.h b/source/blender/editors/hair/hair_intern.h index 1ade4e809b9..eb57c8b1dcf 100644 --- a/source/blender/editors/hair/hair_intern.h +++ b/source/blender/editors/hair/hair_intern.h @@ -69,6 +69,10 @@ typedef struct HairToolData { bool hair_brush_step(struct HairToolData *data); +/* ==== Cursor ==== */ + +void hair_edit_cursor_start(struct bContext *C, int (*poll)(struct bContext *C)); + /* ==== BMesh utilities ==== */ struct BMEditStrands; |