diff options
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_view.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_view.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 9e16dc030b5..9d687360e8b 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -44,6 +44,7 @@ #include "BKE_camera.h" #include "BKE_context.h" #include "BKE_depsgraph.h" +#include "BKE_DerivedMesh.h" #include "BKE_object.h" #include "BKE_global.h" #include "BKE_main.h" @@ -1031,23 +1032,55 @@ static void view3d_select_loop(ViewContext *vc, Scene *scene, View3D *v3d, ARegi lb = object_duplilist(G.main->eval_ctx, scene, base->object); for (dob = lb->first; dob; dob = dob->next) { - float omat[4][4]; + /* for restoring after override */ + DupliObjectData *dob_data = NULL; + DerivedMesh *store_final_dm; + float store_obmat[4][4]; tbase.object = dob->ob; - copy_m4_m4(omat, dob->ob->obmat); + copy_m4_m4(store_obmat, dob->ob->obmat); copy_m4_m4(dob->ob->obmat, dob->mat); + store_final_dm = dob->ob->derivedFinal; /* extra service: draw the duplicator in drawtype of parent */ /* MIN2 for the drawtype to allow bounding box objects in groups for lods */ dt = tbase.object->dt; tbase.object->dt = MIN2(tbase.object->dt, base->object->dt); dtx = tbase.object->dtx; tbase.object->dtx = base->object->dtx; + /* override final DM */ + tbase.object->transflag &= ~OB_IS_DUPLI_CACHE; + if (base->object->dup_cache) { + dob_data = BKE_dupli_cache_find_data(base->object->dup_cache, tbase.object); + if (dob_data && dob_data->dm) { + tbase.object->transflag |= OB_IS_DUPLI_CACHE; + + tbase.object->derivedFinal = dob_data->dm; + } + } + draw_object(scene, ar, v3d, &tbase, DRAW_PICKING | DRAW_CONSTCOLOR); + /* restore final DM */ + if (tbase.object->transflag & OB_IS_DUPLI_CACHE) { + DerivedMesh *cur = tbase.object->derivedFinal; + + /* in some cases drawing code can recreate the derivedFinal, + * make sure we free those first before restoring + */ + if (cur && cur != dob_data->dm) { + cur->needsFree = 1; + cur->release(cur); + } + + tbase.object->transflag &= ~OB_IS_DUPLI_CACHE; + tbase.object->derivedFinal = store_final_dm; + } + tbase.object->dt = dt; tbase.object->dtx = dtx; - copy_m4_m4(dob->ob->obmat, omat); + /* restore obmat and final DM */ + copy_m4_m4(dob->ob->obmat, store_obmat); } free_object_duplilist(lb); } |