Commit: b05b0900d3d9faf2d486818466d8fd62b7bebbe6
Author: Joshua Leung
Date:   Tue Oct 31 17:06:56 2017 +1300
Branches: greasepencil-object
https://developer.blender.org/rBb05b0900d3d9faf2d486818466d8fd62b7bebbe6

GP Modifiers: Fully ported Noise modifier over to new system

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

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

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h 
b/source/blender/blenkernel/BKE_gpencil.h
index 955782d9a62..23968b8d16a 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -200,7 +200,7 @@ void BKE_gpencil_stroke_modifiers(struct Object *ob, struct 
bGPDlayer *gpl, stru
 void BKE_gpencil_geometry_modifiers(struct Object *ob, struct bGPDlayer *gpl, 
struct bGPDframe *gpf);
 
 void BKE_gpencil_stroke_normal(const struct bGPDstroke *gps, float 
r_normal[3]);
-void BKE_gpencil_noise_modifier(int id, struct GpencilNoiseModifierData *mmd, 
struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
+
 void BKE_gpencil_subdiv_modifier(int id, struct GpencilSubdivModifierData 
*mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
 void BKE_gpencil_simplify_modifier(int id, struct GpencilSimplifyModifierData 
*mmd, struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
 void BKE_gpencil_thick_modifier(int id, struct GpencilThickModifierData *mmd, 
struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c 
b/source/blender/blenkernel/intern/gpencil_modifier.c
index 8ed484f6478..cb70a8212bc 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -51,6 +51,8 @@
 #include "BKE_modifier.h"
 #include "BKE_object.h"
  
+#include "DEG_depsgraph.h"
+ 
 // XXX: temp transitional code
 #include "../../modifiers/intern/MOD_gpencil_util.h"
 
@@ -96,133 +98,6 @@ void BKE_gpencil_stroke_normal(const bGPDstroke *gps, float 
r_normal[3])
        normalize_v3(r_normal);
 }
 
-/* calculate a noise base on stroke direction */
-void BKE_gpencil_noise_modifier(
-        int UNUSED(id), GpencilNoiseModifierData *mmd, Object *ob, bGPDlayer 
*gpl, bGPDstroke *gps)
-{
-       bGPDspoint *pt0, *pt1;
-       float shift, vran, vdir;
-       float normal[3];
-       float vec1[3], vec2[3];
-       Scene *scene = NULL;
-       int sc_frame = 0;
-       int sc_diff = 0;
-       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_NOISE_INVERSE_LAYER, mmd->flag & 
GP_NOISE_INVERSE_PASS))
-       {
-               return;
-       }
-
-       scene = mmd->modifier.scene;
-       sc_frame = (scene) ? CFRA : 0;
-
-       zero_v3(vec2);
-
-       /* calculate stroke normal*/
-       BKE_gpencil_stroke_normal(gps, normal);
-
-       /* move points */
-       for (int i = 0; i < gps->totpoints; i++) {
-               if (((i == 0) || (i == gps->totpoints - 1)) && ((mmd->flag & 
GP_NOISE_MOVE_EXTREME) == 0)) {
-                       continue;
-               }
-
-               /* last point is special */
-               if (i == gps->totpoints) {
-                       pt0 = &gps->points[i - 2];
-                       pt1 = &gps->points[i - 1];
-               }
-               else {
-                       pt0 = &gps->points[i - 1];
-                       pt1 = &gps->points[i];
-               }
-               /* verify vertex group */
-               weight = is_point_affected_by_modifier(pt0, (int)(!(mmd->flag & 
GP_NOISE_INVERSE_VGROUP) == 0), vindex);
-               if (weight < 0) {
-                       continue;
-               }
-
-               /* initial vector (p0 -> p1) */
-               sub_v3_v3v3(vec1, &pt1->x, &pt0->x);
-               vran = len_v3(vec1);
-               /* vector orthogonal to normal */
-               cross_v3_v3v3(vec2, vec1, normal);
-               normalize_v3(vec2);
-               /* use random noise */
-               if (mmd->flag & GP_NOISE_USE_RANDOM) {
-                       sc_diff = abs(mmd->scene_frame - sc_frame);
-                       /* only recalc if the gp frame change or the number of 
scene frames is bigger than step */
-                       if ((!gpl->actframe) || (mmd->gp_frame != 
gpl->actframe->framenum) || 
-                           (sc_diff >= mmd->step))
-                       {
-                               vran = mmd->vrand1 = BLI_frand();
-                               vdir = mmd->vrand2 = BLI_frand();
-                               mmd->gp_frame = gpl->actframe->framenum;
-                               mmd->scene_frame = sc_frame;
-                       }
-                       else {
-                               vran = mmd->vrand1;
-                               if (mmd->flag & GP_NOISE_FULL_STROKE) {
-                                       vdir = mmd->vrand2;
-                               }
-                               else {
-                                       int f = (mmd->vrand2 * 10.0f) + i;
-                                       vdir = f % 2;
-                               }
-                       }
-               }
-               else {
-                       vran = 1.0f;
-                       if (mmd->flag & GP_NOISE_FULL_STROKE) {
-                               vdir = gps->totpoints % 2;
-                       }
-                       else {
-                               vdir = i % 2;
-                       }
-                       mmd->gp_frame = -999999;
-               }
-
-               /* apply randomness to location of the point */
-               if (mmd->flag & GP_NOISE_MOD_LOCATION) {
-                       /* factor is too sensitive, so need divide */
-                       shift = (vran * mmd->factor / 10.0f) * weight;
-                       if (vdir > 0.5f) {
-                               mul_v3_fl(vec2, shift);
-                       }
-                       else {
-                               mul_v3_fl(vec2, shift * -1.0f);
-                       }
-                       add_v3_v3(&pt1->x, vec2);
-               }
-
-               /* apply randomness to thickness */
-               if (mmd->flag & GP_NOISE_MOD_THICKNESS) {
-                       if (vdir > 0.5f) {
-                               pt1->pressure -= pt1->pressure * vran * 
mmd->factor;
-                       }
-                       else {
-                               pt1->pressure += pt1->pressure * vran * 
mmd->factor;
-                       }
-                       CLAMP_MIN(pt1->pressure, GPENCIL_STRENGTH_MIN);
-               }
-
-               /* apply randomness to color strength */
-               if (mmd->flag & GP_NOISE_MOD_STRENGTH) {
-                       if (vdir > 0.5f) {
-                               pt1->strength -= pt1->strength * vran * 
mmd->factor;
-                       }
-                       else {
-                               pt1->strength += pt1->strength * vran * 
mmd->factor;
-                       }
-                       CLAMP_MIN(pt1->strength, GPENCIL_STRENGTH_MIN);
-               }
-       }
-}
-
 /* subdivide stroke to get more control points */
 void BKE_gpencil_subdiv_modifier(
         int UNUSED(id), GpencilSubdivModifierData *mmd, Object *UNUSED(ob), 
bGPDlayer *gpl, bGPDstroke *gps)
@@ -908,16 +783,19 @@ void BKE_gpencil_stroke_modifiers(Object *ob, bGPDlayer 
*gpl, bGPDframe *UNUSED(
                if (((md->mode & eModifierMode_Realtime) && ((G.f & 
G_RENDER_OGL) == 0)) ||
                    ((md->mode & eModifierMode_Render) && (G.f & G_RENDER_OGL)))
                {
-
+                       const ModifierTypeInfo *mti = 
modifierType_getInfo(md->type);
+                       
                        if (((md->mode & eModifierMode_Editmode) == 0) && 
(is_edit)) {
                                continue;
                        }
+                       
+                       if (mti->deformStroke) {
+                               EvaluationContext eval_ctx = {0}; /* XXX */
+                               mti->deformStroke(md, &eval_ctx, ob, gpl, gps);
+                       }
 
+                       // XXX: The following lines need to all be converted to 
modifier callbacks...
                        switch (md->type) {
-                               // Noise Modifier
-                               case eModifierType_GpencilNoise:
-                                       BKE_gpencil_noise_modifier(id, 
(GpencilNoiseModifierData *)md, ob, gpl, gps);
-                                       break;
                                        // Subdiv Modifier
                                case eModifierType_GpencilSubdiv:
                                        BKE_gpencil_subdiv_modifier(id, 
(GpencilSubdivModifierData *)md, ob, gpl, gps);
diff --git a/source/blender/modifiers/intern/MOD_gpencilnoise.c 
b/source/blender/modifiers/intern/MOD_gpencilnoise.c
index a88f6c398c6..4638ab29635 100644
--- a/source/blender/modifiers/intern/MOD_gpencilnoise.c
+++ b/source/blender/modifiers/intern/MOD_gpencilnoise.c
@@ -30,18 +30,27 @@
 
 #include <stdio.h>
 
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+#include "BLI_math_vector.h"
+#include "BLI_rand.h"
+
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
 #include "DNA_gpencil_types.h"
-
-#include "BLI_utildefines.h"
+#include "DNA_modifier_types.h"
 
 #include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_deform.h"
 #include "BKE_gpencil.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
 
 #include "DEG_depsgraph.h"
 
 #include "MOD_modifiertypes.h"
+#include "MOD_gpencil_util.h"
 
 static void initData(ModifierData *md)
 {
@@ -65,19 +74,150 @@ static void copyData(ModifierData *md, ModifierData 
*target)
        modifier_copyData_generic(md, target);
 }
 
-static void bakeModifierGP(const bContext *C, const EvaluationContext 
*UNUSED(eval_ctx),
-                           ModifierData *md, Object *ob)
+static bool dependsOnTime(ModifierData *md)
 {
-       bGPdata *gpd;
-       if ((!ob) || (!ob->data)) {
+       GpencilNoiseModifierData *mmd = (GpencilNoiseModifierData *)md;
+       return (mmd->flag & GP_NOISE_USE_RANDOM) != 0;
+}
+
+/* aply noise effect based on stroke direction */
+static void deformStroke(ModifierData *md, const EvaluationContext 
*UNUSED(eval_ctx),
+                         Object *ob, bGPDlayer *gpl, bGPDstroke *gps)
+{
+       GpencilNoiseModifierData *mmd = (GpencilNoiseModifierData *)md;
+       bGPDspoint *pt0, *pt1;
+       float shift, vran, vdir;
+       float normal[3];
+       float vec1[3], vec2[3];
+       Scene *scene = NULL;
+       int sc_frame = 0;
+       int sc_diff = 0;
+       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_NOISE_INVERSE_LAYER, mmd->flag & 
GP_NOISE_INVERSE_PASS))
+       {
                return;
        }
-       gpd = ob->data;
+
+       scene = mmd->modifier.scene;
+       sc_frame = (scene) ? CFRA : 0;
+
+       zero_v3(vec2);
+
+       /* calculate stroke normal*/
+       BKE_gpencil_stroke_normal(gps, normal);
+
+       /* move points */
+       for (int i = 0; i < gps->totpoints; i++) {
+               if (((i == 0) || (i == gps->totpoints - 1)) && ((mmd->flag & 
GP_NOISE_MOVE_EXTREME) == 0)) {
+                       continue;
+               }
+
+               /* last point is special */
+               if (i == gps->totpoints) {
+                       pt0 = &gps->points[i - 2];
+                       pt1 = &gps->points[i - 1];
+               }
+               else {
+                       pt0 = &gps->points[i - 1];
+                       pt1 = &gps->points[i];
+               }
+
+               /* verify vertex group */
+               weight = is_point_affected_by_modifier(pt0, (int)(!(mmd->flag & 
GP_NOISE_INVERSE_VGROUP) == 0), vindex);
+               if (weight < 0) {
+                       continue;
+               }
+
+               /* initial vector (p0 -> p1) */
+               sub_v3_v3v3(vec1, &pt1->x, &pt0->x);
+               vran = len_v3(vec1);
+               /* vector orthogonal to normal */
+               cross_v3_v3v3(vec2, vec1, normal);
+               normalize_v3(vec2);
+               /* use random noise */
+               if (mmd->flag & GP_NOISE_USE_RANDOM) {
+                       sc_diff = abs(mmd->scene_frame - sc_frame);
+                       /* only recalc if the gp frame change or the number of 
scene frames is bigger than step */
+                       if ((!gpl->actframe) || (mmd->gp_frame != 
gpl->actframe->framenum) || 
+                           (sc_diff >= mmd->step))
+                       {
+                               vran = mmd->vrand1 = BLI_frand();
+                               vdir = mmd->vrand2 = BLI_frand();
+                               mmd->gp_frame = gpl->actframe->framenum;
+                               mmd->scene_frame = sc_frame;
+                       }
+                       else {
+                               vran = mmd->vrand1;
+                               if (mmd->flag & GP_NOISE_FULL_STROKE) {
+                                       vdir = mmd->vrand2;
+                               }
+                               else {
+                                       int f = (mmd->vrand2 * 10.0f) + i;
+                                       vdir = f % 2;
+                               }
+                       }
+               }
+               else {
+                       vran = 1.0f;
+                       if (mmd->flag & GP_NOISE_FULL_STROKE) {
+                               vdir = gps->totpoints % 2;
+                       }
+                       else {
+                               vdir = i % 2;
+                       }
+                       mmd->gp_frame = -999999;
+               }
+
+               /* apply randomness to location of the point */
+               if (mmd->flag & GP_NOISE_MOD_LOCATION) {
+

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to