[Bf-blender-cvs] [583b871ec74] greasepencil-object: Cleanup: Ported Lattice Modifier code over to new callbacks

Joshua Leung noreply at git.blender.org
Sat Nov 4 05:48:47 CET 2017


Commit: 583b871ec741a2a500a503303374a5608f769bab
Author: Joshua Leung
Date:   Sat Nov 4 04:40:31 2017 +1300
Branches: greasepencil-object
https://developer.blender.org/rB583b871ec741a2a500a503303374a5608f769bab

Cleanup: Ported Lattice Modifier code over to new callbacks

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

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil_modifier.c
M	source/blender/modifiers/intern/MOD_gpencillattice.c

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 164a42658f3..4cdf86ee862 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -195,13 +195,14 @@ void BKE_gpencil_stroke_normal(const struct bGPDstroke *gps, float r_normal[3]);
 
 void BKE_gpencil_array_modifier_instance_tfm(struct GpencilArrayModifierData *mmd, const int elem_idx[3], float r_mat[4][4]);
 
+void BKE_gpencil_lattice_init(struct Object *ob);
+void BKE_gpencil_lattice_clear(struct Object *ob);
+
 void BKE_gpencil_simplify_modifier(int id, struct GpencilSimplifyModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
 
 /* (wrapper api) simplify stroke using Ramer-Douglas-Peucker algorithm */
 void BKE_gpencil_simplify_stroke(struct bGPDlayer *gpl, struct bGPDstroke *gps, float factor);
 
-void BKE_gpencil_lattice_init(struct Object *ob);
-void BKE_gpencil_lattice_clear(struct Object *ob);
-void BKE_gpencil_lattice_modifier(int id, struct GpencilLatticeModifierData *mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+
 
 #endif /*  __BKE_GPENCIL_H__ */
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index fbf86d6d571..c5f76be4f07 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -133,37 +133,6 @@ void BKE_gpencil_lattice_clear(Object *ob)
 	}
 }
 
-/* apply lattice to stroke */
-void BKE_gpencil_lattice_modifier(
-        int UNUSED(id), GpencilLatticeModifierData *mmd, Object *ob, bGPDlayer *gpl, bGPDstroke *gps)
-{
-	bGPDspoint *pt;
-	int vindex = defgroup_name_index(ob, mmd->vgname);
-	float weight = 1.0f;
-
-	if (!is_stroke_affected_by_modifier(
-	        mmd->layername, mmd->pass_index, 3, gpl, gps,
-	        mmd->flag & GP_LATTICE_INVERSE_LAYER, mmd->flag & GP_LATTICE_INVERSE_PASS))
-	{
-		return;
-	}
-
-	if (mmd->cache_data == NULL) {
-		return;
-	}
-
-	for (int i = 0; i < gps->totpoints; i++) {
-		pt = &gps->points[i];
-		/* verify vertex group */
-		weight = is_point_affected_by_modifier(pt, (int)(!(mmd->flag & GP_LATTICE_INVERSE_VGROUP) == 0), vindex);
-		if (weight < 0) {
-			continue;
-		}
-
-		calc_latt_deform((LatticeDeformData *)mmd->cache_data, &pt->x, mmd->strength * weight);
-	}
-}
-
 
 /* Get points of stroke always flat to view not affected by camera view or view position */
 static void gpencil_stroke_project_2d(const bGPDspoint *points, int totpoints, tbGPDspoint *points2d)
@@ -391,10 +360,6 @@ void BKE_gpencil_stroke_modifiers(Object *ob, bGPDlayer *gpl, bGPDframe *UNUSED(
 				case eModifierType_GpencilSimplify:
 					BKE_gpencil_simplify_modifier(id, (GpencilSimplifyModifierData *)md, ob, gpl, gps);
 					break;
-					// Lattice
-				case eModifierType_GpencilLattice:
-					BKE_gpencil_lattice_modifier(id, (GpencilLatticeModifierData *)md, ob, gpl, gps);
-					break;
 			}
 		}
 		id++;
diff --git a/source/blender/modifiers/intern/MOD_gpencillattice.c b/source/blender/modifiers/intern/MOD_gpencillattice.c
index f1a683def73..54d81d6c1f4 100644
--- a/source/blender/modifiers/intern/MOD_gpencillattice.c
+++ b/source/blender/modifiers/intern/MOD_gpencillattice.c
@@ -37,6 +37,7 @@
 #include "BLI_utildefines.h"
 
 #include "BKE_context.h"
+#include "BKE_deform.h"
 #include "BKE_gpencil.h"
 #include "BKE_lattice.h"
 #include "BKE_library_query.h"
@@ -46,6 +47,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "MOD_modifiertypes.h"
+#include "MOD_gpencil_util.h"
 
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_build.h"
@@ -66,44 +68,79 @@ static void copyData(ModifierData *md, ModifierData *target)
 	modifier_copyData_generic(md, target);
 }
 
+static void deformStroke(ModifierData *md, const EvaluationContext *UNUSED(eval_ctx),
+                         Object *ob, bGPDlayer *gpl, bGPDstroke *gps)
+{
+	GpencilLatticeModifierData *mmd = (GpencilLatticeModifierData *)md;
+	int vindex = defgroup_name_index(ob, mmd->vgname);
+	float weight = 1.0f;
+
+	if (!is_stroke_affected_by_modifier(
+	        mmd->layername, mmd->pass_index, 3, gpl, gps,
+	        mmd->flag & GP_LATTICE_INVERSE_LAYER, mmd->flag & GP_LATTICE_INVERSE_PASS))
+	{
+		return;
+	}
+
+	if (mmd->cache_data == NULL) {
+		return;
+	}
+
+	for (int i = 0; i < gps->totpoints; i++) {
+		bGPDspoint *pt = &gps->points[i];
+		/* verify vertex group */
+		weight = is_point_affected_by_modifier(pt, (int)(!(mmd->flag & GP_LATTICE_INVERSE_VGROUP) == 0), vindex);
+		if (weight < 0) {
+			continue;
+		}
+
+		calc_latt_deform((LatticeDeformData *)mmd->cache_data, &pt->x, mmd->strength * weight);
+	}
+}
+
 static void bakeModifierGP(const bContext *C, const EvaluationContext *eval_ctx,
                            ModifierData *md, Object *ob)
 {
 	GpencilLatticeModifierData *mmd = (GpencilLatticeModifierData *)md;
-	LatticeDeformData *ldata = NULL;
-	Scene *scene = md->scene;
 	Main *bmain = CTX_data_main(C);
+	Scene *scene = md->scene;
+	LatticeDeformData *ldata = NULL;
 	bGPdata *gpd = ob->data;
-	Object *latob = mmd->object;
 	int oldframe = CFRA;
 
-	if ((!latob) || (latob->type != OB_LATTICE)) {
+	if (mmd->object == NULL)
 		return;
-	}
 
 	struct EvaluationContext eval_ctx_copy = *eval_ctx;
 
 	for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
 		for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+			/* apply lattice effects on this frame
+			 * NOTE: this assumes that we don't want lattice animation on non-keyframed frames
+			 */
+			CFRA = gpf->framenum;
+			BKE_scene_update_for_newframe(&eval_ctx_copy, bmain, scene);
+			
+			/* recalculate lattice data */
+			BKE_gpencil_lattice_init(ob);
+			
+			/* compute lattice effects on this frame */
 			for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
-				CFRA = gpf->framenum;
-				BKE_scene_update_for_newframe(&eval_ctx_copy, bmain, scene);
-				/* recalculate lattice data */
-				BKE_gpencil_lattice_init(ob);
-
-				BKE_gpencil_lattice_modifier(-1, (GpencilLatticeModifierData *)md, ob, gpl, gps);
+				deformStroke(md, &eval_ctx_copy, ob, gpl, gps);
 			}
 		}
 	}
-
+	
+	/* free lingering data */
 	ldata = (LatticeDeformData *)mmd->cache_data;
 	if (ldata) {
 		end_latt_deform(ldata);
 		mmd->cache_data = NULL;
 	}
 
-	// XXX: needs an extra update?
+	/* return frame state and DB to original state */
 	CFRA = oldframe;
+	BKE_scene_update_for_newframe(&eval_ctx_copy, bmain, scene); /* XXX: needed? */
 }
 
 static void freeData(ModifierData *md)
@@ -160,7 +197,7 @@ ModifierTypeInfo modifierType_GpencilLattice = {
 	/* deformMatricesEM */  NULL,
 	/* applyModifier */     NULL,
 	/* applyModifierEM */   NULL,
-	/* deformStroke */      NULL,
+	/* deformStroke */      deformStroke,
 	/* generateStrokes */   NULL,
 	/* bakeModifierGP */    bakeModifierGP,
 	/* initData */          initData,



More information about the Bf-blender-cvs mailing list