Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / gpencil / gpencil_utils.c
index 0e08630..861fdca 100644 (file)
@@ -82,16 +82,16 @@ bGPdata **ED_gpencil_data_get_pointers_direct(ID *screen_id, Scene *scene, ScrAr
         */
        if (sa) {
                SpaceLink *sl = sa->spacedata.first;
-               
+
                switch (sa->spacetype) {
                        case SPACE_VIEW3D: /* 3D-View */
                        {
                                BLI_assert(scene && ELEM(scene->toolsettings->gpencil_src,
                                                         GP_TOOL_SOURCE_SCENE, GP_TOOL_SOURCE_OBJECT));
-                               
+
                                if (scene->toolsettings->gpencil_src == GP_TOOL_SOURCE_OBJECT) {
                                        /* legacy behaviour for usage with old addons requiring object-linked to objects */
-                                       
+
                                        /* just in case no active/selected object... */
                                        if (ob && (ob->flag & SELECT)) {
                                                /* for now, as long as there's an object, default to using that in 3D-View */
@@ -109,21 +109,21 @@ bGPdata **ED_gpencil_data_get_pointers_direct(ID *screen_id, Scene *scene, ScrAr
                        case SPACE_NODE: /* Nodes Editor */
                        {
                                SpaceNode *snode = (SpaceNode *)sl;
-                               
+
                                /* return the GP data for the active node block/node */
                                if (snode && snode->nodetree) {
                                        /* for now, as long as there's an active node tree, default to using that in the Nodes Editor */
                                        if (ptr) RNA_id_pointer_create(&snode->nodetree->id, ptr);
                                        return &snode->nodetree->gpd;
                                }
-                               
+
                                /* even when there is no node-tree, don't allow this to flow to scene */
                                return NULL;
                        }
                        case SPACE_SEQ: /* Sequencer */
                        {
                                SpaceSeq *sseq = (SpaceSeq *)sl;
-                       
+
                                /* for now, Grease Pencil data is associated with the space (actually preview region only) */
                                /* XXX our convention for everything else is to link to data though... */
                                if (ptr) RNA_pointer_create(screen_id, &RNA_SpaceSequenceEditor, sseq, ptr);
@@ -132,7 +132,7 @@ bGPdata **ED_gpencil_data_get_pointers_direct(ID *screen_id, Scene *scene, ScrAr
                        case SPACE_IMAGE: /* Image/UV Editor */
                        {
                                SpaceImage *sima = (SpaceImage *)sl;
-                               
+
                                /* for now, Grease Pencil data is associated with the space... */
                                /* XXX our convention for everything else is to link to data though... */
                                if (ptr) RNA_pointer_create(screen_id, &RNA_SpaceImageEditor, sima, ptr);
@@ -142,23 +142,23 @@ bGPdata **ED_gpencil_data_get_pointers_direct(ID *screen_id, Scene *scene, ScrAr
                        {
                                SpaceClip *sc = (SpaceClip *)sl;
                                MovieClip *clip = ED_space_clip_get_clip(sc);
-                               
+
                                if (clip) {
                                        if (sc->gpencil_src == SC_GPENCIL_SRC_TRACK) {
                                                MovieTrackingTrack *track = BKE_tracking_track_get_active(&clip->tracking);
-                                               
+
                                                if (!track)
                                                        return NULL;
-                                               
+
                                                if (ptr)
                                                        RNA_pointer_create(&clip->id, &RNA_MovieTrackingTrack, track, ptr);
-                                               
+
                                                return &track->gpd;
                                        }
                                        else {
                                                if (ptr)
                                                        RNA_id_pointer_create(&clip->id, ptr);
-                                               
+
                                                return &clip->gpd;
                                        }
                                }
@@ -168,7 +168,7 @@ bGPdata **ED_gpencil_data_get_pointers_direct(ID *screen_id, Scene *scene, ScrAr
                                return NULL;
                }
        }
-       
+
        /* just fall back on the scene's GP data */
        if (ptr) RNA_id_pointer_create((ID *)scene, ptr);
        return (scene) ? &scene->gpd : NULL;
@@ -181,7 +181,7 @@ bGPdata **ED_gpencil_data_get_pointers(const bContext *C, PointerRNA *ptr)
        Scene *scene = CTX_data_scene(C);
        ScrArea *sa = CTX_wm_area(C);
        Object *ob = CTX_data_active_object(C);
-       
+
        return ED_gpencil_data_get_pointers_direct(screen_id, scene, sa, ob, ptr);
 }
 
@@ -211,7 +211,7 @@ bGPdata *ED_gpencil_data_get_active_v3d(Scene *scene, ViewLayer *view_layer)
        /* We have to make sure active object is actually visible and selected, else we must use default scene gpd,
         * to be consistent with ED_gpencil_data_get_active's behavior.
         */
-       
+
        if (base && TESTBASE(base)) {
                gpd = base->object->gpd;
        }
@@ -239,7 +239,7 @@ bool ED_gpencil_has_keyframe_v3d(Scene *scene, Object *ob, int cfra)
                        }
                }
        }
-       
+
        if (ob && ob->gpd) {
                bGPDlayer *gpl = BKE_gpencil_layer_getactive(ob->gpd);
                if (gpl) {
@@ -253,7 +253,7 @@ bool ED_gpencil_has_keyframe_v3d(Scene *scene, Object *ob, int cfra)
                        }
                }
        }
-       
+
        return false;
 }
 
@@ -272,7 +272,7 @@ int gp_active_layer_poll(bContext *C)
 {
        bGPdata *gpd = ED_gpencil_data_get_active(C);
        bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd);
-       
+
        return (gpl != NULL);
 }
 
@@ -317,25 +317,25 @@ const EnumPropertyItem *ED_gpencil_layers_enum_itemf(
        EnumPropertyItem *item = NULL, item_tmp = {0};
        int totitem = 0;
        int i = 0;
-       
+
        if (ELEM(NULL, C, gpd)) {
                return DummyRNA_DEFAULT_items;
        }
-       
+
        /* Existing layers */
        for (gpl = gpd->layers.first; gpl; gpl = gpl->next, i++) {
                item_tmp.identifier = gpl->info;
                item_tmp.name = gpl->info;
                item_tmp.value = i;
-               
+
                if (gpl->flag & GP_LAYER_ACTIVE)
                        item_tmp.icon = ICON_GREASEPENCIL;
-               else 
+               else
                        item_tmp.icon = ICON_NONE;
-               
+
                RNA_enum_item_add(&item, &totitem, &item_tmp);
        }
-       
+
        RNA_enum_item_end(&item, &totitem);
        *r_free = true;
 
@@ -351,11 +351,11 @@ const EnumPropertyItem *ED_gpencil_layers_with_new_enum_itemf(
        EnumPropertyItem *item = NULL, item_tmp = {0};
        int totitem = 0;
        int i = 0;
-       
+
        if (ELEM(NULL, C, gpd)) {
                return DummyRNA_DEFAULT_items;
        }
-       
+
        /* Create new layer */
        /* TODO: have some way of specifying that we don't want this? */
        {
@@ -365,25 +365,25 @@ const EnumPropertyItem *ED_gpencil_layers_with_new_enum_itemf(
                item_tmp.value = -1;
                item_tmp.icon = ICON_ZOOMIN;
                RNA_enum_item_add(&item, &totitem, &item_tmp);
-               
+
                /* separator */
                RNA_enum_item_add_separator(&item, &totitem);
        }
-       
+
        /* Existing layers */
        for (gpl = gpd->layers.first, i = 0; gpl; gpl = gpl->next, i++) {
                item_tmp.identifier = gpl->info;
                item_tmp.name = gpl->info;
                item_tmp.value = i;
-               
+
                if (gpl->flag & GP_LAYER_ACTIVE)
                        item_tmp.icon = ICON_GREASEPENCIL;
-               else 
+               else
                        item_tmp.icon = ICON_NONE;
-               
+
                RNA_enum_item_add(&item, &totitem, &item_tmp);
        }
-       
+
        RNA_enum_item_end(&item, &totitem);
        *r_free = true;
 
@@ -412,11 +412,11 @@ bool gp_stroke_inside_circle(const int mval[2], const int UNUSED(mvalo[2]),
        const float mval_fl[2]     = {mval[0], mval[1]};
        const float screen_co_a[2] = {x0, y0};
        const float screen_co_b[2] = {x1, y1};
-       
+
        if (edge_inside_circle(mval_fl, rad, screen_co_a, screen_co_b)) {
                return true;
        }
-       
+
        /* not inside */
        return false;
 }
@@ -469,7 +469,7 @@ bool ED_gpencil_stroke_color_use(const bGPDlayer *gpl, const bGPDstroke *gps)
                if (((gpl->flag & GP_LAYER_UNLOCK_COLOR) == 0) && (palcolor->flag & PC_COLOR_LOCKED))
                        return false;
        }
-       
+
        return true;
 }
 
@@ -524,16 +524,16 @@ void gp_point_conversion_init(bContext *C, GP_SpaceConversion *r_gsc)
 {
        ScrArea *sa = CTX_wm_area(C);
        ARegion *ar = CTX_wm_region(C);
-       
+
        /* zero out the storage (just in case) */
        memset(r_gsc, 0, sizeof(GP_SpaceConversion));
        unit_m4(r_gsc->mat);
-       
+
        /* store settings */
        r_gsc->sa = sa;
        r_gsc->ar = ar;
        r_gsc->v2d = &ar->v2d;
-       
+
        /* init region-specific stuff */
        if (sa->spacetype == SPACE_VIEW3D) {
                wmWindow *win = CTX_wm_window(C);
@@ -541,13 +541,13 @@ void gp_point_conversion_init(bContext *C, GP_SpaceConversion *r_gsc)
                struct Depsgraph *depsgraph = CTX_data_depsgraph(C);
                View3D *v3d = (View3D *)CTX_wm_space_data(C);
                RegionView3D *rv3d = ar->regiondata;
-               
+
                /* init 3d depth buffers */
                view3d_operator_needs_opengl(C);
-               
+
                view3d_region_operator_needs_opengl(win, ar);
                ED_view3d_autodist_init(depsgraph, ar, v3d, 0);
-               
+
                /* for camera view set the subrect */
                if (rv3d->persp == RV3D_CAMOB) {
                        ED_view3d_calc_camera_border(scene, CTX_data_depsgraph(C), ar, v3d, rv3d, &r_gsc->subrect_data, true); /* no shift */
@@ -563,7 +563,7 @@ void gp_point_conversion_init(bContext *C, GP_SpaceConversion *r_gsc)
  * \param diff_mat   Matrix with the difference between original parent matrix
  * \param[out] r_pt  Pointer to new point after apply matrix
  */
-void gp_point_to_parent_space(bGPDspoint *pt, float diff_mat[4][4], bGPDspoint *r_pt) 
+void gp_point_to_parent_space(bGPDspoint *pt, float diff_mat[4][4], bGPDspoint *r_pt)
 {
        float fpt[3];
 
@@ -626,12 +626,12 @@ void gp_point_to_xy(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
        View2D *v2d = gsc->v2d;
        rctf *subrect = gsc->subrect;
        int xyval[2];
-       
+
        /* sanity checks */
        BLI_assert(!(gps->flag & GP_STROKE_3DSPACE) || (gsc->sa->spacetype == SPACE_VIEW3D));
        BLI_assert(!(gps->flag & GP_STROKE_2DSPACE) || (gsc->sa->spacetype != SPACE_VIEW3D));
-       
-       
+
+
        if (gps->flag & GP_STROKE_3DSPACE) {
                if (ED_view3d_project_int_global(ar, &pt->x, xyval, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) {
                        *r_x = xyval[0];
@@ -679,12 +679,12 @@ void gp_point_to_xy_fl(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
        View2D *v2d = gsc->v2d;
        rctf *subrect = gsc->subrect;
        float xyval[2];
-       
+
        /* sanity checks */
        BLI_assert(!(gps->flag & GP_STROKE_3DSPACE) || (gsc->sa->spacetype == SPACE_VIEW3D));
        BLI_assert(!(gps->flag & GP_STROKE_2DSPACE) || (gsc->sa->spacetype != SPACE_VIEW3D));
-       
-       
+
+
        if (gps->flag & GP_STROKE_3DSPACE) {
                if (ED_view3d_project_float_global(ar, &pt->x, xyval, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) {
                        *r_x = xyval[0];
@@ -698,10 +698,10 @@ void gp_point_to_xy_fl(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
        else if (gps->flag & GP_STROKE_2DSPACE) {
                float vec[3] = {pt->x, pt->y, 0.0f};
                int t_x, t_y;
-               
+
                mul_m4_v3(gsc->mat, vec);
                UI_view2d_view_to_region_clip(v2d, vec[0], vec[1], &t_x, &t_y);
-               
+
                if ((t_x == t_y) && (t_x == V2D_IS_CLIPPED)) {
                        /* XXX: Or should we just always use the values as-is? */
                        *r_x = 0.0f;
@@ -748,22 +748,22 @@ bool gp_point_xy_to_3d(GP_SpaceConversion *gsc, Scene *scene, const float screen
        float *rvec = ED_view3d_cursor3d_get(scene, v3d)->location;
        float ref[3] = {rvec[0], rvec[1], rvec[2]};
        float zfac = ED_view3d_calc_zfac(rv3d, rvec, NULL);
-       
+
        float mval_f[2], mval_prj[2];
        float dvec[3];
-       
+
        copy_v2_v2(mval_f, screen_co);
-       
+
        if (ED_view3d_project_float_global(gsc->ar, ref, mval_prj, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) {
                sub_v2_v2v2(mval_f, mval_prj, mval_f);
                ED_view3d_win_to_delta(gsc->ar, mval_f, dvec, zfac);
                sub_v3_v3v3(r_out, rvec, dvec);
-               
+
                return true;
        }
        else {
                zero_v3(r_out);
-               
+
                return false;
        }
 }
@@ -780,19 +780,19 @@ bool gp_smooth_stroke(bGPDstroke *gps, int i, float inf, bool affect_pressure)
        bGPDspoint *pt = &gps->points[i];
        float pressure = 0.0f;
        float sco[3] = {0.0f};
-       
+
        /* Do nothing if not enough points to smooth out */
        if (gps->totpoints <= 2) {
                return false;
        }
-       
+
        /* Only affect endpoints by a fraction of the normal strength,
         * to prevent the stroke from shrinking too much
         */
        if ((i == 0) || (i == gps->totpoints - 1)) {
                inf *= 0.1f;
        }
-       
+
        /* Compute smoothed coordinate by taking the ones nearby */
        /* XXX: This is potentially slow, and suffers from accumulation error as earlier points are handled before later ones */
        {
@@ -800,14 +800,14 @@ bool gp_smooth_stroke(bGPDstroke *gps, int i, float inf, bool affect_pressure)
                const int   steps = 2;
                const float average_fac = 1.0f / (float)(steps * 2 + 1);
                int step;
-               
+
                /* add the point itself */
                madd_v3_v3fl(sco, &pt->x, average_fac);
-               
+
                if (affect_pressure) {
                        pressure += pt->pressure * average_fac;
                }
-               
+
                /* n-steps before/after current point */
                // XXX: review how the endpoints are treated by this algorithm
                // XXX: falloff measures should also introduce some weighting variations, so that further-out points get less weight
@@ -815,17 +815,17 @@ bool gp_smooth_stroke(bGPDstroke *gps, int i, float inf, bool affect_pressure)
                        bGPDspoint *pt1, *pt2;
                        int before = i - step;
                        int after = i + step;
-                       
+
                        CLAMP_MIN(before, 0);
                        CLAMP_MAX(after, gps->totpoints - 1);
-                       
+
                        pt1 = &gps->points[before];
                        pt2 = &gps->points[after];
-                       
+
                        /* add both these points to the average-sum (s += p[i]/n) */
                        madd_v3_v3fl(sco, &pt1->x, average_fac);
                        madd_v3_v3fl(sco, &pt2->x, average_fac);
-                       
+
 #if 0
                        /* XXX: Disabled because get weird result */
                        /* do pressure too? */
@@ -836,17 +836,17 @@ bool gp_smooth_stroke(bGPDstroke *gps, int i, float inf, bool affect_pressure)
 #endif
                }
        }
-       
+
        /* Based on influence factor, blend between original and optimal smoothed coordinate */
        interp_v3_v3v3(&pt->x, &pt->x, sco, inf);
-       
+
 #if 0
        /* XXX: Disabled because get weird result */
        if (affect_pressure) {
                pt->pressure = pressure;
        }
 #endif
-       
+
        return true;
 }
 
@@ -939,22 +939,22 @@ void gp_subdivide_stroke(bGPDstroke *gps, const int new_totpoints)
                gps->points[new_totpoints - y] = gps->points[i];
                y += 2;
        }
-       
+
        /* Create interpolated points */
        for (int i = 0; i < new_totpoints - 1; i += 2) {
                bGPDspoint *prev  = &gps->points[i];
                bGPDspoint *pt    = &gps->points[i + 1];
                bGPDspoint *next  = &gps->points[i + 2];
-               
+
                /* Interpolate all values */
                interp_v3_v3v3(&pt->x, &prev->x, &next->x, 0.5f);
-               
+
                pt->pressure = interpf(prev->pressure, next->pressure, 0.5f);
                pt->strength = interpf(prev->strength, next->strength, 0.5f);
                CLAMP(pt->strength, GPENCIL_STRENGTH_MIN, 1.0f);
                pt->time = interpf(prev->time, next->time, 0.5f);
        }
-       
+
        /* Update to new total number of points */
        gps->totpoints = new_totpoints;
 }
@@ -987,12 +987,12 @@ void gp_randomize_stroke(bGPDstroke *gps, bGPDbrush *brush)
        float normal[3];
        cross_v3_v3v3(normal, v1, v2);
        normalize_v3(normal);
-       
+
        /* get orthogonal vector to plane to rotate random effect */
        float ortho[3];
        cross_v3_v3v3(ortho, v1, normal);
        normalize_v3(ortho);
-       
+
        /* Read all points and apply shift vector (first and last point not modified) */
        for (int i = 1; i < gps->totpoints - 1; ++i) {
                bGPDspoint *pt = &gps->points[i];