[Bf-blender-cvs] [b373707f2f6] temp-greasepencil-object-stacksplit: WIP: More changes

Antonio Vazquez noreply at git.blender.org
Sat Jun 16 12:02:19 CEST 2018


Commit: b373707f2f6c72d4ffdb1ac90554b516f1018514
Author: Antonio Vazquez
Date:   Sat Jun 16 12:02:08 2018 +0200
Branches: temp-greasepencil-object-stacksplit
https://developer.blender.org/rBb373707f2f6c72d4ffdb1ac90554b516f1018514

WIP: More changes

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

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/BKE_gpencil_modifier.h
M	source/blender/blenkernel/BKE_modifier.h
M	source/blender/blenkernel/intern/gpencil_modifier.c
M	source/blender/editors/object/object_gpencil_modifier.c
M	source/blender/gpencil_modifiers/CMakeLists.txt
A	source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
D	source/blender/gpencil_modifiers/MOD_modifiertypes.h
M	source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilcolor.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
M	source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c
M	source/blender/gpencil_modifiers/intern/MOD_gpenciltint.c
D	source/blender/gpencil_modifiers/intern/MOD_util.c
D	source/blender/gpencil_modifiers/intern/MOD_util.h
M	source/blender/makesdna/DNA_gpencil_modifier_types.h
M	source/blender/modifiers/MOD_modifiertypes.h

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index f579a494de7..35af7d47e80 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -115,9 +115,9 @@ struct bGPDstroke *BKE_gpencil_add_stroke(struct bGPDframe *gpf, int mat_idx, in
 #define GPENCIL_ALPHA_OPACITY_THRESH 0.001f
 #define GPENCIL_STRENGTH_MIN 0.003f
 
-#define GPENCIL_MODIFIER_ACTIVE(_md, _is_render) (((_md->mode & eModifierMode_Realtime) && (_is_render == false)) || \
-												  ((_md->mode & eModifierMode_Render) && (_is_render == true))) 
-#define GPENCIL_MODIFIER_EDIT(_md, _is_edit) (((_md->mode & eModifierMode_Editmode) == 0) && (_is_edit))
+#define GPENCIL_MODIFIER_ACTIVE(_md, _is_render) (((_md->mode & eGreasePencilModifierMode_Realtime) && (_is_render == false)) || \
+												  ((_md->mode & eGreasePencilModifierMode_Render) && (_is_render == true))) 
+#define GPENCIL_MODIFIER_EDIT(_md, _is_edit) (((_md->mode & eGreasePencilModifierMode_Editmode) == 0) && (_is_edit))
 
 bool gpencil_layer_is_editable(const struct bGPDlayer *gpl);
 
diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index 7a470af38c2..756118c96e2 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -49,6 +49,14 @@ struct bGPDframe;
 struct bGPDstroke;
 struct ModifierUpdateDepsgraphContext;
 
+typedef enum {
+	/* Should not be used, only for None modifier type */
+	eGreasePencilModifierTypeType_None,
+
+	/* grease pencil modifiers */
+	eGreasePencilModifierTypeType_Gpencil,
+}  GreasePencilModifierTypeType;
+
 typedef enum {
 	eGreasePencilModifierTypeFlag_AcceptsMesh = (1 << 0),
 	eGreasePencilModifierTypeFlag_AcceptsCVs = (1 << 1),
@@ -112,10 +120,7 @@ typedef struct GreasePencilModifierTypeInfo {
 	 * level settings to the target modifier.
 	 */
 	void (*copyData)(const struct GreasePencilModifierData *md, struct GreasePencilModifierData *target);
-
-
-	/******************* GP modifier functions *********************/
-
+	
 	/* Callback for GP "stroke" modifiers that operate on the
 	 * shape and parameters of the provided strokes (e.g. Thickness, Noise, etc.)
 	 *
@@ -162,24 +167,6 @@ typedef struct GreasePencilModifierTypeInfo {
 	 */
 	void (*initData)(struct GreasePencilModifierData *md);
 
-	/* Should return a CustomDataMask indicating what data this
-	 * modifier needs. If (mask & (1 << (layer type))) != 0, this modifier
-	 * needs that custom data layer. This function's return value can change
-	 * depending on the modifier's settings.
-	 *
-	 * Note that this means extra data (e.g. vertex groups) - it is assumed
-	 * that all modifiers need mesh data and deform modifiers need vertex
-	 * coordinates.
-	 *
-	 * Note that this limits the number of custom data layer types to 32.
-	 *
-	 * If this function is not present or it returns 0, it is assumed that
-	 * no extra data is needed.
-	 *
-	 * This function is optional.
-	 */
-	CustomDataMask (*requiredDataMask)(struct Object *ob, struct GreasePencilModifierData *md);
-
 	/* Free internal modifier data variables, this function should
 	 * not free the md variable itself.
 	 *
@@ -254,13 +241,16 @@ typedef struct GreasePencilModifierTypeInfo {
 } GreasePencilModifierTypeInfo;
 
 /* Initialize modifier's global data (type info and some common global storages). */
-void BKE_modifier_init(void);
+void BKE_gpencil_modifier_init(void);
 
 const GreasePencilModifierTypeInfo *BKE_gpencil_modifierType_getInfo(GreasePencilModifierType type);
-
 struct GreasePencilModifierData  *BKE_gpencil_modifier_new(int type);
-void          BKE_gpencil_modifier_free(struct GreasePencilModifierData *md);
-
-bool          BKE_gpencil_modifier_unique_name(struct ListBase *modifiers, struct GreasePencilModifierData *gmd);
+void BKE_gpencil_modifier_free_ex(struct GreasePencilModifierData *md, const int flag);
+void BKE_gpencil_modifier_free(struct GreasePencilModifierData *md);
+bool BKE_gpencil_modifier_unique_name(struct ListBase *modifiers, struct GreasePencilModifierData *gmd);
+struct GreasePencilModifierData *BKE_gpencil_modifiers_findByType(struct Object *ob, GreasePencilModifierType type);
+struct GreasePencilModifierData *BKE_gpencil_modifiers_findByName(struct Object *ob, const char *name);
+void BKE_gpencil_modifier_copyData_generic(const struct GreasePencilModifierData *md_src, struct GreasePencilModifierData *md_dst);
+void BKE_gpencil_modifier_copyData(struct GreasePencilModifierData *md, struct GreasePencilModifierData *target);
 
 #endif __BKE_GREASEPENCIL_H__
\ No newline at end of file
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 595c67a9c05..54bcfa1e2fd 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -74,8 +74,6 @@ typedef enum {
 	 * of the object, rather some of its CustomData layers.
 	 * E.g. UVProject and WeightVG modifiers. */
 	eModifierTypeType_NonGeometrical,
-	/* special mode for grease pencil modifiers */
-	eModifierTypeType_Gpencil,
 } ModifierTypeType;
 
 typedef enum {
@@ -110,8 +108,6 @@ typedef enum {
 	/* For modifiers that use CD_PREVIEW_MCOL for preview. */
 	eModifierTypeFlag_UsesPreview = (1 << 9),
 	eModifierTypeFlag_AcceptsLattice = (1 << 10),
-	/* Grease pencil modifiers (do not change mesh, only is placeholder) */
-	eModifierTypeFlag_GpencilMod = (1 << 11),
 } ModifierTypeFlag;
 
 /* IMPORTANT! Keep ObjectWalkFunc and IDWalkFunc signatures compatible. */
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index 0f98e19c2e1..e2c42604b4b 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -35,16 +35,19 @@
 #include "BLI_blenlib.h"
 #include "BLI_utildefines.h"
 #include "BLI_math_vector.h"
+#include "BLI_string_utils.h"
+
+#include "BLT_translation.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 "DNA_vec_types.h"
 
 #include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_library_query.h"
 #include "BKE_gpencil.h"
 #include "BKE_lattice.h"
 #include "BKE_gpencil_modifier.h"
@@ -53,6 +56,8 @@
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_query.h"
 
+static GreasePencilModifierTypeInfo *modifier_types[NUM_GREASEPENCIL_MODIFIER_TYPES] = { NULL };
+
 /* *************************************************** */
 /* Geometry Utilities */
 
@@ -449,10 +454,66 @@ void BKE_gpencil_eval_geometry(Depsgraph *depsgraph,
 	}
 }
 
+void BKE_gpencil_modifier_init(void)
+{
+	/* Initialize modifier types */
+	gpencil_modifier_type_init(modifier_types); /* MOD_gpencil_utils.c */
+}
 
-/* *************************************************** */
+GreasePencilModifierData *BKE_gpencil_modifier_new(int type)
+{
+	const GreasePencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(type);
+	GreasePencilModifierData *md = MEM_callocN(mti->structSize, mti->structName);
+
+	/* note, this name must be made unique later */
+	BLI_strncpy(md->name, DATA_(mti->name), sizeof(md->name));
+
+	md->type = type;
+	md->mode = eGreasePencilModifierMode_Realtime | eGreasePencilModifierMode_Render | eGreasePencilModifierMode_Expanded;
+	md->flag = eGreasePencilModifierFlag_StaticOverride_Local;
+
+	if (mti->flags & eGreasePencilModifierTypeFlag_EnableInEditmode)
+		md->mode |= eGreasePencilModifierMode_Editmode;
 
-bool gpencil_modifier_unique_name(ListBase *modifiers, GreasePencilModifierData *gmd)
+	if (mti->initData) mti->initData(md);
+
+	return md;
+}
+
+static void modifier_free_data_id_us_cb(void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin, int cb_flag)
+{
+	ID *id = *idpoin;
+	if (id != NULL && (cb_flag & IDWALK_CB_USER) != 0) {
+		id_us_min(id);
+	}
+}
+
+void BKE_gpencil_modifier_free_ex(GreasePencilModifierData *md, const int flag)
+{
+	const GreasePencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
+
+	if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
+		if (mti->foreachIDLink) {
+			mti->foreachIDLink(md, NULL, modifier_free_data_id_us_cb, NULL);
+		}
+		else if (mti->foreachObjectLink) {
+			mti->foreachObjectLink(md, NULL, (ObjectWalkFunc)modifier_free_data_id_us_cb, NULL);
+		}
+	}
+
+	if (mti->freeData) mti->freeData(md);
+	if (md->error) MEM_freeN(md->error);
+
+	MEM_freeN(md);
+}
+
+void BKE_gpencil_modifier_free(GreasePencilModifierData *md)
+{
+	BKE_gpencil_modifier_free_ex(md, 0);
+}
+
+/* check unique name */
+bool BKE_gpencil_modifier_unique_name(ListBase *modifiers, GreasePencilModifierData *gmd)
 {
 	if (modifiers && gmd) {
 		const GreasePencilModifierTypeInfo *gmti = BKE_gpencil_modifierType_getInfo(gmd->type);
@@ -460,3 +521,82 @@ bool gpencil_modifier_unique_name(ListBase *modifiers, GreasePencilModifierData
 	}
 	return false;
 }
+
+const GreasePencilModifierTypeInfo *BKE_gpencil_modifierType_getInfo(GreasePencilModifierType type)
+{
+	/* type unsigned, no need to check < 0 */
+	if (type < NUM_GREASEPENCIL_MODIFIER_TYPES && modifier_types[type]->name[0] != '\0') {
+		return modifier_types[type];
+	}
+	else {
+		return NULL;
+	}
+}
+
+void BKE_gpencil_modifier_copyData_generic(const GreasePencilModifierData *md_src, GreasePencilModifierData *md_dst)
+{
+	const GreasePencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md_src->type);
+
+	/* md_dst may have alredy be fully initialized with some extra allocated data,
+	* we need to free it now to avoid memleak. */
+	if (mti->freeData) {
+		mti->freeData(md_dst);
+	}
+
+	const size_t data_size = sizeof(GreasePencilModifierData);
+	const char *md_src_data = ((const char *)md_src) + data_size;
+	char       *md_dst_data = ((char *)md_dst) + data_size;
+	BLI_assert(data_size <= (size_t)mti->structSize);
+	memcpy(md_dst_data, md_src_data, (size_t)mti->structSize - data_size);
+}
+
+static void gpencil_modifier_copy_data_id_us_cb(void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin, int cb_flag)
+{
+	ID *id

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list