diff options
Diffstat (limited to 'source/blender/gpencil_modifiers')
-rw-r--r-- | source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c | 127 |
1 files changed, 5 insertions, 122 deletions
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c index a35174d882f..10f96d3a22f 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c @@ -77,7 +77,6 @@ static void initData(GpencilModifierData *md) gpmd->rnd_rot = 0.5f; gpmd->rnd_size = 0.5f; gpmd->lock_axis |= GP_LOCKAXIS_X; - gpmd->flag |= GP_INSTANCE_MAKE_OBJECTS; /* fill random values */ BLI_array_frand(gpmd->rnd, 20, 1); @@ -197,11 +196,10 @@ static void generate_geometry( MEM_SAFE_FREE(valid_strokes); } -/* bakeModifier - "Bake to Data" Mode */ -static void bakeModifierGP_strokes( - Depsgraph *depsgraph, - GpencilModifierData *md, Object *ob) +static void bakeModifier(Main *UNUSED(bmain), Depsgraph *depsgraph, + GpencilModifierData *md, Object *ob) { + bGPdata *gpd = ob->data; for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { @@ -213,127 +211,12 @@ static void bakeModifierGP_strokes( /* -------------------------------- */ -/* helper to create a new object */ -static Object *array_instance_add_ob_copy(Main *bmain, Scene *scene, Object *from_ob) -{ - Object *ob; - - ob = BKE_object_copy(bmain, from_ob); - BKE_collection_object_add_from(bmain, scene, from_ob, ob); - - zero_v3(ob->loc); - zero_v3(ob->rot); - - DEG_id_type_tag(bmain, ID_OB); - DEG_relations_tag_update(bmain); - DEG_id_tag_update(&scene->id, 0); - - return ob; -} - -/* bakeModifier - "Make Objects" Mode */ -static void bakeModifierGP_objects(Main *bmain, Depsgraph *depsgraph, GpencilModifierData *md, Object *ob) -{ - InstanceGpencilModifierData *mmd = (InstanceGpencilModifierData *)md; - Scene *scene = DEG_get_evaluated_scene(depsgraph); - /* reset random */ - mmd->rnd[0] = 1; - - /* generate instances as objects */ - for (int x = 0; x < mmd->count[0]; x++) { - for (int y = 0; y < mmd->count[1]; y++) { - for (int z = 0; z < mmd->count[2]; z++) { - Object *newob; - GpencilModifierData *fmd; - - const int elem_idx[3] = {x, y, z}; - float mat[4][4], finalmat[4][4]; - int sh; - - /* original strokes are at index = 0,0,0 */ - if ((x == 0) && (y == 0) && (z == 0)) { - continue; - } - - /* compute transform for instance */ - BKE_gpencil_instance_modifier_instance_tfm(mmd, elem_idx, mat); - mul_m4_m4m4(finalmat, ob->obmat, mat); - - /* moves to new origin */ - sh = x; - if (mmd->lock_axis == GP_LOCKAXIS_Y) { - sh = y; - } - if (mmd->lock_axis == GP_LOCKAXIS_Z) { - sh = z; - } - madd_v3_v3fl(finalmat[3], mmd->shift, sh); - - /* Create a new object - * - * NOTE: Copies share the same original GP datablock - * Artists can later user make_single_user on these - * to make them unique (if necessary), without too - * much extra memory usage. - */ - newob = array_instance_add_ob_copy(bmain, scene, ob); - - /* remove array on destination object */ - fmd = (GpencilModifierData *)BLI_findstring(&newob->greasepencil_modifiers, md->name, offsetof(GpencilModifierData, name)); - if (fmd) { - BLI_remlink(&newob->greasepencil_modifiers, fmd); - BKE_gpencil_modifier_free(fmd); - } - - /* copy transforms to destination object */ - copy_m4_m4(newob->obmat, finalmat); - - copy_v3_v3(newob->loc, finalmat[3]); - mat4_to_eul(newob->rot, finalmat); - mat4_to_size(newob->size, finalmat); - } - } - } -} - -/* -------------------------------- */ - /* Generic "generateStrokes" callback */ static void generateStrokes( GpencilModifierData *md, Depsgraph *depsgraph, Object *ob, bGPDlayer *gpl, bGPDframe *gpf) { - InstanceGpencilModifierData *mmd = (InstanceGpencilModifierData *)md; - - /* When the "make_objects" flag is set, this modifier is handled as part of the - * draw engine instead. The main benefit is that the instances won't suffer from - * z-ordering problems. - * - * FIXME: Ultimately, the draw-engine hack here shouldn't be necessary, but until - * we find a better fix to the z-ordering problems, it's better to have - * working functionality - */ - if ((mmd->flag & GP_INSTANCE_MAKE_OBJECTS) == 0) { - generate_geometry(md, depsgraph, ob, gpl, gpf); - } -} - -/* Generic "bakeModifier" callback */ -static void bakeModifier( - Main *bmain, Depsgraph *depsgraph, - GpencilModifierData *md, Object *ob) -{ - InstanceGpencilModifierData *mmd = (InstanceGpencilModifierData *)md; - - /* Create new objects or add all to current datablock. - * Sometimes it's useful to have the option to do either of these... - */ - if (mmd->flag & GP_INSTANCE_MAKE_OBJECTS) { - bakeModifierGP_objects(bmain, depsgraph, md, ob); - } - else { - bakeModifierGP_strokes(depsgraph, md, ob); - } + generate_geometry(md, depsgraph, ob, gpl, gpf); } GpencilModifierTypeInfo modifierType_Gpencil_Instance = { @@ -347,7 +230,7 @@ GpencilModifierTypeInfo modifierType_Gpencil_Instance = { /* deformStroke */ NULL, /* generateStrokes */ generateStrokes, - /* bakeModifier */ bakeModifier, + /* bakeModifier */ bakeModifier, /* initData */ initData, /* freeData */ NULL, |