/* after copying objects, copied data should get new pointers */ static void copy_object_set_idnew(bContext *C, int dupflag) { Object *ob; Material *ma, *mao; ID *id; #if 0 // XXX old animation system Ipo *ipo; bActionStrip *strip; #endif // XXX old animation system int a; /* XXX check object pointers */ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) { ob= base->object; relink_constraints(&ob->constraints); if (ob->pose){ bPoseChannel *chan; for (chan = ob->pose->chanbase.first; chan; chan=chan->next){ relink_constraints(&chan->constraints); } } modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL); ID_NEW(ob->parent); ID_NEW(ob->track); ID_NEW(ob->proxy); ID_NEW(ob->proxy_group); #if 0 // XXX old animation system for(strip= ob->nlastrips.first; strip; strip= strip->next) { bActionModifier *amod; for(amod= strip->modifiers.first; amod; amod= amod->next) ID_NEW(amod->ob); } #endif // XXX old animation system }
/* after copying objects, copied data should get new pointers */ static void copy_object_set_idnew(bContext *C, int dupflag) { Main *bmain= CTX_data_main(C); Material *ma, *mao; ID *id; int a; /* XXX check object pointers */ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { relink_constraints(&ob->constraints); if (ob->pose){ bPoseChannel *chan; for (chan = ob->pose->chanbase.first; chan; chan=chan->next){ relink_constraints(&chan->constraints); } } modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL); ID_NEW(ob->parent); ID_NEW(ob->proxy); ID_NEW(ob->proxy_group); }
/* preserve relationships between constraints and rigid bodies after duplication */ void BKE_rigidbody_relink_constraint(RigidBodyCon *rbc) { ID_NEW(rbc->ob1); ID_NEW(rbc->ob2); }
void set_sca_new_poins_ob(Object *ob) { bSensor *sens; bController *cont; bActuator *act; int a; sens= ob->sensors.first; while (sens) { if (sens->flag & SENS_NEW) { for (a=0; a<sens->totlinks; a++) { if (sens->links[a] && sens->links[a]->mynew) sens->links[a] = sens->links[a]->mynew; } } sens= sens->next; } cont= ob->controllers.first; while (cont) { if (cont->flag & CONT_NEW) { for (a=0; a<cont->totlinks; a++) { if ( cont->links[a] && cont->links[a]->mynew) cont->links[a] = cont->links[a]->mynew; } } cont= cont->next; } act= ob->actuators.first; while (act) { if (act->flag & ACT_NEW) { if (act->type==ACT_EDIT_OBJECT) { bEditObjectActuator *eoa= act->data; ID_NEW(eoa->ob); } else if (act->type==ACT_SCENE) { bSceneActuator *sca= act->data; ID_NEW(sca->camera); } else if (act->type==ACT_CAMERA) { bCameraActuator *ca= act->data; ID_NEW(ca->ob); } else if (act->type==ACT_OBJECT) { bObjectActuator *oa= act->data; ID_NEW(oa->reference); } else if (act->type==ACT_MESSAGE) { bMessageActuator *ma= act->data; ID_NEW(ma->toObject); } else if (act->type==ACT_PARENT) { bParentActuator *para = act->data; ID_NEW(para->ob); } else if (act->type==ACT_ARMATURE) { bArmatureActuator *aa = act->data; ID_NEW(aa->target); ID_NEW(aa->subtarget); } else if (act->type==ACT_PROPERTY) { bPropertyActuator *pa= act->data; ID_NEW(pa->ob); } else if (act->type==ACT_STEERING) { bSteeringActuator *sta = act->data; ID_NEW(sta->navmesh); ID_NEW(sta->target); } } act= act->next; } }
Scene *BKE_scene_copy(Scene *sce, int type) { Scene *scen; ToolSettings *ts; Base *base, *obase; if (type == SCE_COPY_EMPTY) { ListBase lb; /* XXX. main should become an arg */ scen = BKE_scene_add(G.main, sce->id.name + 2); lb = scen->r.layers; scen->r = sce->r; scen->r.layers = lb; scen->unit = sce->unit; scen->physics_settings = sce->physics_settings; scen->gm = sce->gm; scen->audio = sce->audio; MEM_freeN(scen->toolsettings); } else { scen = BKE_libblock_copy(&sce->id); BLI_duplicatelist(&(scen->base), &(sce->base)); clear_id_newpoins(); id_us_plus((ID *)scen->world); id_us_plus((ID *)scen->set); id_us_plus((ID *)scen->gm.dome.warptext); scen->ed = NULL; scen->theDag = NULL; scen->obedit = NULL; scen->stats = NULL; scen->fps_info = NULL; BLI_duplicatelist(&(scen->markers), &(sce->markers)); BLI_duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces)); BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers)); BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets)); if (sce->nodetree) { /* ID's are managed on both copy and switch */ scen->nodetree = ntreeCopyTree(sce->nodetree); ntreeSwitchID(scen->nodetree, &sce->id, &scen->id); } obase = sce->base.first; base = scen->base.first; while (base) { id_us_plus(&base->object->id); if (obase == sce->basact) scen->basact = base; obase = obase->next; base = base->next; } /* copy color management settings */ BKE_color_managed_display_settings_copy(&scen->display_settings, &sce->display_settings); BKE_color_managed_view_settings_copy(&scen->view_settings, &sce->view_settings); BKE_color_managed_view_settings_copy(&scen->r.im_format.view_settings, &sce->r.im_format.view_settings); BLI_strncpy(scen->sequencer_colorspace_settings.name, sce->sequencer_colorspace_settings.name, sizeof(scen->sequencer_colorspace_settings.name)); /* remove animation used by sequencer */ if (type != SCE_COPY_FULL) remove_sequencer_fcurves(scen); } /* tool settings */ scen->toolsettings = MEM_dupallocN(sce->toolsettings); ts = scen->toolsettings; if (ts) { if (ts->vpaint) { ts->vpaint = MEM_dupallocN(ts->vpaint); ts->vpaint->paintcursor = NULL; ts->vpaint->vpaint_prev = NULL; ts->vpaint->wpaint_prev = NULL; BKE_paint_copy(&ts->vpaint->paint, &ts->vpaint->paint); } if (ts->wpaint) { ts->wpaint = MEM_dupallocN(ts->wpaint); ts->wpaint->paintcursor = NULL; ts->wpaint->vpaint_prev = NULL; ts->wpaint->wpaint_prev = NULL; BKE_paint_copy(&ts->wpaint->paint, &ts->wpaint->paint); } if (ts->sculpt) { ts->sculpt = MEM_dupallocN(ts->sculpt); BKE_paint_copy(&ts->sculpt->paint, &ts->sculpt->paint); } BKE_paint_copy(&ts->imapaint.paint, &ts->imapaint.paint); ts->imapaint.paintcursor = NULL; ts->particle.paintcursor = NULL; } /* make a private copy of the avicodecdata */ if (sce->r.avicodecdata) { scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata); scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat); scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms); } /* make a private copy of the qtcodecdata */ if (sce->r.qtcodecdata) { scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata); scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms); } if (sce->r.ffcodecdata.properties) { /* intentionally check scen not sce. */ scen->r.ffcodecdata.properties = IDP_CopyProperty(sce->r.ffcodecdata.properties); } /* NOTE: part of SCE_COPY_LINK_DATA and SCE_COPY_FULL operations * are done outside of blenkernel with ED_objects_single_users! */ /* camera */ if (type == SCE_COPY_LINK_DATA || type == SCE_COPY_FULL) { ID_NEW(scen->camera); } /* before scene copy */ sound_create_scene(scen); /* world */ if (type == SCE_COPY_FULL) { BKE_copy_animdata_id_action((ID *)scen); if (scen->world) { id_us_plus((ID *)scen->world); scen->world = BKE_world_copy(scen->world); BKE_copy_animdata_id_action((ID *)scen->world); } if (sce->ed) { scen->ed = MEM_callocN(sizeof(Editing), "addseq"); scen->ed->seqbasep = &scen->ed->seqbase; BKE_sequence_base_dupli_recursive(sce, scen, &scen->ed->seqbase, &sce->ed->seqbase, SEQ_DUPE_ALL); } } return scen; }