Armature Proxy bugfix: when adding constraints or bones, the proxy sync

didn't keep in mind the pose channels could change order...

Note the disabled code in readfile.c; will be finished later. It's for
debugging library dependencies.
This commit is contained in:
Ton Roosendaal 2006-11-30 21:40:11 +00:00
parent 4b982acf17
commit 51ce503cb2
2 changed files with 112 additions and 8 deletions

@ -984,9 +984,9 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
rest_pose(frompose);
pchan= pose->chanbase.first;
pchanp= frompose->chanbase.first;
for(; pchan && pchanp; pchan= pchan->next, pchanp= pchanp->next) {
for(; pchan; pchan= pchan->next) {
if(pchan->bone->layer & layer_protected) {
pchanp= get_pose_channel(frompose, pchan->name);
/* copy posechannel to temp, but restore important pointers */
pchanw= *pchanp;

@ -1722,8 +1722,9 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose)
if (!pose || !arm)
return;
/* always rebuild to match lib changes */
rebuild= (ob->id.lib==NULL && arm->id.lib);
/* always rebuild to match proxy or lib changes */
rebuild= ob->proxy || (ob->id.lib==NULL && arm->id.lib);
for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) {
lib_link_constraints(fd, (ID *)ob, &pchan->constraints);
@ -3730,6 +3731,99 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
}
}
/* ********** READ LIBRARY: facility to build a tree to see dependencies *************** */
typedef struct LibLink {
struct LibLink *prev, *next;
Main *lib;
ListBase tree;
} LibLink;
static int library_add_dependency(LibLink *llink, Main *from, Main *to)
{
LibLink *lc;
if(llink->lib==from) {
for(lc= llink->tree.first; lc; lc= lc->next)
if(lc->lib==to)
break;
if(lc)
return;
lc= MEM_callocN(sizeof(LibLink), "lib link");
BLI_addtail(&llink->tree, lc);
lc->lib= to;
if(from && from->curlib) printf("Added from %s to %s \n", from->curlib->name, to->curlib->name);
else printf("Added to %s\n", to->curlib->name);
return 1;
}
else {
for(lc= llink->tree.first; lc; lc= lc->next)
if(library_add_dependency(lc, from, to))
return 1;
}
if(from) printf("not added from %s to %s \n", from->curlib->name, to->curlib->name);
else printf("not added to %s\n", to->curlib->name);
return 0;
}
static void library_print_dependency(LibLink *llink, int level)
{
LibLink *lc;
for(lc= llink->tree.first; lc; lc= lc->next) {
int a;
for(a=0; a<level; a++)
printf(" ");
printf("%s\n", lc->lib->curlib->name);
library_print_dependency(lc, level+1);
}
}
static void library_free_dependency(LibLink *llink, int level)
{
LibLink *lc, *next;
for(lc= llink->tree.first; lc; lc= next) {
next= lc->next;
library_free_dependency(lc, 1);
}
if(level)
MEM_freeN(llink);
}
static void library_do_dependency(char mode, Main *from, Main *to)
{
static int doit= 0;
static LibLink llink;
return; // temporary disabled
if(mode=='s') { /* start */
memset(&llink, 0, sizeof(LibLink));
llink.lib= from;
doit= 1;
return;
}
if(doit==0) return;
if(mode=='e') { /* end */
library_print_dependency(&llink, 1);
library_free_dependency(&llink, 0);
doit= 0;
return;
}
if(mode=='a') {
library_add_dependency(&llink, from, to);
}
}
/* ********** READ LIBRARY *************** */
@ -3764,6 +3858,8 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main)
newmain= MEM_callocN(sizeof(Main), "directlink");
BLI_addtail(&fd->mainlist, newmain);
newmain->curlib= lib;
library_do_dependency('a', main, newmain);
}
static void lib_link_library(FileData *fd, Main *main)
@ -6227,6 +6323,9 @@ BlendFileData *blo_read_file_internal(FileData *fd, BlendReadError *error_r)
bfd->main->versionfile= fd->fileversion;
/* facility to print depsgraph */
library_do_dependency('s', bfd->main, NULL);
while(bhead) {
switch(bhead->code) {
case GLOB:
@ -6275,9 +6374,11 @@ BlendFileData *blo_read_file_internal(FileData *fd, BlendReadError *error_r)
link_global(fd, bfd, fg); /* as last */
/* removed here: check for existance of curscreen/scene, moved to kernel setup_app */
MEM_freeN(fg);
/* facility to print depsgraph */
library_do_dependency('e', NULL, NULL);
return bfd;
}
@ -6339,13 +6440,16 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old)
// BHEAD+DATA dependancy
Library *lib= (Library *)(bheadlib+1);
/* we read the lib->name directly from the bhead, potential danger (64 bits?) */
mainvar= blo_find_main(&fd->mainlist, lib->name, fd->filename);
Main *main= blo_find_main(&fd->mainlist, lib->name, fd->filename);
id= is_yet_read(mainvar, bhead);
id= is_yet_read(main, bhead);
if(id==0) {
read_libblock(fd, mainvar, bhead, LIB_READ+LIB_INDIRECT, NULL);
read_libblock(fd, main, bhead, LIB_READ+LIB_INDIRECT, NULL);
if(G.f & G_DEBUG) printf("expand_doit: other lib %s\n", lib->name);
/* for outliner dependency only */
library_do_dependency('a', mainvar, main);
}
else {
//oldnewmap_insert(fd->libmap, bhead->old, id, 1);