[Bf-blender-cvs] [ccda31aa482] greasepencil-object: Redo Armature modifier using standard modules

Antonioya noreply at git.blender.org
Sun Aug 26 19:41:54 CEST 2018


Commit: ccda31aa4829a50c42225e5d07951fbbf3844f8d
Author: Antonioya
Date:   Sun Aug 26 19:39:56 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rBccda31aa4829a50c42225e5d07951fbbf3844f8d

Redo Armature modifier using standard modules

Now the armature modifier is using the same functions used in Mesh and Lattice armatures and share the same parameters.

This makes the code easy to maintain.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenkernel/BKE_lattice.h
M	source/blender/blenkernel/intern/armature.c
M	source/blender/editors/gpencil/gpencil_armature.c
M	source/blender/editors/object/object_relations.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
M	source/blender/makesdna/DNA_gpencil_modifier_types.h
M	source/blender/makesrna/intern/rna_gpencil_modifier.c
M	source/blender/modifiers/intern/MOD_armature.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 03e1d3fe1f7..fe89feb5fc1 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -2037,9 +2037,27 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
         row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
 
     def GP_ARMATURE(self, layout, ob, md):
-        col = layout.column()
+        split = layout.split()
+
+        col = split.column()
         col.label(text="Object:")
         col.prop(md, "object", text="")
+        col.prop(md, "use_deform_preserve_volume")
+
+        col = split.column()
+        col.label(text="Bind To:")
+        col.prop(md, "use_vertex_groups", text="Vertex Groups")
+        col.prop(md, "use_bone_envelopes", text="Bone Envelopes")
+
+        layout.separator()
+
+        split = layout.split()
+
+        row = split.row(align=True)
+        row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        sub = row.row(align=True)
+        sub.active = bool(md.vertex_group)
+        sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
 
 
 classes = (
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index e98839e3dbc..2ca6a35eec5 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -44,6 +44,7 @@ struct Scene;
 struct BPoint;
 struct MDeformVert;
 struct Depsgraph;
+struct bGPDstroke;
 
 void BKE_lattice_resize(struct Lattice *lt, int u, int v, int w, struct Object *ltOb);
 void BKE_lattice_init(struct Lattice *lt);
@@ -73,7 +74,8 @@ void lattice_deform_verts(struct Object *laOb, struct Object *target,
 void armature_deform_verts(struct Object *armOb, struct Object *target,
                            const struct Mesh *mesh, float (*vertexCos)[3],
                            float (*defMats)[3][3], int numVerts, int deformflag,
-                           float (*prevCos)[3], const char *defgrp_name);
+                           float (*prevCos)[3], const char *defgrp_name,
+						   struct bGPDstroke *gps);
 
 float (*BKE_lattice_vertexcos_get(struct Object *ob, int *r_numVerts))[3];
 void    BKE_lattice_vertexcos_apply(struct Object *ob, float (*vertexCos)[3]);
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 9174038dfbb..1936195a0a5 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -47,6 +47,7 @@
 #include "DNA_anim_types.h"
 #include "DNA_armature_types.h"
 #include "DNA_constraint_types.h"
+#include "DNA_gpencil_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_lattice_types.h"
 #include "DNA_listBase.h"
@@ -971,7 +972,7 @@ static void armature_bbone_defmats_cb(void *userdata, Link *iter, int index)
 
 void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, float (*vertexCos)[3],
                            float (*defMats)[3][3], int numVerts, int deformflag,
-                           float (*prevCos)[3], const char *defgrp_name)
+                           float (*prevCos)[3], const char *defgrp_name, bGPDstroke *gps)
 {
 	bPoseChanDeform *pdef_info_array;
 	bPoseChanDeform *pdef_info = NULL;
@@ -1025,7 +1026,7 @@ void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, flo
 	/* get the def_nr for the overall armature vertex group if present */
 	armature_def_nr = defgroup_name_index(target, defgrp_name);
 
-	if (ELEM(target->type, OB_MESH, OB_LATTICE)) {
+	if (ELEM(target->type, OB_MESH, OB_LATTICE, OB_GPENCIL)) {
 		defbase_tot = BLI_listbase_count(&target->defbase);
 
 		if (target->type == OB_MESH) {
@@ -1034,17 +1035,22 @@ void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, flo
 			if (dverts)
 				target_totvert = me->totvert;
 		}
-		else {
+		else if (target->type == OB_LATTICE) {
 			Lattice *lt = target->data;
 			dverts = lt->dvert;
 			if (dverts)
 				target_totvert = lt->pntsu * lt->pntsv * lt->pntsw;
 		}
+		else if (target->type == OB_GPENCIL) {
+			dverts = gps->dvert;
+			if (dverts)
+				target_totvert = gps->totpoints;
+		}
 	}
 
 	/* get a vertex-deform-index to posechannel array */
 	if (deformflag & ARM_DEF_VGROUP) {
-		if (ELEM(target->type, OB_MESH, OB_LATTICE)) {
+		if (ELEM(target->type, OB_MESH, OB_LATTICE, OB_GPENCIL)) {
 			/* if we have a Mesh, only use dverts if it has them */
 			if (mesh) {
 				use_dverts = (mesh->dvert != NULL);
diff --git a/source/blender/editors/gpencil/gpencil_armature.c b/source/blender/editors/gpencil/gpencil_armature.c
index dfe36a65d68..548bb6767a6 100644
--- a/source/blender/editors/gpencil/gpencil_armature.c
+++ b/source/blender/editors/gpencil/gpencil_armature.c
@@ -381,6 +381,8 @@ static void gpencil_add_verts_to_dgroups(
 					if (ED_gpencil_stroke_can_use(C, gps) == false)
 						continue;
 
+					BKE_gpencil_dvert_ensure(gps);
+
 					/* create verts array */
 					verts = MEM_callocN(gps->totpoints * sizeof(*verts), __func__);
 
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index a966b5c3d99..5b9a9f97bfe 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -799,14 +799,11 @@ bool ED_object_parent_set(ReportList *reports, const bContext *C, Scene *scene,
 				invert_m4_m4(ob->parentinv, workob.obmat);
 			}
 			else if (pararm && (ob->type == OB_GPENCIL) && (par->type == OB_ARMATURE)) {
-				if (partype == PAR_ARMATURE_NAME) {
+				if ((partype == PAR_ARMATURE_NAME) ||
+					(partype == PAR_ARMATURE_ENVELOPE))
+				{
 					ED_gpencil_add_armature_weights(C, reports, ob, par, GP_PAR_ARMATURE_NAME);
 				}
-				else if (partype == PAR_ARMATURE_ENVELOPE) {
-					BKE_report(reports, RPT_ERROR,
-						"Envelop mode not supported for grease pencil objects");
-					return false;
-				}
 				else if (partype == PAR_ARMATURE_AUTO) {
 					WM_cursor_wait(1);
 					ED_gpencil_add_armature_weights(C, reports, ob, par, GP_PAR_ARMATURE_AUTO);
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
index 18b22a06c23..71fe3b73c82 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
@@ -43,18 +43,14 @@
 #include "BLI_task.h"
 #include "BLI_utildefines.h"
 
-#include "BKE_action.h"
-#include "BKE_armature.h"
+#include "BKE_lattice.h"
 #include "BKE_context.h"
-#include "BKE_colortools.h"
-#include "BKE_deform.h"
 #include "BKE_gpencil.h"
 #include "BKE_gpencil_modifier.h"
 #include "BKE_modifier.h"
 #include "BKE_library_query.h"
 #include "BKE_scene.h"
 #include "BKE_main.h"
-#include "BKE_layer.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -65,21 +61,11 @@
 #include "DEG_depsgraph_build.h"
 #include "DEG_depsgraph_query.h"
 
-typedef struct bPoseChanDeform {
-	Mat4     *b_bone_mats;
-	DualQuat *dual_quat;
-	DualQuat *b_bone_dual_quats;
-} bPoseChanDeform;
-
-typedef struct GpArmatureBBoneDefmatsData {
-	bPoseChanDeform *pdef_info_array;
-	DualQuat *dualquats;
-} GpArmatureBBoneDefmatsData;
-
 static void initData(GpencilModifierData *md)
 {
 	ArmatureGpencilModifierData *gpmd = (ArmatureGpencilModifierData *)md;
 	gpmd->object = NULL;
+	gpmd->deformflag = ARM_DEF_VGROUP;
 }
 
 static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
@@ -87,282 +73,47 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
 	BKE_gpencil_modifier_copyData_generic(md, target);
 }
 
-static void b_bone_deform(
-					bPoseChanDeform *pdef_info, Bone *bone, float co[3],
-					DualQuat *dq, float defmat[3][3])
-{
-	Mat4 *b_bone = pdef_info->b_bone_mats;
-	float(*mat)[4] = b_bone[0].mat;
-	float segment, y;
-	int a;
-
-	/* need to transform co back to bonespace, only need y */
-	y = mat[0][1] * co[0] + mat[1][1] * co[1] + mat[2][1] * co[2] + mat[3][1];
-
-	/* now calculate which of the b_bones are deforming this */
-	segment = bone->length / ((float)bone->segments);
-	a = (int)(y / segment);
-
-	/* note; by clamping it extends deform at endpoints, goes best with
-	 * straight joints in restpos. */
-	CLAMP(a, 0, bone->segments - 1);
-
-	if (dq) {
-		copy_dq_dq(dq, &(pdef_info->b_bone_dual_quats)[a]);
-	}
-	else {
-		mul_m4_v3(b_bone[a + 1].mat, co);
-
-		if (defmat) {
-			copy_m3_m4(defmat, b_bone[a + 1].mat);
-		}
-	}
-}
-
-static void pchan_deform_mat_add(
-				bPoseChannel *pchan, float weight, float bbonemat[3][3],
-				float mat[3][3])
-{
-	float wmat[3][3];
-
-	if (pchan->bone->segments > 1)
-		copy_m3_m3(wmat, bbonemat);
-	else
-		copy_m3_m4(wmat, pchan->chan_mat);
-
-	mul_m3_fl(wmat, weight);
-	add_m3_m3m3(mat, mat, wmat);
-}
-
-static void pchan_bone_deform(
-				bPoseChannel *pchan, bPoseChanDeform *pdef_info, float weight,
-				float vec[3], DualQuat *dq,
-				float mat[3][3], const float co[3], float *contrib)
-{
-	float cop[3], bbonemat[3][3];
-	DualQuat bbonedq;
-
-	if (!weight)
-		return;
-
-	copy_v3_v3(cop, co);
-
-	if (vec) {
-		if (pchan->bone->segments > 1)
-			/* applies on cop and bbonemat */
-			b_bone_deform(pdef_info, pchan->bone, cop, NULL, (mat) ? bbonemat : NULL);
-		else
-			mul_m4_v3(pchan->chan_mat, cop);
-
-		vec[0] += (cop[0] - co[0]) * weight;
-		vec[1] += (cop[1] - co[1]) * weight;
-		vec[2] += (cop[2] - co[2]) * weight;
-
-		if (mat)
-			pchan_deform_mat_add(pchan, weight, bbonemat, mat);
-	}
-	else {
-		if (pchan->bone->segments > 1) {
-			b_bone_deform(pdef_info, pchan->bone, cop, &bbonedq, NULL);
-			add_weighted_dq_dq(dq, &bbonedq, weight);
-		}
-		else
-			add_weighted_dq_dq(dq, pdef_info->dual_quat, weight);
-	}
-
-	(*contrib) += weight;
-}
-
-static void pchan_b_bone_defmats(bPoseChannel *pchan, bPoseChanDeform *pdef_info)
-{
-	Bone *bone = pchan->bone;
-	Mat4 b_bone[MAX_BBONE_SUBDIV], b_bone_rest[MAX_BBONE_SUBDIV];
-	Mat4 *b_bone_mats;
-	int a;
-
-	b_bone_spline_setup(pchan, 0, b_bone);
-	b_bone_spline_setup(pchan, 1, b_bone_rest);
-
-	/* al

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list