[Bf-blender-cvs] [b424845bb5e] greasepencil-object: New subdivide stroke modifier
Antonio Vazquez
noreply at git.blender.org
Sun Jul 16 17:43:30 CEST 2017
Commit: b424845bb5ef450b8b73de5ae2327221ea8427a8
Author: Antonio Vazquez
Date: Sun Jul 16 17:40:29 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBb424845bb5ef450b8b73de5ae2327221ea8427a8
New subdivide stroke modifier
This modifier add intermediary points to stroke to get more control points for other modifiers as Noise.
This is not a subsurf modifier. This will be a different one.
===================================================================
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/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_gpencilsubdiv.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 169ec07c6b3..011c7a4fdb7 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1549,6 +1549,19 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
row.prop(md, "affect_strength", text="Strength", icon='COLOR', toggle=True)
row.prop(md, "affect_thickness", text="Thickness", icon='LINE_DATA', toggle=True)
+ def GP_SUBDIV(self, layout, ob, md):
+ gpd = ob.grease_pencil
+ split = layout.split()
+
+ col = split.column()
+ row = col.row(align=True)
+ row.prop(md, "level")
+ col.prop(md, "passindex", text="Pass")
+
+ col = split.column()
+ col.label("Layer:")
+ col.prop_search(md, "layer", gpd, "layers", text="", icon="GREASEPENCIL")
+
classes = (
DATA_PT_modifiers,
)
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index e0e2da5dd8b..958ae44fead 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -44,6 +44,7 @@ struct PaletteColor;
struct BoundBox;
struct Object;
struct GpencilNoiseModifierData;
+struct GpencilSubdivModifierData;
/* ------------ Grease-Pencil API ------------------ */
@@ -135,5 +136,6 @@ struct BoundBox *BKE_gpencil_boundbox_get(struct Object *ob);
/* modifiers */
void ED_gpencil_stroke_modifiers(struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
void ED_gpencil_noise_modifier(struct GpencilNoiseModifierData *mmd, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+void ED_gpencil_subdiv_modifier(struct GpencilSubdivModifierData *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 391debf63d3..ce13e385114 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1640,6 +1640,73 @@ void ED_gpencil_noise_modifier(GpencilNoiseModifierData *mmd, bGPDlayer *gpl, bG
}
}
+/* subdivide stroke to get more control points */
+void ED_gpencil_subdiv_modifier(GpencilSubdivModifierData *mmd, bGPDlayer *gpl, bGPDstroke *gps)
+{
+ bGPDspoint *temp_points;
+ int totnewpoints, oldtotpoints;
+ int i2;
+
+ if (gps->totpoints < 2) {
+ return;
+ }
+ /* omit if filter by layer */
+ if (mmd->layername[0] != '\0') {
+ if (!STREQ(mmd->layername, gpl->info)) {
+ return;
+ }
+ }
+ /* verify pass */
+ if (gps->palcolor->index != mmd->passindex) {
+ return;
+ }
+
+ /* loop as many times as levels */
+ for (int s = 0; s < mmd->level; s++) {
+ totnewpoints = gps->totpoints - 1;
+ /* duplicate points in a temp area */
+ temp_points = MEM_dupallocN(gps->points);
+ oldtotpoints = gps->totpoints;
+
+ /* resize the points arrys */
+ gps->totpoints += totnewpoints;
+ gps->points = MEM_recallocN(gps->points, sizeof(*gps->points) * gps->totpoints);
+ gps->flag |= GP_STROKE_RECALC_CACHES;
+
+ /* move points from last to first to new place */
+ i2 = gps->totpoints - 1;
+ for (int i = oldtotpoints - 1; i > 0; i--) {
+ bGPDspoint *pt = &temp_points[i];
+ bGPDspoint *pt_final = &gps->points[i2];
+
+ copy_v3_v3(&pt_final->x, &pt->x);
+ pt_final->pressure = pt->pressure;
+ pt_final->strength = pt->strength;
+ pt_final->time = pt->time;
+ pt_final->flag = pt->flag;
+ i2 -= 2;
+ }
+ /* interpolate mid points */
+ i2 = 1;
+ for (int i = 0; i < oldtotpoints - 1; i++) {
+ bGPDspoint *pt = &temp_points[i];
+ bGPDspoint *next = &temp_points[i + 1];
+ bGPDspoint *pt_final = &gps->points[i2];
+
+ /* add a half way point */
+ interp_v3_v3v3(&pt_final->x, &pt->x, &next->x, 0.5f);
+ pt_final->pressure = interpf(pt->pressure, next->pressure, 0.5f);
+ pt_final->strength = interpf(pt->strength, next->strength, 0.5f);
+ CLAMP(pt_final->strength, GPENCIL_STRENGTH_MIN, 1.0f);
+ pt_final->time = interpf(pt->time, next->time, 0.5f);
+ i2 += 2;
+ }
+
+ /* free temp memory */
+ MEM_SAFE_FREE(temp_points);
+ }
+}
+
/* apply stroke modifiers */
void ED_gpencil_stroke_modifiers(Object *ob, bGPDlayer *gpl, bGPDstroke *gps)
{
@@ -1649,10 +1716,14 @@ void ED_gpencil_stroke_modifiers(Object *ob, bGPDlayer *gpl, bGPDstroke *gps)
if (((md->mode & eModifierMode_Realtime) && ((G.f & G_RENDER_OGL) == 0)) ||
((md->mode & eModifierMode_Render) && (G.f & G_RENDER_OGL))) {
switch (md->type) {
- // Noise Modifier
+ // Noise Modifier
case eModifierType_GpencilNoise:
ED_gpencil_noise_modifier((GpencilNoiseModifierData *)md, gpl, gps);
break;
+ // Noise Modifier
+ case eModifierType_GpencilSubdiv:
+ ED_gpencil_subdiv_modifier((GpencilSubdivModifierData *)md, gpl, gps);
+ break;
default:
break;
}
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index cf17bd38220..b44eb1a79d0 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -88,6 +88,7 @@ typedef enum ModifierType {
eModifierType_MeshSequenceCache = 52,
eModifierType_SurfaceDeform = 53,
eModifierType_GpencilNoise = 54,
+ eModifierType_GpencilSubdiv = 55,
NUM_MODIFIER_TYPES
} ModifierType;
@@ -1622,12 +1623,22 @@ typedef struct GpencilNoiseModifierData {
char pad[4];
} GpencilNoiseModifierData;
-typedef enum eGpencilNoise_Flag {
+typedef enum eGpencilSubdiv_Flag {
GP_NOISE_USE_RANDOM = (1 << 0),
GP_NOISE_MOD_LOCATION = (1 << 1),
GP_NOISE_MOD_STRENGTH = (1 << 2),
GP_NOISE_MOD_THICKNESS = (1 << 3),
-} eGpencilNoise_Flag;
+} eGpencilSubdiv_Flag;
+
+
+typedef struct GpencilSubdivModifierData {
+ ModifierData modifier;
+ char layername[64]; /* layer name */
+ int passindex; /* custom index for passes */
+ int flag; /* flags */
+ int level; /* factor of subdivision */
+ char pad[4];
+} GpencilSubdivModifierData;
#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 fe4343de58b..2af0b827248 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -613,6 +613,7 @@ extern StructRNA RNA_SurfaceCurve;
extern StructRNA RNA_SurfaceDeformModifier;
extern StructRNA RNA_SurfaceModifier;
extern StructRNA RNA_GpencilNoiseModifier;
+extern StructRNA RNA_GpencilSubdivModifier;
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 4eb1ad1c611..a2dd7e0fbec 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -122,6 +122,7 @@ EnumPropertyItem rna_enum_object_modifier_type_items[] = {
{eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
{0, "", 0, N_("Grease Pencil"), "" },
{eModifierType_GpencilNoise, "GP_NOISE", ICON_RNDCURVE, "Noise", "Add noise to strokes" },
+ {eModifierType_GpencilSubdiv, "GP_SUBDIV", ICON_PARTICLE_POINT, "Subdivide", "Add more control points to strokes" },
{0, NULL, 0, NULL, NULL}
};
@@ -418,7 +419,9 @@ static StructRNA *rna_Modifier_refine(struct PointerRNA *ptr)
return &RNA_SurfaceDeformModifier;
case eModifierType_GpencilNoise:
return &RNA_GpencilNoiseModifier;
- /* Default */
+ case eModifierType_GpencilSubdiv:
+ return &RNA_GpencilSubdivModifier;
+ /* Default */
case eModifierType_None:
case eModifierType_ShapeKey:
case NUM_MODIFIER_TYPES:
@@ -4779,7 +4782,7 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Layer", "Layer name");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_TIME);
+ prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "factor");
RNA_def_property_range(prop, 0, 30.0);
RNA_def_property_ui_text(prop, "Factor", "Amount of noise to apply");
@@ -4812,6 +4815,34 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
+static void rna_def_modifier_gpencilsubdiv(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "GpencilSubdivModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "Subdivision Modifier", "Subdivide Stroke modifier");
+ RNA_def_struct_sdna(srna, "GpencilSubdivModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_PARTICLE_POINT);
+
+ prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "layername");
+ RNA_def_property_ui_text(prop, "Layer", "Layer name");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop = RNA_def_property(srna, "level", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "level");
+ RNA_def_property_range(prop, 1, 5);
+ RNA_def_property_ui_text(prop, "Level", "Number of subdivisions");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop = RNA_def_property(srna, "passindex", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "passindex");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Pass index");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+}
+
void RNA_def_modifier(BlenderRNA *brna)
{
StructRNA *srna;
@@ -4931,6 +4962,7 @@ void RNA_def_modifier(BlenderRNA *brna)
rna_def_modifier_meshseqcache(brna);
rna_def_modifier_surfacedeform(brna);
rna_def_modifier_gpencilnoise(brna);
+ rna_def_modifier_gpencilsubdiv(brna);
}
#endif
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index b189ea77c2d..c83d112ede2 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list