[Bf-blender-cvs] [96d9b20aa20] greasepencil-object: Put in place all pieces for Armature modifier

Antonioya noreply at git.blender.org
Thu Aug 23 10:33:45 CEST 2018


Commit: 96d9b20aa20fd8d94ee1119932506ce07f190195
Author: Antonioya
Date:   Sat Aug 18 17:36:54 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rB96d9b20aa20fd8d94ee1119932506ce07f190195

Put in place all pieces for Armature modifier

The modifier doesn't do anything yet.

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

M	release/datafiles/locale
M	release/scripts/addons_contrib
M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/editors/space_outliner/outliner_draw.c
M	source/blender/gpencil_modifiers/CMakeLists.txt
M	source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
M	source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
A	source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
M	source/blender/makesdna/DNA_gpencil_modifier_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

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

diff --git a/release/datafiles/locale b/release/datafiles/locale
index c93ed11a47b..d3349b42856 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit c93ed11a47b3016cf59711ec16de2e2e94c30e99
+Subproject commit d3349b42856d00c278f72f2a5909a6c96b9cdb5e
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 47470215783..15b25a42783 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 474702157831f1a58bb50f5240ab8b1b02b6ba37
+Subproject commit 15b25a42783d1e516b5298d70b582fae2559ae17
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 45af80c0a62..37552f00116 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -2036,6 +2036,11 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
         row.prop(md, "pass_index", text="Pass")
         row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
 
+    def GP_ARMATURE(self, layout, ob, md):
+        col = layout.column()
+        col.label(text="Object:")
+        col.prop(md, "object", text="")
+
 
 classes = (
     DATA_PT_modifiers,
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index 211c9e1a392..187021e403e 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -1094,6 +1094,9 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
 						case eGpencilModifierType_Offset:
 							data.icon = ICON_MOD_DISPLACE;
 							break;
+						case eGpencilModifierType_Armature:
+							data.icon = ICON_MOD_ARMATURE;
+							break;
 
 							/* Default */
 						default:
diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt
index 5ad91d4e01b..44689a1d091 100644
--- a/source/blender/gpencil_modifiers/CMakeLists.txt
+++ b/source/blender/gpencil_modifiers/CMakeLists.txt
@@ -43,6 +43,7 @@ set(SRC
 	intern/MOD_gpencil_util.h
 
 	intern/MOD_gpencil_util.c
+	intern/MOD_gpencilarmature.c
 	intern/MOD_gpencilnoise.c
 	intern/MOD_gpencilsubdiv.c
 	intern/MOD_gpencilsimplify.c
diff --git a/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h b/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
index 73386601d10..968f7e73544 100644
--- a/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
+++ b/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
@@ -44,6 +44,7 @@ extern GpencilModifierTypeInfo modifierType_Gpencil_Mirror;
 extern GpencilModifierTypeInfo modifierType_Gpencil_Smooth;
 extern GpencilModifierTypeInfo modifierType_Gpencil_Hook;
 extern GpencilModifierTypeInfo modifierType_Gpencil_Offset;
+extern GpencilModifierTypeInfo modifierType_Gpencil_Armature;
 
 /* MOD_gpencil_util.c */
 void gpencil_modifier_type_init(GpencilModifierTypeInfo *types[]);
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
index 151218c06e4..742eae66e1d 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
@@ -76,6 +76,7 @@ void gpencil_modifier_type_init(GpencilModifierTypeInfo *types[])
 	INIT_GP_TYPE(Smooth);
 	INIT_GP_TYPE(Hook);
 	INIT_GP_TYPE(Offset);
+	INIT_GP_TYPE(Armature);
 #undef INIT_GP_TYPE
 }
 
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
new file mode 100644
index 00000000000..5b28aaf6ef4
--- /dev/null
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
@@ -0,0 +1,183 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software  Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018, Blender Foundation
+ * This is a new part of Blender
+ *
+ * Contributor(s): Antonio Vazquez
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
+ *  \ingroup modifiers
+ */
+
+#include <stdio.h>
+
+#include "DNA_meshdata_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_gpencil_modifier_types.h"
+#include "DNA_modifier_types.h"
+#include "BLI_math.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_action.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"
+
+#include "MOD_gpencil_util.h"
+#include "MOD_gpencil_modifiertypes.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_query.h"
+
+static void initData(GpencilModifierData *md)
+{
+	ArmatureGpencilModifierData *gpmd = (ArmatureGpencilModifierData *)md;
+	gpmd->object = NULL;
+}
+
+static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
+{
+	BKE_gpencil_modifier_copyData_generic(md, target);
+}
+
+/* deform stroke */
+static void deformStroke(
+        GpencilModifierData *md, Depsgraph *UNUSED(depsgraph),
+        Object *ob, bGPDlayer *gpl, bGPDstroke *gps)
+{
+	ArmatureGpencilModifierData *mmd = (ArmatureGpencilModifierData *)md;
+	if (!mmd->object) {
+		return;
+	}
+
+	//int vindex = defgroup_name_index(ob, mmd->vgname);
+	//float weight = 1.0f;
+
+	//bPoseChannel *pchan = BKE_pose_channel_find_name(mmd->object->pose, mmd->subtarget);
+	//float dmat[4][4];
+
+	/* loop points and apply deform */
+	for (int i = 0; i < gps->totpoints; i++) {
+		bGPDspoint *pt = &gps->points[i];
+		MDeformVert *dvert = &gps->dvert[i];
+
+		//weight = get_modifier_point_weight(dvert, 0, vindex);
+		//if (weight < 0) {
+		//	continue;
+		//}
+	//		gp_armature_co_apply(&tData, weight, pt);
+	}
+}
+
+static void bakeModifier(
+        Main *bmain, Depsgraph *depsgraph,
+        GpencilModifierData *md, Object *ob)
+{
+	ArmatureGpencilModifierData *mmd = (ArmatureGpencilModifierData *)md;
+	Scene *scene = DEG_get_evaluated_scene(depsgraph);
+	bGPdata *gpd = ob->data;
+	int oldframe = (int)DEG_get_ctime(depsgraph);
+
+	if (mmd->object == NULL)
+		return;
+
+	for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+		for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+			/* apply armature effects on this frame
+			 * NOTE: this assumes that we don't want armature animation on non-keyframed frames
+			 */
+			CFRA = gpf->framenum;
+			BKE_scene_graph_update_for_newframe(depsgraph, bmain);
+
+			/* compute armature effects on this frame */
+			for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
+				deformStroke(md, depsgraph, ob, gpl, gps);
+			}
+		}
+	}
+
+	/* return frame state and DB to original state */
+	CFRA = oldframe;
+	BKE_scene_graph_update_for_newframe(depsgraph, bmain);
+}
+
+static bool isDisabled(GpencilModifierData *md, int UNUSED(userRenderParams))
+{
+	ArmatureGpencilModifierData *mmd = (ArmatureGpencilModifierData *)md;
+
+	return !mmd->object;
+}
+
+static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
+{
+	ArmatureGpencilModifierData *lmd = (ArmatureGpencilModifierData *)md;
+	if (lmd->object != NULL) {
+		DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_EVAL_POSE, "Armature Modifier");
+		DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_TRANSFORM, "Armature Modifier");
+	}
+	DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Armature Modifier");
+}
+
+static void foreachObjectLink(
+        GpencilModifierData *md, Object *ob,
+        ObjectWalkFunc walk, void *userData)
+{
+	ArmatureGpencilModifierData *mmd = (ArmatureGpencilModifierData *)md;
+
+	walk(userData, ob, &mmd->object, IDWALK_CB_NOP);
+}
+
+GpencilModifierTypeInfo modifierType_Gpencil_Armature = {
+	/* name */              "Armature",
+	/* structName */        "ArmatureGpencilModifierData",
+	/* structSize */        sizeof(ArmatureGpencilModifierData),
+	/* type */              eGpencilModifierTypeType_Gpencil,
+	/* flags */             0,
+
+	/* copyData */          copyData,
+
+	/* deformStroke */      deformStroke,
+	/* generateStrokes */   NULL,
+	/* bakeModifier */    bakeModifier,
+
+	/* initData */          initData,
+	/* freeData */          NULL,
+	/* isDisabled */        isDisabled,
+	/* updateDepsgraph */   updateDepsgraph,
+	/* dependsOnTime */     NULL,
+	/* foreachObjectLink */ foreachObjectLink,
+	/* foreachIDLink */     NULL,
+	/* foreachTexLink */    NULL,
+};
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index 0cc7e9e40da..6e723346402 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -50,6 +50,7 @@ typedef enum GpencilModifierType {
 	eGpencilModifierType_Hook      = 12,
 	eGpencilModifierType_Offset    = 13,
 	eGpencilModifierType_Mirror    = 14,
+	eGpencilModifierType_Armature  = 15,
 	NUM_GREASEPENCIL_MODIFIER_TYPES
 } GpencilModifierType;
 
@@ -408,6 +409,14 @@ typedef enum eSmoothGpencil_Flag {
 	GP_SMOOTH_MOD_UV         = (1 << 6),
 } eSmoothG

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list