Commit: e08c70d11c2a5079da9cdf7116e539d7b29425c1
Author: Antonioya
Date:   Sat Dec 8 23:35:44 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rBe08c70d11c2a5079da9cdf7116e539d7b29425c1

GP: Experimental test for Stroke project

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

M       source/blender/editors/gpencil/gpencil_primitive.c

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

diff --git a/source/blender/editors/gpencil/gpencil_primitive.c 
b/source/blender/editors/gpencil/gpencil_primitive.c
index c0ac1e13a35..bd4d8e28e2f 100644
--- a/source/blender/editors/gpencil/gpencil_primitive.c
+++ b/source/blender/editors/gpencil/gpencil_primitive.c
@@ -477,11 +477,13 @@ static void gp_primitive_update_strokes(bContext *C, 
tGPDprimitive *tgpi)
        bGPdata *gpd = tgpi->gpd;
        bGPDstroke *gps = tgpi->gpf->strokes.first;
        GP_Sculpt_Settings *gset = &ts->gp_sculpt;
+       int depth_margin = (ts->gpencil_v3d_align & GP_PROJECT_DEPTH_STROKE) ? 
4 : 0;
+       char *align_flag = &ts->gpencil_v3d_align;
+       bool is_depth = (bool)(*align_flag & (GP_PROJECT_DEPTH_VIEW | 
GP_PROJECT_DEPTH_STROKE));
 
        gps->totpoints = (tgpi->tot_edges + tgpi->tot_stored_edges);
 
        /* compute screen-space coordinates for points */
-       
        tGPspoint *points2D = tgpi->points;
        switch (tgpi->type) {
                case GP_STROKE_BOX:
@@ -518,7 +520,78 @@ static void gp_primitive_update_strokes(bContext *C, 
tGPDprimitive *tgpi)
        if (gset->flag & GP_SCULPT_SETT_FLAG_PRIMITIVE_CURVE) {
                curvemapping_initialize(ts->gp_sculpt.cur_primitive);
        }
-       
+
+       /* get an array of depths, far depths are blended */
+       float *depth_arr = NULL;
+       if (is_depth) {
+               int i;
+               int mval_i[2], mval_prev[2] = { 0 };
+               bool interp_depth = false;
+               bool found_depth = false;
+
+               depth_arr = MEM_mallocN(sizeof(float) * gps->totpoints, 
"depth_points");
+               tGPspoint *ptc = &points2D[0];
+               for (i = 0; i < gps->totpoints; i++, ptc++) {
+                       round_v2i_v2fl(mval_i, &ptc->x);
+                       if ((ED_view3d_autodist_depth(tgpi->ar, mval_i, 
depth_margin, depth_arr + i) == 0) &&
+                               (i && (ED_view3d_autodist_depth_seg(tgpi->ar, 
mval_i, mval_prev, depth_margin + 1, depth_arr + i) == 0)))
+                       {
+                               interp_depth = true;
+                       }
+                       else {
+                               found_depth = true;
+                       }
+                       copy_v2_v2_int(mval_prev, mval_i);
+               }
+
+               if (!found_depth) {
+                       for (i = gps->totpoints - 1; i >= 0; i--) {
+                               depth_arr[i] = 0.9999f;
+                       }
+               }
+               else {
+                       if ((ts->gpencil_v3d_align & 
GP_PROJECT_DEPTH_STROKE_ENDPOINTS) ||
+                               (ts->gpencil_v3d_align & 
GP_PROJECT_DEPTH_STROKE_FIRST))
+                       {
+                               int first_valid = 0;
+                               int last_valid = 0;
+
+                               /* find first valid contact point */
+                               for (i = 0; i < gps->totpoints; i++) {
+                                       if (depth_arr[i] != FLT_MAX)
+                                               break;
+                               }
+                               first_valid = i;
+
+                               /* find last valid contact point */
+                               if (ts->gpencil_v3d_align & 
GP_PROJECT_DEPTH_STROKE_FIRST) {
+                                       last_valid = first_valid;
+                               }
+                               else {
+                                       for (i = gps->totpoints - 1; i >= 0; 
i--) {
+                                               if (depth_arr[i] != FLT_MAX)
+                                                       break;
+                                       }
+                                       last_valid = i;
+                               }
+
+                               /* invalidate any other point, to interpolate 
between
+                                * first and last contact in an imaginary line 
between them */
+                               for (i = 0; i < gps->totpoints; i++) {
+                                       if ((i != first_valid) && (i != 
last_valid)) {
+                                               depth_arr[i] = FLT_MAX;
+                                       }
+                               }
+                               interp_depth = true;
+                       }
+
+                       if (interp_depth) {
+                               interp_sparse_array(depth_arr, gps->totpoints, 
FLT_MAX);
+                       }
+               }
+       }
+
+       /* load stroke points and sbuffer */
        for (int i = 0; i < gps->totpoints; i++) {
                bGPDspoint *pt = &gps->points[i];
                tGPspoint *p2d = &points2D[i];
@@ -550,7 +623,10 @@ static void gp_primitive_update_strokes(bContext *C, 
tGPDprimitive *tgpi)
                gpd->runtime.sbuffer_size++;
 
                /* convert screen-coordinates to 3D coordinates */
-               gp_stroke_convertcoords_tpoint(tgpi->scene, tgpi->ar, tgpi->ob, 
tgpi->gpl, p2d, NULL, &pt->x);
+               gp_stroke_convertcoords_tpoint(
+                       tgpi->scene, tgpi->ar, tgpi->ob, tgpi->gpl,
+                       p2d, depth_arr ? depth_arr + i : NULL,
+                       &pt->x);
 
                pt->pressure = pressure;
                pt->strength = tgpi->brush->gpencil_settings->draw_strength;
@@ -565,7 +641,7 @@ static void gp_primitive_update_strokes(bContext *C, 
tGPDprimitive *tgpi)
        }
 
        /* if axis locked, reproject to plane locked */
-       if (tgpi->lock_axis > GP_LOCKAXIS_VIEW) {
+       if ((!is_depth) && (tgpi->lock_axis > GP_LOCKAXIS_VIEW)) {
                bGPDspoint *tpt = gps->points;
                float origin[3];
                ED_gp_get_drawing_reference(tgpi->scene, tgpi->ob, tgpi->gpl,
@@ -587,6 +663,8 @@ static void gp_primitive_update_strokes(bContext *C, 
tGPDprimitive *tgpi)
        /* force fill recalc */
        gps->flag |= GP_STROKE_RECALC_CACHES;
 
+       MEM_SAFE_FREE(depth_arr);
+
        DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE);
        DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
        WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL);

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

Reply via email to