[Bf-blender-cvs] [b0d6cbfeec5] greasepencil-object: Speed up multiedit loop

Antonio Vazquez noreply at git.blender.org
Wed Aug 30 10:52:52 CEST 2017


Commit: b0d6cbfeec5dbf6a9baeca459d3f8b98dd93c148
Author: Antonio Vazquez
Date:   Wed Aug 30 10:52:29 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBb0d6cbfeec5dbf6a9baeca459d3f8b98dd93c148

Speed up multiedit loop

If not multiedit, avoid the loop in select

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

M	source/blender/editors/gpencil/gpencil_brush.c
M	source/blender/editors/gpencil/gpencil_intern.h
M	source/blender/editors/screen/screen_context.c
M	source/blender/editors/transform/transform_conversions.c

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

diff --git a/source/blender/editors/gpencil/gpencil_brush.c b/source/blender/editors/gpencil/gpencil_brush.c
index e6f10d9326a..a04ff64c3ac 100644
--- a/source/blender/editors/gpencil/gpencil_brush.c
+++ b/source/blender/editors/gpencil/gpencil_brush.c
@@ -1446,7 +1446,12 @@ static bool gpsculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *gso)
 
 	CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
 	{
-		for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+		bGPDframe *init_gpf = gpl->actframe;
+		if (is_multiedit) {
+			init_gpf = gpl->frames.first;
+		}
+
+		for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
 			if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
 
 				/* calculate difference matrix */
@@ -1541,6 +1546,10 @@ static bool gpsculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *gso)
 				}
 
 			}
+			/* if not multiedit out of loop */
+			if (!is_multiedit) {
+				break;
+			}
 		}
 	}
 	CTX_DATA_END;
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index 0a217dbccf3..57abc007cc0 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -348,7 +348,11 @@ typedef enum ACTCONT_TYPES {
 	bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd_);                       \
 	CTX_DATA_BEGIN(C, bGPDlayer*, gpl, editable_gpencil_layers)                         \
 	{                                                                                   \
-		for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {                        \
+		bGPDframe *init_gpf = gpl->actframe;                                                \
+		if (is_multiedit) {                                                                 \
+			init_gpf = gpl->frames.first;                                                   \
+		}                                                                                   \
+		for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {                        \
 			if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {  \
 				/* calculate difference matrix */                                               \
 				float diff_mat[4][4];                                                           \
@@ -366,6 +370,9 @@ typedef enum ACTCONT_TYPES {
 #define GP_EDITABLE_STROKES_END    \
 				}                  \
 			}                      \
+			if (!is_multiedit) {   \
+				break;             \
+			}                      \
 		}                          \
 	}                              \
 	CTX_DATA_END;                  \
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index fa11ad5cb41..737cc698aab 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -563,8 +563,12 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
 				if (gpencil_layer_is_editable(gpl) && (gpl->actframe)) {
 					bGPDframe *gpf;
 					bGPDstroke *gps;
+					bGPDframe *init_gpf = gpl->actframe;
+					if (is_multiedit) {
+						init_gpf = gpl->frames.first;
+					}
 
-					for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+					for (gpf = init_gpf; gpf; gpf = gpf->next) {
 						if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
 							for (gps = gpf->strokes.first; gps; gps = gps->next) {
 								if (ED_gpencil_stroke_can_use_direct(sa, gps)) {
@@ -577,6 +581,10 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
 								}
 							}
 						}
+						/* if not multiedit out of loop */
+						if (!is_multiedit) {
+							break;
+						}
 					}
 				}
 			}
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 7a127c4f546..91c6a3551e2 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -7857,7 +7857,12 @@ static void createTransGPencil(bContext *C, TransInfo *t)
 		if (gpencil_layer_is_editable(gpl) && (gpl->actframe != NULL)) {
 			bGPDframe *gpf;
 			bGPDstroke *gps;
-			for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+			bGPDframe *init_gpf = gpl->actframe;
+			if (is_multiedit) {
+				init_gpf = gpl->frames.first;
+			}
+
+			for (gpf = init_gpf; gpf; gpf = gpf->next) {
 				if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
 
 					for (gps = gpf->strokes.first; gps; gps = gps->next) {
@@ -7897,6 +7902,10 @@ static void createTransGPencil(bContext *C, TransInfo *t)
 						}
 					}
 				}
+				/* if not multiedit out of loop */
+				if (!is_multiedit) {
+					break;
+				}
 			}
 		}
 	}
@@ -7922,6 +7931,11 @@ static void createTransGPencil(bContext *C, TransInfo *t)
 			float diff_mat[4][4];
 			float inverse_diff_mat[4][4];
 
+			bGPDframe *init_gpf = gpl->actframe;
+			if (is_multiedit) {
+				init_gpf = gpl->frames.first;
+			}
+
 			/* calculate difference matrix */
 			ED_gpencil_parent_location(obact, gpd, gpl, diff_mat);
 			/* undo matrix */
@@ -7941,7 +7955,7 @@ static void createTransGPencil(bContext *C, TransInfo *t)
 			}
 
 			/* Loop over strokes, adding TransData for points as needed... */
-			for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+			for (gpf = init_gpf; gpf; gpf = gpf->next) {
 				if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
 					for (gps = gpf->strokes.first; gps; gps = gps->next) {
 						TransData *head = td;
@@ -8057,6 +8071,10 @@ static void createTransGPencil(bContext *C, TransInfo *t)
 						}
 					}
 				}
+				/* if not multiedit out of loop */
+				if (!is_multiedit) {
+					break;
+				}
 			}
 		}
 	}



More information about the Bf-blender-cvs mailing list