[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