[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