[Bf-blender-cvs] [6d1a991d9a5] greasepencil-object: WIP: Basic Lattice modifier

Antonio Vazquez noreply at git.blender.org
Fri Jul 28 16:09:23 CEST 2017


Commit: 6d1a991d9a51a4538c5d11587460ce85801a1114
Author: Antonio Vazquez
Date:   Thu Jul 27 21:07:32 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB6d1a991d9a51a4538c5d11587460ce85801a1114

WIP: Basic Lattice modifier

Still problems loading a previous file and other issues

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/CMakeLists.txt
M	source/blender/modifiers/MOD_modifiertypes.h
A	source/blender/modifiers/intern/MOD_gpencillattice.c
M	source/blender/modifiers/intern/MOD_util.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index f30a523cfa9..4cf1351fcb2 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1722,6 +1722,26 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row.prop(md, "random_scale", text="", icon="TIME", toggle=True)
         row.prop(md, "scale_factor", text="")
 
+    def GP_LATTICE(self, layout, ob, md):
+        gpd = ob.grease_pencil
+        split = layout.split()
+
+        col = split.column()
+        col.label(text="Object:")
+        col.prop(md, "object", text="")
+
+        col = split.column()
+        col.label("Layer:")
+        row = col.row(align=True)
+        row.prop_search(md, "layer", gpd, "layers", text="", icon="GREASEPENCIL")
+        row.prop(md, "inverse_layers", text="", icon="ARROW_LEFTRIGHT")
+        row = col.row(align=True)
+        row.prop(md, "passindex", text="Pass")
+        row.prop(md, "inverse_pass", text="", icon="ARROW_LEFTRIGHT")
+
+        layout.separator()
+        layout.prop(md, "strength", slider=True)
+
 classes = (
     DATA_PT_modifiers,
 )
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index a55478e693d..961c744bf88 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -51,6 +51,7 @@ struct GpencilColorModifierData;
 struct GpencilArrayModifierData;
 struct GpencilDupliModifierData;
 struct GpencilOpacityModifierData;
+struct GpencilLatticeModifierData;
 
 /* ------------ Grease-Pencil API ------------------ */
 
@@ -159,4 +160,8 @@ void ED_gpencil_array_modifier(int id, struct GpencilArrayModifierData *mmd, str
 void ED_gpencil_dupli_modifier(int id, struct GpencilDupliModifierData *mmd, struct bGPDlayer *gpl, struct bGPDframe *gpf);
 void ED_gpencil_opacity_modifier(int id, struct GpencilOpacityModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
 
+bool ED_gpencil_use_this_lattice(struct Object *ob, struct Object *lattice);
+void ED_gpencil_lattice_init(struct Object *ob);
+void ED_gpencil_lattice_modifier(int id, struct GpencilLatticeModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+
 #endif /*  __BKE_GPENCIL_H__ */
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 69087a57e7a..103b3dfdcd4 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -60,8 +60,10 @@
 #include "BKE_gpencil.h"
 #include "BKE_colortools.h"
 #include "BKE_library.h"
+#include "BKE_lattice.h"
 #include "BKE_main.h"
 #include "BKE_object.h"
+#include "BKE_modifier.h"
 
  /* used to save gpencil objects */
 typedef struct tGPencilStrokeCache {
@@ -2147,6 +2149,66 @@ void ED_gpencil_array_modifier(int UNUSED(id), GpencilArrayModifierData *mmd, Ob
 
 }
 
+/* verify if use this lattice */
+bool ED_gpencil_use_this_lattice(Object *ob, Object *UNUSED(lattice))
+{
+	ModifierData *md = modifiers_findByType(ob, eModifierType_GpencilLattice);
+	if (md) {
+		return true;
+	}
+#if 0
+	GpencilLatticeModifierData *mmd = NULL;
+	if (md) {
+		mmd = (GpencilLatticeModifierData *)md;
+		if (lattice == mmd->object) {
+			return true;
+		}
+	}
+#endif
+	return false;
+}
+
+/* init lattice deform data */
+void ED_gpencil_lattice_init(Object *ob)
+{
+	ModifierData *md = modifiers_findByType(ob, eModifierType_GpencilLattice);
+	if (md) {
+		GpencilLatticeModifierData *mmd = (GpencilLatticeModifierData *)md;
+		Object *latob = NULL;
+
+		latob = mmd->object;
+		if ((!latob) || (latob->type != OB_LATTICE)) {
+			return;
+		}
+		if (mmd->cache_data) {
+			end_latt_deform((LatticeDeformData *)mmd->cache_data);
+		}
+
+		/* init deform data */
+		mmd->cache_data = (LatticeDeformData *)init_latt_deform(latob, ob);
+	}
+}
+
+/* apply lattice to stroke */
+void ED_gpencil_lattice_modifier(int UNUSED(id), GpencilLatticeModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
+{
+	bGPDspoint *pt;
+
+	if (!is_stroke_affected_by_modifier(mmd->layername, mmd->passindex, 1, gpl, gps,
+		(int)mmd->flag & GP_LATTICE_INVERSE_LAYER, (int)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];
+		calc_latt_deform((LatticeDeformData *)mmd->cache_data, &pt->x, mmd->strength);
+	}
+}
+
 /* reset modifiers */
 void ED_gpencil_reset_modifiers(Object *ob)
 {
@@ -2208,6 +2270,10 @@ void ED_gpencil_stroke_modifiers(Object *ob, bGPDlayer *gpl, bGPDframe *gpf, bGP
 			case eModifierType_GpencilColor:
 				ED_gpencil_color_modifier(id, (GpencilColorModifierData *)md, gpl, gps);
 				break;
+				// Lattice
+			case eModifierType_GpencilLattice:
+				ED_gpencil_lattice_modifier(id, (GpencilLatticeModifierData *)md, gpl, gps);
+				break;
 			}
 		}
 		++id;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 98e59cca83e..6b018921249 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5469,6 +5469,10 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
 				}
 			}
 		}
+		else if (md->type == eModifierType_GpencilLattice) {
+			GpencilLatticeModifierData *gpmd = (GpencilLatticeModifierData*)md;
+			gpmd->cache_data = NULL;
+		}
 	}
 }
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 0b2f52a01db..1bcbc14ed31 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -29,6 +29,7 @@
 #include "BKE_global.h"
 #include "BKE_gpencil.h"
 #include "BKE_image.h"
+#include "BKE_lattice.h"
 
 #include "ED_gpencil.h"
 #include "ED_view3d.h"
@@ -591,11 +592,11 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat
 	ED_gpencil_parent_location(ob, gpd, gpl, viewmatrix);
 	copy_m4_m4(gpf->viewmatrix, viewmatrix);
 
-	/* reset modifiers */
+	/* initialization steps */
 	if ((cache->is_dirty) && (ob->modifiers.first) && (!is_edit)) {
 		ED_gpencil_reset_modifiers(ob);
 	}
-	
+
 	/* apply geometry modifiers */
 	if ((cache->is_dirty) && (ob->modifiers.first) && (!is_edit)) {
 		if (ED_gpencil_has_geometry_modifiers(ob)) {
@@ -780,15 +781,28 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache, GPENCIL_e_data *e_
 /* helper for populate a complete grease pencil datablock */
 void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene *scene, Object *ob, ToolSettings *ts, bGPdata *gpd)
 {
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	Object *obact = draw_ctx->obact;
 	bGPDframe *derived_gpf = NULL;
 	bool is_edit = (bool)(gpd->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE));
 
 	if (G.debug_value == 668) {
 		printf("DRW_gpencil_populate_datablock: %s\n", gpd->id.name);
 	}
-	
+	/* TODO: can be moved to desgraph? */
+	if ((obact) && (obact->type == OB_LATTICE) && (ob->modifiers.first)) {
+		if (ED_gpencil_use_this_lattice(ob, obact)) {
+			BKE_gpencil_batch_cache_dirty(gpd);
+		}
+	}
+
 	GpencilBatchCache *cache = gpencil_batch_cache_get(ob, CFRA);
 	cache->cache_idx = 0;
+
+	/* init general modifiers data */
+	if ((cache->is_dirty) && (ob->modifiers.first) && (!is_edit)) {
+		ED_gpencil_lattice_init(ob);
+	}
 	/* draw normal strokes */
 	for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
 		/* don't draw layer if hidden */
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 8fa56123186..e35c4d11705 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -95,6 +95,7 @@ typedef enum ModifierType {
 	eModifierType_GpencilDupli      = 59,
 	eModifierType_GpencilOpacity    = 60,
 	eModifierType_GpencilColor      = 61,
+	eModifierType_GpencilLattice    = 62,
 	NUM_MODIFIER_TYPES
 } ModifierType;
 
@@ -1759,6 +1760,22 @@ typedef enum eGpencilDupli_Flag {
 	GP_DUPLI_INVERSE_PASS  = (1 << 3),
 } eGpencilDupli_Flag;
 
+typedef struct GpencilLatticeModifierData {
+	ModifierData modifier;
+	struct Object *object;
+	char layername[64];          /* layer name */
+	int passindex;               /* custom index for passes */
+	int flag;                    /* flags */
+	float strength;
+	char pad[4];
+	void *cache_data; /* runtime only (LatticeDeformData) */
+} GpencilLatticeModifierData;
+
+typedef enum eGpencilLattice_Flag {
+	GP_LATTICE_INVERSE_LAYER = (1 << 0),
+	GP_LATTICE_INVERSE_PASS = (1 << 1),
+} eGpencilLattice_Flag;
+
 #define MOD_MESHSEQ_READ_ALL \
 	(MOD_MESHSEQ_READ_VERT | MOD_MESHSEQ_READ_POLY | MOD_MESHSEQ_READ_UV | MOD_MESHSEQ_READ_COLOR)
 
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index edc760252e0..32d57b439e0 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -620,6 +620,7 @@ extern StructRNA RNA_GpencilColorModifier;
 extern StructRNA RNA_GpencilArrayModifier;
 extern StructRNA RNA_GpencilDupliModifier;
 extern StructRNA RNA_GpencilOpacityModifier;
+extern StructRNA RNA_GpencilLatticeModifier;
 extern StructRNA RNA_TexMapping;
 extern StructRNA RNA_Text;
 extern StructRNA RNA_TextBox;
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 94f5882f328..b23437c3eaa 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -125,6 +125,7 @@ EnumPropertyItem rna_enum_object_modifier_type_items[] = {
 	{eModifierType_GpencilDupli, "GP_DUPLI", ICON_GROUP_VERTEX, "Duplication", "Create duplication of strokes" },
 	{eModifierType_GpencilNoise, "GP_NOISE", ICON_RNDCURVE, "Noise", "Add noise to strokes" },
 	{eModifierType_GpencilSubdiv, "GP_SUBDIV", ICON_MOD_SUBSURF, "Subdivide", "Subdivide stroke adding more control points to strokes" },
+	{eModifierType_GpencilLattice, "GP_LATTICE", ICON_MOD_LATT

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list