[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