forked from bartvdbraak/blender
Bugfix [#28267] keyframed values for shapekeys of copied objects are
linked Shapekey actions weren't getting copied when their owner data was. This was due to the IMO totally convoluted way in which the duplicate action flags have been set up: - the function to copy animdata takes a param to specify whether actions are copied or not, but this is never touched (i.e. this always just gets FALSE passed in) - instead, we jump around in hoops later figuring out whether the userpref wants copying to occur, then fixing up the links IIRC, part of this may be due to a desire/need to not duplicate actions when dealing with NodeTree copies for multi-threaded rendering, but at the expense of complicating everything else.
This commit is contained in:
parent
a458de88b6
commit
a67562e73c
@ -287,7 +287,7 @@ int BKE_copy_animdata_id (ID *id_to, ID *id_from, const short do_action)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BKE_copy_animdata_id_action(struct ID *id)
|
void BKE_copy_animdata_id_action(ID *id)
|
||||||
{
|
{
|
||||||
AnimData *adt= BKE_animdata_from_id(id);
|
AnimData *adt= BKE_animdata_from_id(id);
|
||||||
if (adt) {
|
if (adt) {
|
||||||
|
@ -604,7 +604,7 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float UNUSED(cvalue),
|
|||||||
|
|
||||||
/* calculate the 'number' of the cycle */
|
/* calculate the 'number' of the cycle */
|
||||||
cycle= ((float)side * (evaltime - ofs) / cycdx);
|
cycle= ((float)side * (evaltime - ofs) / cycdx);
|
||||||
|
|
||||||
/* calculate the time inside the cycle */
|
/* calculate the time inside the cycle */
|
||||||
cyct= fmod(evaltime - ofs, cycdx);
|
cyct= fmod(evaltime - ofs, cycdx);
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include "DNA_curve_types.h"
|
#include "DNA_curve_types.h"
|
||||||
#include "DNA_group_types.h"
|
#include "DNA_group_types.h"
|
||||||
#include "DNA_lamp_types.h"
|
#include "DNA_lamp_types.h"
|
||||||
|
#include "DNA_key_types.h"
|
||||||
#include "DNA_material_types.h"
|
#include "DNA_material_types.h"
|
||||||
#include "DNA_mesh_types.h"
|
#include "DNA_mesh_types.h"
|
||||||
#include "DNA_meta_types.h"
|
#include "DNA_meta_types.h"
|
||||||
@ -65,6 +66,7 @@
|
|||||||
#include "BKE_group.h"
|
#include "BKE_group.h"
|
||||||
#include "BKE_lattice.h"
|
#include "BKE_lattice.h"
|
||||||
#include "BKE_library.h"
|
#include "BKE_library.h"
|
||||||
|
#include "BKE_key.h"
|
||||||
#include "BKE_main.h"
|
#include "BKE_main.h"
|
||||||
#include "BKE_material.h"
|
#include "BKE_material.h"
|
||||||
#include "BKE_mball.h"
|
#include "BKE_mball.h"
|
||||||
@ -1496,28 +1498,6 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* duplicates using userflags */
|
/* duplicates using userflags */
|
||||||
#if 0 // XXX old animation system
|
|
||||||
if(dupflag & USER_DUP_IPO) {
|
|
||||||
bConstraintChannel *chan;
|
|
||||||
id= (ID *)obn->ipo;
|
|
||||||
|
|
||||||
if(id) {
|
|
||||||
ID_NEW_US( obn->ipo)
|
|
||||||
else obn->ipo= copy_ipo(obn->ipo);
|
|
||||||
id->us--;
|
|
||||||
}
|
|
||||||
/* Handle constraint ipos */
|
|
||||||
for (chan=obn->constraintChannels.first; chan; chan=chan->next){
|
|
||||||
id= (ID *)chan->ipo;
|
|
||||||
if(id) {
|
|
||||||
ID_NEW_US( chan->ipo)
|
|
||||||
else chan->ipo= copy_ipo(chan->ipo);
|
|
||||||
id->us--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // XXX old animation system
|
|
||||||
|
|
||||||
if(dupflag & USER_DUP_ACT) {
|
if(dupflag & USER_DUP_ACT) {
|
||||||
BKE_copy_animdata_id_action(&obn->id);
|
BKE_copy_animdata_id_action(&obn->id);
|
||||||
}
|
}
|
||||||
@ -1674,8 +1654,11 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
|
|||||||
|
|
||||||
/* check if obdata is copied */
|
/* check if obdata is copied */
|
||||||
if(didit) {
|
if(didit) {
|
||||||
|
Key *key = ob_get_key(obn);
|
||||||
|
|
||||||
if(dupflag & USER_DUP_ACT) {
|
if(dupflag & USER_DUP_ACT) {
|
||||||
BKE_copy_animdata_id_action((ID *)obn->data);
|
BKE_copy_animdata_id_action((ID *)obn->data);
|
||||||
|
if(key) BKE_copy_animdata_id_action((ID*)key);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dupflag & USER_DUP_MAT) {
|
if(dupflag & USER_DUP_MAT) {
|
||||||
|
Loading…
Reference in New Issue
Block a user