[Bf-blender-cvs] [62f67b8bef1] greasepencil-object: Implement Parent with Empty and Automatic weights

Antonioya noreply at git.blender.org
Thu Aug 23 10:34:28 CEST 2018


Commit: 62f67b8bef11f62d95d989629b97f5a6f4fe1fda
Author: Antonioya
Date:   Tue Aug 21 11:25:11 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rB62f67b8bef11f62d95d989629b97f5a6f4fe1fda

Implement Parent with Empty and Automatic weights

This is an alternative way of define weights.

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

M	source/blender/editors/gpencil/gpencil_armature.c
M	source/blender/editors/include/ED_gpencil.h
M	source/blender/editors/object/object_relations.c

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

diff --git a/source/blender/editors/gpencil/gpencil_armature.c b/source/blender/editors/gpencil/gpencil_armature.c
index d7b00d86812..7cb6e9dd6f0 100644
--- a/source/blender/editors/gpencil/gpencil_armature.c
+++ b/source/blender/editors/gpencil/gpencil_armature.c
@@ -51,6 +51,7 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_scene_types.h"
 
+#include "BKE_main.h"
 #include "BKE_action.h"
 #include "BKE_armature.h"
 #include "BKE_context.h"
@@ -68,6 +69,7 @@
 #include "RNA_enum_types.h"
 
 #include "ED_gpencil.h"
+#include "ED_object.h"
 #include "ED_mesh.h"
 
 #include "DEG_depsgraph.h"
@@ -80,6 +82,9 @@ enum {
 	GP_ARMATURE_AUTO = 1
 };
 
+#define DEFAULT_RATIO 0.15f
+#define DEFAULT_DECAY 0.25f
+
 /* test if a point is inside cylinder
  * Return:  -1.0 if point is outside the cylinder
  *          o distance squared from cylinder axis if point is inside.
@@ -292,7 +297,7 @@ static float get_weight(float dist, float decay_rad, float dif_rad)
 }
 
 /* This functions implements the automatic computation of vertex group weights */
-static void gpencil_add_verts_to_dgroups(bContext *C,
+static void gpencil_add_verts_to_dgroups(const bContext *C,
 	ReportList *reports, Depsgraph *depsgraph, Scene *scene,
 	Object *ob, Object *ob_arm, const float ratio, const float decay)
 {
@@ -392,8 +397,7 @@ static void gpencil_add_verts_to_dgroups(bContext *C,
 	}
 
 	/* loop all strokes */
-	CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
-	{
+	for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
 		bGPDframe *init_gpf = gpl->actframe;
 		bGPDspoint *pt = NULL;
 
@@ -434,8 +438,8 @@ static void gpencil_add_verts_to_dgroups(bContext *C,
 						for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
 							MDeformVert *dvert = &gps->dvert[i];
 							float dist = test_point_in_cylynder(root[j], tip[j],
-																lensqr[j], radsqr[j],
-																pt);
+								lensqr[j], radsqr[j],
+								pt);
 							if (dist < 0) {
 								/* if not in cylinder, check if inside sphere of extremes */
 								weight = 0.0f;
@@ -470,7 +474,6 @@ static void gpencil_add_verts_to_dgroups(bContext *C,
 			}
 		}
 	}
-	CTX_DATA_END;
 
 	/* free the memory allocated */
 	MEM_SAFE_FREE(bonelist);
@@ -482,7 +485,7 @@ static void gpencil_add_verts_to_dgroups(bContext *C,
 	MEM_SAFE_FREE(selected);
 }
 
-static void gpencil_object_vgroup_calc_from_armature(bContext *C,
+static void gpencil_object_vgroup_calc_from_armature(const bContext *C,
 	ReportList *reports, Depsgraph *depsgraph, Scene *scene, Object *ob, Object *ob_arm,
 	const int mode, const float ratio, const float decay)
 {
@@ -515,6 +518,46 @@ static void gpencil_object_vgroup_calc_from_armature(bContext *C,
 	}
 }
 
+bool ED_gpencil_add_armature_weights(const bContext *C, ReportList *reports,
+	Object *ob, Object *ob_arm, int mode)
+{
+	Main *bmain = CTX_data_main(C);
+	Depsgraph *depsgraph = CTX_data_depsgraph(C);
+	Scene *scene = CTX_data_scene(C);
+
+	/* if no armature modifier, add a new one */
+	GpencilModifierData *md = BKE_gpencil_modifiers_findByType(ob, eGpencilModifierType_Armature);
+	if (md == NULL) {
+		md = ED_object_gpencil_modifier_add(reports, bmain, scene,
+										ob, "Armature", eGpencilModifierType_Armature);
+		if (md == NULL) {
+			BKE_report(reports, RPT_ERROR,
+				"Unable to add a new Armature modifier to object");
+			return false;
+		}
+		DEG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA);
+	}
+
+	/* verify armature */
+	ArmatureGpencilModifierData *mmd = (ArmatureGpencilModifierData *)md;
+	if (mmd->object == NULL) {
+		mmd->object = ob_arm;
+	}
+	else {
+		if (ob_arm != mmd->object) {
+			BKE_report(reports, RPT_ERROR,
+				"The existing Armature modifier is already using a different Armature object");
+			return false;
+		}
+	}
+
+	/* add weights */
+	gpencil_object_vgroup_calc_from_armature(C, reports, depsgraph, scene,
+											ob, ob_arm, mode,
+											DEFAULT_RATIO, DEFAULT_DECAY);
+
+	return true;
+}
 /* ***************** Generate armature weights ************************** */
 bool gpencil_generate_weights_poll(bContext *C)
 {
@@ -602,9 +645,9 @@ void GPENCIL_OT_generate_weights(wmOperatorType *ot)
 
 	ot->prop = RNA_def_enum(ot->srna, "mode", mode_type, 0, "Mode", "");
 
-	RNA_def_float(ot->srna, "ratio", 0.15f, 0.0f, 2.0f, "Ratio",
+	RNA_def_float(ot->srna, "ratio", DEFAULT_RATIO, 0.0f, 2.0f, "Ratio",
 		"Ratio between bone length and influence radius", 0.001f, 1.0f);
 
-	RNA_def_float(ot->srna, "decay", 0.1f, 0.0f, 1.0f, "Decay",
+	RNA_def_float(ot->srna, "decay", DEFAULT_DECAY, 0.0f, 1.0f, "Decay",
 		"Factor to reduce influence depending of distance to bone axis", 0.0f, 1.0f);
 }
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 13f8233079b..25dc6743a33 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -49,6 +49,7 @@ struct Depsgraph;
 struct ScrArea;
 struct ARegion;
 struct RegionView3D;
+struct ReportList;
 struct Scene;
 struct ToolSettings;
 struct ViewLayer;
@@ -193,6 +194,14 @@ bool ED_gpencil_anim_copybuf_paste(struct bAnimContext *ac, const short copy_mod
 int ED_gpencil_session_active(void);
 int ED_undo_gpencil_step(struct bContext *C, int step, const char *name);
 
+/* ------------ Grease-Pencil Armature weights ------------------ */
+bool ED_gpencil_add_armature_weights(const struct bContext *C, struct ReportList *reports,
+									struct Object *ob, struct Object *ob_arm, int mode);
+
+/* keep this aligned with gpencil_armature enum */
+#define GP_PAR_ARMATURE_NAME     0
+#define GP_PAR_ARMATURE_AUTO     1
+
 /* ------------ Transformation Utilities ------------ */
 
 /* get difference matrix */
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 7eca34c505f..a966b5c3d99 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -109,6 +109,7 @@
 
 #include "ED_armature.h"
 #include "ED_curve.h"
+#include "ED_gpencil.h"
 #include "ED_keyframing.h"
 #include "ED_object.h"
 #include "ED_mesh.h"
@@ -797,6 +798,26 @@ 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) {
+					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);
+					WM_cursor_wait(0);
+				}
+				/* get corrected inverse */
+				ob->partype = PAROBJECT;
+				BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob);
+
+				invert_m4_m4(ob->parentinv, workob.obmat);
+			}
 			else {
 				/* calculate inverse parent matrix */
 				BKE_object_workob_calc_parent(depsgraph, scene, ob, &workob);



More information about the Bf-blender-cvs mailing list