Commit: ef4c69a71594ceb42aac8e4d4cd0ed0523adb34f
Author: Antonio Vazquez
Date:   Sun Oct 1 18:54:30 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBef4c69a71594ceb42aac8e4d4cd0ed0523adb34f

Add curve options to Thick modifier

New options to adjust the thickness of the stroke using a curve to get more 
artistics effects.

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

M       release/scripts/startup/bl_ui/properties_data_modifier.py
M       source/blender/blenkernel/intern/gpencil_modifier.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/writefile.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/intern/MOD_gpencilthick.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py 
b/release/scripts/startup/bl_ui/properties_data_modifier.py
index db15f6d7e50..c34423ca8f3 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1635,6 +1635,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
         row.prop(md, "inverse_vertex", text="", icon="ARROW_LEFTRIGHT")
 
+        split = layout.split()
+        col = split.column()
+        col.prop(md, "use_custom_curve")
+
+        if md.use_custom_curve:
+            col.template_curve_mapping(md, "curve")
+
     def GP_TINT(self, layout, ob, md):
         gpd = ob.grease_pencil
         split = layout.split()
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c 
b/source/blender/blenkernel/intern/gpencil_modifier.c
index 81f599faef4..8973162965a 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -48,6 +48,7 @@
 #include "BKE_lattice.h"
 #include "BKE_gpencil.h"
 #include "BKE_modifier.h"
+#include "BKE_colortools.h"
 
 /* used to save temp strokes */
 typedef struct tGPencilStrokeCache {
@@ -387,6 +388,7 @@ void BKE_gpencil_thick_modifier(int UNUSED(id), 
GpencilThickModifierData *mmd, O
        bGPDspoint *pt;
        int vindex = get_vertex_group_index(ob, mmd->vgname);
        float weight = 1.0f;
+       float curvef = 1.0;
 
        if (!is_stroke_affected_by_modifier(mmd->layername, mmd->passindex, 3, 
gpl, gps,
                (bool)mmd->flag & GP_THICK_INVERSE_LAYER, (bool)mmd->flag & 
GP_THICK_INVERSE_PASS)) {
@@ -394,6 +396,7 @@ void BKE_gpencil_thick_modifier(int UNUSED(id), 
GpencilThickModifierData *mmd, O
        }
 
        for (int i = 0; i < gps->totpoints; ++i) {
+               curvef = 1.0;
                pt = &gps->points[i];
                /* verify vertex group */
                weight = is_point_affected_by_modifier(pt, (int)(!(mmd->flag & 
GP_THICK_INVERSE_VGROUP) == 0), vindex);
@@ -401,7 +404,13 @@ void BKE_gpencil_thick_modifier(int UNUSED(id), 
GpencilThickModifierData *mmd, O
                        continue;
                }
 
-               pt->pressure += mmd->thickness * weight;
+               if ((mmd->flag & GP_THICK_CUSTOM_CURVE) && 
(mmd->cur_thickness)) {
+                       /* nomalize value */
+                       float value = (float)i / (gps->totpoints - 1);
+                       curvef = curvemapping_evaluateF(mmd->cur_thickness, 0, 
value);
+               }
+
+               pt->pressure += mmd->thickness * weight * curvef;
                CLAMP(pt->strength, 0.0f, 1.0f);
        }
 
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index bca05b4437d..ada87b0aeb0 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5479,6 +5479,15 @@ static void direct_link_modifiers(FileData *fd, ListBase 
*lb)
                        GpencilLatticeModifierData *gpmd = 
(GpencilLatticeModifierData*)md;
                        gpmd->cache_data = NULL;
                }
+               else if (md->type == eModifierType_GpencilThick) {
+                       GpencilThickModifierData *gpmd = 
(GpencilThickModifierData *)md;
+
+                       gpmd->cur_thickness = newdataadr(fd, 
gpmd->cur_thickness);
+                       if (gpmd->cur_thickness) {
+                               direct_link_curvemapping(fd, 
gpmd->cur_thickness);
+                       }
+               }
+
        }
 }
 
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index c2e22a45ccd..d5a552a7577 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1731,6 +1731,13 @@ static void write_modifiers(WriteData *wd, ListBase 
*modbase)
 
                        writedata(wd, DATA, sizeof(int) * hmd->totindex, 
hmd->indexar);
                }
+               else if (md->type == eModifierType_GpencilThick) {
+                       GpencilThickModifierData *gpmd = 
(GpencilThickModifierData *)md;
+
+                       if (gpmd->cur_thickness) {
+                               write_curvemapping(wd, gpmd->cur_thickness);
+                       }
+               }
                else if (md->type == eModifierType_Cloth) {
                        ClothModifierData *clmd = (ClothModifierData *)md;
 
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index c04acaf989c..d6ce0ec690e 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1686,12 +1686,14 @@ typedef struct GpencilThickModifierData {
        int flag;                    /* flags */
        int thickness;               /* Thickness change */
        char pad[4];
+       struct CurveMapping *cur_thickness;
 } GpencilThickModifierData;
 
 typedef enum eGpencilThick_Flag {
        GP_THICK_INVERSE_LAYER  = (1 << 0),
        GP_THICK_INVERSE_PASS   = (1 << 1),
        GP_THICK_INVERSE_VGROUP = (1 << 2),
+       GP_THICK_CUSTOM_CURVE   = (1 << 3),
 } eGpencilThick_Flag;
 
 typedef struct GpencilTintModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c 
b/source/blender/makesrna/intern/rna_modifier.c
index 612fbdc8964..cb988ec5203 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -5074,6 +5074,16 @@ static void rna_def_modifier_gpencilthick(BlenderRNA 
*brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flag", 
GP_THICK_INVERSE_VGROUP);
        RNA_def_property_ui_text(prop, "Inverse VertexGroup", "Inverse filter");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "use_custom_curve", PROP_BOOLEAN, 
PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", 
GP_THICK_CUSTOM_CURVE);
+       RNA_def_property_ui_text(prop, "Custom Curve", "Use a custom curve to 
define thickness changes");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
+       RNA_def_property_pointer_sdna(prop, NULL, "cur_thickness");
+       RNA_def_property_ui_text(prop, "Curve", "Custom Thickness Curve");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_gpenciltint(BlenderRNA *brna)
diff --git a/source/blender/modifiers/intern/MOD_gpencilthick.c 
b/source/blender/modifiers/intern/MOD_gpencilthick.c
index 8376d062a79..69f39a76d39 100644
--- a/source/blender/modifiers/intern/MOD_gpencilthick.c
+++ b/source/blender/modifiers/intern/MOD_gpencilthick.c
@@ -35,8 +35,10 @@
 #include "DNA_gpencil_types.h"
 
 #include "BLI_utildefines.h"
+
 #include "BKE_DerivedMesh.h"
 #include "BKE_gpencil.h"
+#include "BKE_colortools.h"
 
 #include "MOD_modifiertypes.h"
 
@@ -47,13 +49,35 @@ static void initData(ModifierData *md)
        gpmd->thickness = 0;
        gpmd->layername[0] = '\0';
        gpmd->vgname[0] = '\0';
+       gpmd->cur_thickness = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
+       if (gpmd->cur_thickness) {
+               curvemapping_initialize(gpmd->cur_thickness);
+       }
 
        BKE_gpencil_batch_cache_alldirty();
 }
 
+static void freeData(ModifierData *md)
+{
+       GpencilThickModifierData *gpmd = (GpencilThickModifierData *)md;
+
+       if (gpmd->cur_thickness) {
+               curvemapping_free(gpmd->cur_thickness);
+       }
+}
+
 static void copyData(ModifierData *md, ModifierData *target)
 {
+       GpencilThickModifierData *gmd = (GpencilThickModifierData *)md;
+       GpencilThickModifierData *tgmd = (GpencilThickModifierData *)target;
+
+       if (tgmd->cur_thickness != NULL) {
+               curvemapping_free(tgmd->cur_thickness);
+       }
+
        modifier_copyData_generic(md, target);
+
+       tgmd->cur_thickness = curvemapping_copy(gmd->cur_thickness);
 }
 
 static DerivedMesh *applyModifier(
@@ -94,7 +118,7 @@ ModifierTypeInfo modifierType_GpencilThick = {
        /* applyModifierEM */   NULL,
        /* initData */          initData,
        /* requiredDataMask */  NULL,
-       /* freeData */          NULL,
+       /* freeData */          freeData,
        /* isDisabled */        NULL,
        /* updateDepsgraph */   NULL,
        /* dependsOnTime */     NULL,

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to