[Bf-blender-cvs] [592d356c4a3] temp-gpencil-bezier-stroke-type: GPencil: First phase to make Armature modifier for Bezier type

Antonio Vazquez noreply at git.blender.org
Tue Apr 6 15:52:03 CEST 2021


Commit: 592d356c4a35da756eb18b79baf8f93409eacacb
Author: Antonio Vazquez
Date:   Tue Apr 6 15:51:57 2021 +0200
Branches: temp-gpencil-bezier-stroke-type
https://developer.blender.org/rB592d356c4a35da756eb18b79baf8f93409eacacb

GPencil: First phase to make Armature modifier for Bezier type

Still not working because weights array is not loaded.

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

M	source/blender/blenkernel/intern/armature_deform.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c

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

diff --git a/source/blender/blenkernel/intern/armature_deform.c b/source/blender/blenkernel/intern/armature_deform.c
index 8711a001e32..439ad333175 100644
--- a/source/blender/blenkernel/intern/armature_deform.c
+++ b/source/blender/blenkernel/intern/armature_deform.c
@@ -49,6 +49,7 @@
 #include "BKE_armature.h"
 #include "BKE_deform.h"
 #include "BKE_editmesh.h"
+#include "BKE_gpencil.h"
 #include "BKE_lattice.h"
 
 #include "DEG_depsgraph_build.h"
@@ -483,6 +484,7 @@ static void armature_deform_coords_impl(const Object *ob_arm,
   bool use_dverts = false;
   int armature_def_nr;
   int cd_dvert_offset = -1;
+  MDeformVert *temp_dvert = NULL;
 
   /* in editmode, or not an armature */
   if (arm->edbo || (ob_arm->pose == NULL)) {
@@ -519,9 +521,20 @@ static void armature_deform_coords_impl(const Object *ob_arm,
       }
     }
     else if (ob_target->type == OB_GPENCIL) {
-      dverts = gps_target->dvert;
-      if (dverts) {
-        dverts_len = gps_target->totpoints;
+      if (GPENCIL_STROKE_TYPE_BEZIER(gps_target)) {
+        bGPDcurve *gpc = gps_target->editcurve;
+        dverts = gpc->dvert;
+        if (dverts) {
+          dverts_len = gpc->tot_curve_points * 3;
+          temp_dvert = MEM_mallocN(sizeof(MDeformVert) * dverts_len, __func__);
+          // TODO: Here we need copy the weights
+        }
+      }
+      else {
+        dverts = gps_target->dvert;
+        if (dverts) {
+          dverts_len = gps_target->totpoints;
+        }
       }
     }
   }
@@ -611,6 +624,14 @@ static void armature_deform_coords_impl(const Object *ob_arm,
   if (pchan_from_defbase) {
     MEM_freeN(pchan_from_defbase);
   }
+
+  if (temp_dvert) {
+    bGPDcurve *gpc = gps_target->editcurve;
+    for (int i = 0; i < gpc->tot_curve_points * 3; i++) {
+      MDeformVert *dvert = &temp_dvert[i];
+      BKE_gpencil_free_point_weights(dvert);
+    }
+  }
 }
 
 void BKE_armature_deform_coords_with_gpencil_stroke(const Object *ob_arm,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
index e665b9db3b6..1180e49d09f 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
@@ -77,7 +77,9 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
   BKE_gpencil_modifier_copydata_generic(md, target);
 }
 
-static void gpencil_deform_verts(ArmatureGpencilModifierData *mmd, Object *target, bGPDstroke *gps)
+static void gpencil_deform_polyline_verts(ArmatureGpencilModifierData *mmd,
+                                          Object *target,
+                                          bGPDstroke *gps)
 {
   bGPDspoint *pt = gps->points;
   float(*vert_coords)[3] = MEM_mallocN(sizeof(float[3]) * gps->totpoints, __func__);
@@ -110,6 +112,51 @@ static void gpencil_deform_verts(ArmatureGpencilModifierData *mmd, Object *targe
   MEM_freeN(vert_coords);
 }
 
+static void gpencil_deform_bezier_verts(ArmatureGpencilModifierData *mmd,
+                                        Object *target,
+                                        bGPDstroke *gps)
+{
+  bGPDcurve *gpc = gps->editcurve;
+  bGPDcurve_point *pt = gpc->curve_points;
+  const int totpoints = gpc->tot_curve_points * 3;
+  float(*vert_coords)[3] = MEM_mallocN(sizeof(float[3]) * totpoints, __func__);
+  int i;
+
+  BKE_gpencil_dvert_ensure(gps);
+
+  /* prepare array of points */
+  for (i = 0; i < gpc->tot_curve_points; i++, pt++) {
+    BezTriple *bezt = &pt->bezt;
+    int idx = i * 3;
+    copy_v3_v3(vert_coords[idx], bezt->vec[0]);
+    copy_v3_v3(vert_coords[idx + 1], bezt->vec[1]);
+    copy_v3_v3(vert_coords[idx + 2], bezt->vec[2]);
+  }
+
+  /* deform verts */
+  BKE_armature_deform_coords_with_gpencil_stroke(mmd->object,
+                                                 target,
+                                                 vert_coords,
+                                                 NULL,
+                                                 totpoints,
+                                                 mmd->deformflag,
+                                                 mmd->vert_coords_prev,
+                                                 mmd->vgname,
+                                                 gps);
+
+  /* Apply deformed coordinates */
+  pt = gpc->curve_points;
+  for (i = 0; i < gpc->tot_curve_points; i++, pt++) {
+    BezTriple *bezt = &pt->bezt;
+    int idx = i * 3;
+    copy_v3_v3(bezt->vec[0], vert_coords[idx]);
+    copy_v3_v3(bezt->vec[1], vert_coords[idx + 1]);
+    copy_v3_v3(bezt->vec[2], vert_coords[idx + 2]);
+  }
+
+  MEM_freeN(vert_coords);
+}
+
 /* deform stroke */
 static void deformPolyline(GpencilModifierData *md,
                            Depsgraph *UNUSED(depsgraph),
@@ -124,8 +171,27 @@ static void deformPolyline(GpencilModifierData *md,
   }
   bGPdata *gpd = ob->data;
 
-  gpencil_deform_verts(mmd, ob, gps);
+  gpencil_deform_polyline_verts(mmd, ob, gps);
+  /* Calc geometry data. */
+  BKE_gpencil_stroke_geometry_update(gpd, gps);
+}
+
+static void deformBezier(GpencilModifierData *md,
+                         Depsgraph *UNUSED(depsgraph),
+                         Object *ob,
+                         bGPDlayer *UNUSED(gpl),
+                         bGPDframe *UNUSED(gpf),
+                         bGPDstroke *gps)
+{
+  ArmatureGpencilModifierData *mmd = (ArmatureGpencilModifierData *)md;
+  if (!mmd->object) {
+    return;
+  }
+  bGPdata *gpd = ob->data;
+
+  gpencil_deform_bezier_verts(mmd, ob, gps);
   /* Calc geometry data. */
+  gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
   BKE_gpencil_stroke_geometry_update(gpd, gps);
 }
 
@@ -237,7 +303,7 @@ GpencilModifierTypeInfo modifierType_Gpencil_Armature = {
     /* copyData */ copyData,
 
     /* deformPolyline */ deformPolyline,
-    /* deformBezier */ NULL,
+    /* deformBezier */ deformBezier,
     /* generateStrokes */ NULL,
     /* bakeModifier */ bakeModifier,
     /* remapTime */ NULL,



More information about the Bf-blender-cvs mailing list