[Bf-blender-cvs] [3adbe82e079] master: GPencil: Extract function to calculate cursor size
Antonio Vazquez
noreply at git.blender.org
Tue Dec 27 10:26:42 CET 2022
Commit: 3adbe82e079c0c07425fddf4c0fffc50feb2645f
Author: Antonio Vazquez
Date: Tue Dec 27 10:01:37 2022 +0100
Branches: master
https://developer.blender.org/rB3adbe82e079c0c07425fddf4c0fffc50feb2645f
GPencil: Extract function to calculate cursor size
This function will be used in other areas of Blender.
===================================================================
M source/blender/editors/gpencil/gpencil_utils.c
M source/blender/editors/include/ED_gpencil.h
===================================================================
diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c
index 9f6b17b66e2..f8e2a8fd080 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -1730,6 +1730,56 @@ static bool gpencil_brush_cursor_poll(bContext *C)
return false;
}
+float ED_gpencil_cursor_radius(bContext *C, int x, int y)
+{
+ Scene *scene = CTX_data_scene(C);
+ Object *ob = CTX_data_active_object(C);
+ ARegion *region = CTX_wm_region(C);
+ Brush *brush = brush = scene->toolsettings->gp_paint->paint.brush;
+ bGPdata *gpd = ED_gpencil_data_get_active(C);
+
+ /* Show brush size. */
+ tGPspoint point2D;
+ float p1[3];
+ float p2[3];
+ float distance;
+ float radius = 2.0f;
+
+ if (ELEM(NULL, gpd, brush)) {
+ return radius;
+ }
+
+ /* Strokes in screen space or world space? */
+ if ((gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS) != 0) {
+ /* In screen space the cursor radius matches the brush size. */
+ radius = (float)brush->size * 0.5f;
+ }
+ else {
+ /* To calculate the brush size in world space, we have to establish the zoom level.
+ * For this we take two 2D screen coordinates with a fixed offset,
+ * convert them to 3D coordinates and measure the offset distance in 3D.
+ * A small distance means a high zoom level. */
+ point2D.m_xy[0] = (float)x;
+ point2D.m_xy[1] = (float)y;
+ gpencil_stroke_convertcoords_tpoint(scene, region, ob, &point2D, NULL, p1);
+ point2D.m_xy[0] = (float)(x + 64);
+ gpencil_stroke_convertcoords_tpoint(scene, region, ob, &point2D, NULL, p2);
+ /* Clip extreme zoom level (and avoid division by zero). */
+ distance = MAX2(len_v3v3(p1, p2), 0.001f);
+
+ /* Handle layer thickness change. */
+ float brush_size = (float)brush->size;
+ bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd);
+ if (gpl != NULL) {
+ brush_size = MAX2(1.0f, brush_size + gpl->line_change);
+ }
+
+ /* Convert the 3D offset distance to a brush radius. */
+ radius = (1 / distance) * 2.0f * gpd->pixfactor * (brush_size / 64);
+ }
+ return radius;
+}
+
/**
* Helper callback for drawing the cursor itself.
*/
@@ -1813,39 +1863,13 @@ static void gpencil_brush_cursor_draw(bContext *C, int x, int y, void *customdat
copy_v3_v3(color, is_vertex_stroke ? brush->rgb : gp_style->stroke_rgba);
}
else {
- /* Show brush size. */
- tGPspoint point2D;
- float p1[3];
- float p2[3];
- float distance;
-
/* Strokes in screen space or world space? */
if ((gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS) != 0) {
/* In screen space the cursor radius matches the brush size. */
radius = (float)brush->size * 0.5f;
}
else {
- /* To calculate the brush size in world space, we have to establish the zoom level.
- * For this we take two 2D screen coordinates with a fixed offset,
- * convert them to 3D coordinates and measure the offset distance in 3D.
- * A small distance means a high zoom level. */
- point2D.m_xy[0] = (float)x;
- point2D.m_xy[1] = (float)y;
- gpencil_stroke_convertcoords_tpoint(scene, region, ob, &point2D, NULL, p1);
- point2D.m_xy[0] = (float)(x + 64);
- gpencil_stroke_convertcoords_tpoint(scene, region, ob, &point2D, NULL, p2);
- /* Clip extreme zoom level (and avoid division by zero). */
- distance = MAX2(len_v3v3(p1, p2), 0.001f);
-
- /* Handle layer thickness change. */
- float brush_size = (float)brush->size;
- bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd);
- if (gpl != NULL) {
- brush_size = MAX2(1.0f, brush_size + gpl->line_change);
- }
-
- /* Convert the 3D offset distance to a brush radius. */
- radius = (1 / distance) * 2.0f * gpd->pixfactor * (brush_size / 64);
+ radius = ED_gpencil_cursor_radius(C, x, y);
}
copy_v3_v3(color, is_vertex_stroke ? brush->rgb : gp_style->stroke_rgba);
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 45e61592424..129229a8861 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -641,6 +641,11 @@ struct bGPDstroke *ED_gpencil_stroke_join_and_trim(struct bGPdata *gpd,
*/
void ED_gpencil_stroke_close_by_distance(struct bGPDstroke *gps, float threshold);
+/**
+ * Calculate the brush cursor size in world space.
+ */
+float ED_gpencil_cursor_radius(struct bContext *C, int x, int y);
+
#ifdef __cplusplus
}
#endif
More information about the Bf-blender-cvs
mailing list