Cleanup: mostly namings in `make_object_duplilist_real` code.

This commit is contained in:
Bastien Montagne 2017-08-08 16:08:24 +02:00
parent a78b596272
commit ddfd57c0d2
1 changed files with 41 additions and 37 deletions

View File

@ -1344,15 +1344,15 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
const bool use_hierarchy)
{
Main *bmain = CTX_data_main(C);
ListBase *lb;
ListBase *lb_duplis;
DupliObject *dob;
GHash *dupli_gh = NULL, *parent_gh = NULL;
Object *object;
GHash *dupli_gh, *parent_gh = NULL;
if (!(base->object->transflag & OB_DUPLI))
if (!(base->object->transflag & OB_DUPLI)) {
return;
}
lb = object_duplilist(bmain->eval_ctx, scene, base->object);
lb_duplis = object_duplilist(bmain->eval_ctx, scene, base->object);
dupli_gh = BLI_ghash_ptr_new(__func__);
if (use_hierarchy) {
@ -1364,52 +1364,55 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
}
}
for (dob = lb->first; dob; dob = dob->next) {
Base *basen;
Object *ob = ID_NEW_SET(dob->ob, BKE_object_copy(bmain, dob->ob));
for (dob = lb_duplis->first; dob; dob = dob->next) {
Object *ob_src = dob->ob;
Object *ob_dst = ID_NEW_SET(dob->ob, BKE_object_copy(bmain, ob_src));
Base *base_dst;
/* font duplis can have a totcol without material, we get them from parent
* should be implemented better...
*/
if (ob->mat == NULL) ob->totcol = 0;
if (ob_dst->mat == NULL) {
ob_dst->totcol = 0;
}
basen = MEM_dupallocN(base);
basen->flag &= ~(OB_FROMDUPLI | OB_FROMGROUP);
ob->flag = basen->flag;
basen->lay = base->lay;
BLI_addhead(&scene->base, basen); /* addhead: othwise eternal loop */
basen->object = ob;
base_dst = MEM_dupallocN(base);
base_dst->flag &= ~(OB_FROMDUPLI | OB_FROMGROUP);
ob_dst->flag = base_dst->flag;
base_dst->lay = base->lay;
BLI_addhead(&scene->base, base_dst); /* addhead: othwise eternal loop */
base_dst->object = ob_dst;
/* make sure apply works */
BKE_animdata_free(&ob->id, true);
ob->adt = NULL;
BKE_animdata_free(&ob_dst->id, true);
ob_dst->adt = NULL;
/* Proxies are not to be copied. */
ob->proxy_from = NULL;
ob->proxy_group = NULL;
ob->proxy = NULL;
ob_dst->proxy_from = NULL;
ob_dst->proxy_group = NULL;
ob_dst->proxy = NULL;
ob->parent = NULL;
BKE_constraints_free(&ob->constraints);
ob->curve_cache = NULL;
ob->transflag &= ~OB_DUPLI;
ob->lay = base->lay;
ob_dst->parent = NULL;
BKE_constraints_free(&ob_dst->constraints);
ob_dst->curve_cache = NULL;
ob_dst->transflag &= ~OB_DUPLI;
ob_dst->lay = base->lay;
copy_m4_m4(ob->obmat, dob->mat);
BKE_object_apply_mat4(ob, ob->obmat, false, false);
copy_m4_m4(ob_dst->obmat, dob->mat);
BKE_object_apply_mat4(ob_dst, ob_dst->obmat, false, false);
BLI_ghash_insert(dupli_gh, dob, ob);
BLI_ghash_insert(dupli_gh, dob, ob_dst);
if (parent_gh) {
void **val;
/* Due to nature of hash/comparison of this ghash, a lot of duplis may be considered as 'the same',
* this avoids trying to insert same key several time and raise asserts in debug builds... */
if (!BLI_ghash_ensure_p(parent_gh, dob, &val)) {
*val = ob;
*val = ob_dst;
}
}
}
for (dob = lb->first; dob; dob = dob->next) {
for (dob = lb_duplis->first; dob; dob = dob->next) {
Object *ob_src = dob->ob;
Object *ob_dst = BLI_ghash_lookup(dupli_gh, dob);
@ -1476,20 +1479,21 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
}
if (base->object->transflag & OB_DUPLIGROUP && base->object->dup_group) {
for (object = bmain->object.first; object; object = object->id.next) {
if (object->proxy_group == base->object) {
object->proxy = NULL;
object->proxy_from = NULL;
DAG_id_tag_update(&object->id, OB_RECALC_OB);
for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
if (ob->proxy_group == base->object) {
ob->proxy = NULL;
ob->proxy_from = NULL;
DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
}
}
BLI_ghash_free(dupli_gh, NULL, NULL);
if (parent_gh)
if (parent_gh) {
BLI_ghash_free(parent_gh, NULL, NULL);
}
free_object_duplilist(lb);
free_object_duplilist(lb_duplis);
BKE_main_id_clear_newpoins(bmain);