GPv3: Add stabilize stroke options and panel for draw tool. #119857
|
@ -126,6 +126,13 @@ class VIEW3D_HT_tool_header(Header):
|
||||||
elif tool_mode == 'VERTEX_GPENCIL':
|
elif tool_mode == 'VERTEX_GPENCIL':
|
||||||
if is_valid_context:
|
if is_valid_context:
|
||||||
layout.popover("VIEW3D_PT_tools_grease_pencil_vertex_appearance")
|
layout.popover("VIEW3D_PT_tools_grease_pencil_vertex_appearance")
|
||||||
|
elif tool_mode == "PAINT_GREASE_PENCIL":
|
||||||
|
if is_valid_context:
|
||||||
|
brush = context.tool_settings.gpencil_paint.brush
|
||||||
|
if brush:
|
||||||
|
if brush.gpencil_tool != 'ERASE':
|
||||||
|
if brush.gpencil_tool not in {'FILL', 'TINT'}:
|
||||||
|
layout.popover("VIEW3D_PT_tools_grease_pencil_v3_brush_stroke")
|
||||||
|
|
||||||
def draw_mode_settings(self, context):
|
def draw_mode_settings(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
|
|
|
@ -2659,6 +2659,32 @@ class VIEW3D_PT_tools_grease_pencil_v3_brush_mix_palette(View3DPanel, Panel):
|
||||||
col.template_palette(settings, "palette", color=True)
|
col.template_palette(settings, "palette", color=True)
|
||||||
|
|
||||||
|
|
||||||
|
class VIEW3D_PT_tools_grease_pencil_v3_brush_stroke(Panel, View3DPanel):
|
||||||
|
bl_context = ".grease_pencil_paint"
|
||||||
|
bl_parent_id = "VIEW3D_PT_tools_grease_pencil_v3_brush_settings"
|
||||||
|
bl_label = "Stroke"
|
||||||
|
bl_category = "Tool"
|
||||||
|
bl_options = {'DEFAULT_CLOSED'}
|
||||||
|
bl_ui_units_x = 12
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
brush = context.tool_settings.gpencil_paint.brush
|
||||||
|
return brush is not None and brush.gpencil_tool == 'DRAW'
|
||||||
|
|
||||||
|
def draw(self, _context):
|
||||||
|
layout = self.layout
|
||||||
|
layout.use_property_split = True
|
||||||
|
layout.use_property_decorate = False
|
||||||
|
|
||||||
|
|
||||||
|
class VIEW3D_PT_tools_grease_pencil_v3_brush_stabilize_stroke(View3DPanel, Panel, SmoothStrokePanel):
|
||||||
|
bl_context = ".grease_pencil_paint" # dot on purpose (access from topbar)
|
||||||
|
bl_label = "Stabilize Stroke"
|
||||||
|
bl_parent_id = "VIEW3D_PT_tools_grease_pencil_v3_brush_stroke"
|
||||||
|
bl_options = {'DEFAULT_CLOSED'}
|
||||||
|
|
||||||
|
|
||||||
classes = (
|
classes = (
|
||||||
VIEW3D_MT_brush_context_menu,
|
VIEW3D_MT_brush_context_menu,
|
||||||
VIEW3D_MT_brush_gpencil_context_menu,
|
VIEW3D_MT_brush_gpencil_context_menu,
|
||||||
|
@ -2754,6 +2780,8 @@ classes = (
|
||||||
VIEW3D_PT_tools_grease_pencil_v3_brush_settings,
|
VIEW3D_PT_tools_grease_pencil_v3_brush_settings,
|
||||||
VIEW3D_PT_tools_grease_pencil_v3_brush_mixcolor,
|
VIEW3D_PT_tools_grease_pencil_v3_brush_mixcolor,
|
||||||
VIEW3D_PT_tools_grease_pencil_v3_brush_mix_palette,
|
VIEW3D_PT_tools_grease_pencil_v3_brush_mix_palette,
|
||||||
|
VIEW3D_PT_tools_grease_pencil_v3_brush_stroke,
|
||||||
|
VIEW3D_PT_tools_grease_pencil_v3_brush_stabilize_stroke,
|
||||||
|
|
||||||
VIEW3D_PT_tools_grease_pencil_brush_paint_falloff,
|
VIEW3D_PT_tools_grease_pencil_brush_paint_falloff,
|
||||||
VIEW3D_PT_tools_grease_pencil_brush_sculpt_falloff,
|
VIEW3D_PT_tools_grease_pencil_brush_sculpt_falloff,
|
||||||
|
|
|
@ -172,6 +172,10 @@ struct PaintOperationExecutor {
|
||||||
settings_->vertex_factor) :
|
settings_->vertex_factor) :
|
||||||
float4(0.0f);
|
float4(0.0f);
|
||||||
srgb_to_linearrgb_v4(vertex_color_, vertex_color_);
|
srgb_to_linearrgb_v4(vertex_color_, vertex_color_);
|
||||||
|
paint->paint_cursor_col[0] = uint(vertex_color_[0] * 255);
|
||||||
|
paint->paint_cursor_col[1] = uint(vertex_color_[1] * 255);
|
||||||
|
paint->paint_cursor_col[2] = uint(vertex_color_[2] * 255);
|
||||||
|
paint->paint_cursor_col[3] = 128;
|
||||||
/* TODO: UI setting. */
|
/* TODO: UI setting. */
|
||||||
hardness_ = 1.0f;
|
hardness_ = 1.0f;
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,7 @@ bool paint_supports_dynamic_size(Brush *br, PaintMode mode);
|
||||||
* Return true if the brush size can change during paint (normally used for pressure).
|
* Return true if the brush size can change during paint (normally used for pressure).
|
||||||
*/
|
*/
|
||||||
bool paint_supports_dynamic_tex_coords(Brush *br, PaintMode mode);
|
bool paint_supports_dynamic_tex_coords(Brush *br, PaintMode mode);
|
||||||
bool paint_supports_smooth_stroke(Brush *br, PaintMode mode);
|
bool paint_supports_smooth_stroke(Brush *br, PaintMode mode, const wmEvent *event);
|
||||||
bool paint_supports_texture(PaintMode mode);
|
bool paint_supports_texture(PaintMode mode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -628,16 +628,19 @@ static void paint_brush_stroke_add_step(
|
||||||
static bool paint_smooth_stroke(PaintStroke *stroke,
|
static bool paint_smooth_stroke(PaintStroke *stroke,
|
||||||
const PaintSample *sample,
|
const PaintSample *sample,
|
||||||
PaintMode mode,
|
PaintMode mode,
|
||||||
|
const wmEvent *event,
|
||||||
float r_mouse[2],
|
float r_mouse[2],
|
||||||
float *r_pressure)
|
float *r_pressure)
|
||||||
{
|
{
|
||||||
if (paint_supports_smooth_stroke(stroke->brush, mode)) {
|
if (paint_supports_smooth_stroke(stroke->brush, mode, event)) {
|
||||||
float radius = stroke->brush->smooth_stroke_radius * stroke->zoom_2d;
|
float radius = stroke->brush->smooth_stroke_radius * stroke->zoom_2d;
|
||||||
float u = stroke->brush->smooth_stroke_factor;
|
float u = stroke->brush->smooth_stroke_factor;
|
||||||
|
|
||||||
/* If the mouse is moving within the radius of the last move,
|
/* If the mouse is moving within the radius of the last move,
|
||||||
* don't update the mouse position. This allows sharp turns. */
|
* don't update the mouse position. This allows sharp turns. */
|
||||||
if (len_squared_v2v2(stroke->last_mouse_position, sample->mouse) < square_f(radius)) {
|
if (len_squared_v2v2(stroke->last_mouse_position, sample->mouse) < square_f(radius) &&
|
||||||
|
stroke->tot_samples != 0)
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1091,8 +1094,13 @@ bool paint_supports_dynamic_size(Brush *br, PaintMode mode)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool paint_supports_smooth_stroke(Brush *br, PaintMode mode)
|
bool paint_supports_smooth_stroke(Brush *br, PaintMode mode, const wmEvent *event)
|
||||||
{
|
{
|
||||||
|
/* Grease pencil draw mode allows for holding `shift` to toggle smoothing. */
|
||||||
|
if ((mode == PaintMode::GPencil) && (br->gpencil_tool == GPAINT_TOOL_DRAW)) {
|
||||||
|
return ((br->flag & BRUSH_SMOOTH_STROKE) != 0) ^ (event->modifier & KM_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
if (!(br->flag & BRUSH_SMOOTH_STROKE) ||
|
if (!(br->flag & BRUSH_SMOOTH_STROKE) ||
|
||||||
(br->flag & (BRUSH_ANCHORED | BRUSH_DRAG_DOT | BRUSH_LINE)))
|
(br->flag & (BRUSH_ANCHORED | BRUSH_DRAG_DOT | BRUSH_LINE)))
|
||||||
{
|
{
|
||||||
|
@ -1488,15 +1496,28 @@ int paint_stroke_modal(bContext *C, wmOperator *op, const wmEvent *event, PaintS
|
||||||
return OPERATOR_FINISHED;
|
return OPERATOR_FINISHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (paint_supports_smooth_stroke(br, mode)) {
|
|
||||||
stroke->stroke_cursor = WM_paint_cursor_activate(
|
|
||||||
SPACE_TYPE_ANY, RGN_TYPE_ANY, paint_brush_tool_poll, paint_draw_smooth_cursor, stroke);
|
|
||||||
}
|
|
||||||
|
|
||||||
stroke->stroke_init = true;
|
stroke->stroke_init = true;
|
||||||
first_modal = true;
|
first_modal = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Smoothing can be activated and deactivated while running, so the cursor has to update. */
|
||||||
|
if ((br->flag & BRUSH_LINE) == 0) {
|
||||||
|
if (paint_supports_smooth_stroke(br, mode, event)) {
|
||||||
|
/* Activate if it is not active. */
|
||||||
|
if (!stroke->stroke_cursor) {
|
||||||
|
stroke->stroke_cursor = WM_paint_cursor_activate(
|
||||||
|
SPACE_TYPE_ANY, RGN_TYPE_ANY, paint_brush_tool_poll, paint_draw_smooth_cursor, stroke);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Deactivate it if it is active. */
|
||||||
|
if (stroke->stroke_cursor) {
|
||||||
|
WM_paint_cursor_end(static_cast<wmPaintCursor *>(stroke->stroke_cursor));
|
||||||
|
stroke->stroke_cursor = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* one time stroke initialization */
|
/* one time stroke initialization */
|
||||||
if (!stroke->stroke_started) {
|
if (!stroke->stroke_started) {
|
||||||
stroke->last_pressure = sample_average.pressure;
|
stroke->last_pressure = sample_average.pressure;
|
||||||
|
@ -1577,7 +1598,7 @@ int paint_stroke_modal(bContext *C, wmOperator *op, const wmEvent *event, PaintS
|
||||||
((br->flag & BRUSH_AIRBRUSH) && event->type == TIMER &&
|
((br->flag & BRUSH_AIRBRUSH) && event->type == TIMER &&
|
||||||
event->customdata == stroke->timer))
|
event->customdata == stroke->timer))
|
||||||
{
|
{
|
||||||
if (paint_smooth_stroke(stroke, &sample_average, mode, mouse, &pressure)) {
|
if (paint_smooth_stroke(stroke, &sample_average, mode, event, mouse, &pressure)) {
|
||||||
if (stroke->stroke_started) {
|
if (stroke->stroke_started) {
|
||||||
if (paint_space_stroke_enabled(br, mode)) {
|
if (paint_space_stroke_enabled(br, mode)) {
|
||||||
if (paint_space_stroke(C, op, stroke, mouse, pressure)) {
|
if (paint_space_stroke(C, op, stroke, mouse, pressure)) {
|
||||||
|
|
Loading…
Reference in New Issue