diff options
Diffstat (limited to 'source/blender/blenkernel/intern/object_dupli.c')
-rw-r--r-- | source/blender/blenkernel/intern/object_dupli.c | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c index a1b01bce6c9..9a8c560f116 100644 --- a/source/blender/blenkernel/intern/object_dupli.c +++ b/source/blender/blenkernel/intern/object_dupli.c @@ -47,6 +47,7 @@ #include "BKE_editmesh.h" #include "BKE_editmesh_cache.h" #include "BKE_font.h" +#include "BKE_geometry_set.h" #include "BKE_global.h" #include "BKE_idprop.h" #include "BKE_lattice.h" @@ -807,6 +808,45 @@ static const DupliGenerator gen_dupli_verts_pointcloud = { /** \} */ /* -------------------------------------------------------------------- */ +/** \name Instances Geometry Component Implementation + * \{ */ + +static void make_duplis_instances_component(const DupliContext *ctx) +{ + float(*positions)[3]; + float(*rotations)[3]; + float(*scales)[3]; + Object **objects; + const int amount = BKE_geometry_set_instances( + ctx->object->runtime.geometry_set_eval, &positions, &rotations, &scales, &objects); + + for (int i = 0; i < amount; i++) { + Object *object = objects[i]; + if (object == NULL) { + continue; + } + float scale_matrix[4][4]; + size_to_mat4(scale_matrix, scales[i]); + float rotation_matrix[4][4]; + eul_to_mat4(rotation_matrix, rotations[i]); + float matrix[4][4]; + mul_m4_m4m4(matrix, rotation_matrix, scale_matrix); + copy_v3_v3(matrix[3], positions[i]); + mul_m4_m4_pre(matrix, ctx->object->obmat); + + make_dupli(ctx, object, matrix, i); + make_recursive_duplis(ctx, object, matrix, i); + } +} + +static const DupliGenerator gen_dupli_instances_component = { + 0, + make_duplis_instances_component, +}; + +/** \} */ + +/* -------------------------------------------------------------------- */ /** \name Dupli-Faces Implementation (#OB_DUPLIFACES) * \{ */ @@ -1473,7 +1513,7 @@ static const DupliGenerator *get_dupli_generator(const DupliContext *ctx) int transflag = ctx->object->transflag; int restrictflag = ctx->object->restrictflag; - if ((transflag & OB_DUPLI) == 0) { + if ((transflag & OB_DUPLI) == 0 && ctx->object->runtime.geometry_set_eval == NULL) { return NULL; } @@ -1483,6 +1523,12 @@ static const DupliGenerator *get_dupli_generator(const DupliContext *ctx) return NULL; } + if (ctx->object->runtime.geometry_set_eval != NULL) { + if (BKE_geometry_set_has_instances(ctx->object->runtime.geometry_set_eval)) { + return &gen_dupli_instances_component; + } + } + if (transflag & OB_DUPLIPARTS) { return &gen_dupli_particles; } |