transfering some ongoing work for home, nothing to see here.

This commit is contained in:
Martin Poirier
2008-08-20 21:34:49 +00:00
parent a3337a15f0
commit e04b899e81
4 changed files with 55 additions and 20 deletions

View File

@@ -100,12 +100,12 @@ static void addArcToNodeAdjacencyList(BNode *node, BArc *arc)
node->flag++;
}
void BLI_buildAdjacencyList(BGraph *rg)
void BLI_buildAdjacencyList(BGraph *graph)
{
BNode *node;
BArc *arc;
for(node = rg->nodes.first; node; node = node->next)
for(node = graph->nodes.first; node; node = node->next)
{
if (node->arcs != NULL)
{
@@ -118,13 +118,13 @@ void BLI_buildAdjacencyList(BGraph *rg)
node->flag = 0;
}
for(arc = rg->arcs.first; arc; arc= arc->next)
for(arc = graph->arcs.first; arc; arc= arc->next)
{
addArcToNodeAdjacencyList(arc->head, arc);
addArcToNodeAdjacencyList(arc->tail, arc);
}
for(node = rg->nodes.first; node; node = node->next)
for(node = graph->nodes.first; node; node = node->next)
{
if (node->degree != node->flag)
{
@@ -133,7 +133,7 @@ void BLI_buildAdjacencyList(BGraph *rg)
}
}
void BLI_rebuildAdjacencyListForNode(BGraph* rg, BNode *node)
void BLI_rebuildAdjacencyListForNode(BGraph* graph, BNode *node)
{
BArc *arc;
@@ -147,7 +147,7 @@ void BLI_rebuildAdjacencyListForNode(BGraph* rg, BNode *node)
/* temporary use to indicate the first index available in the lists */
node->flag = 0;
for(arc = rg->arcs.first; arc; arc= arc->next)
for(arc = graph->arcs.first; arc; arc= arc->next)
{
if (arc->head == node)
{
@@ -165,11 +165,11 @@ void BLI_rebuildAdjacencyListForNode(BGraph* rg, BNode *node)
}
}
void BLI_freeAdjacencyList(BGraph *rg)
void BLI_freeAdjacencyList(BGraph *graph)
{
BNode *node;
for(node = rg->nodes.first; node; node = node->next)
for(node = graph->nodes.first; node; node = node->next)
{
if (node->arcs != NULL)
{
@@ -179,11 +179,11 @@ void BLI_freeAdjacencyList(BGraph *rg)
}
}
int BLI_hasAdjacencyList(BGraph *rg)
int BLI_hasAdjacencyList(BGraph *graph)
{
BNode *node;
for(node = rg->nodes.first; node; node = node->next)
for(node = graph->nodes.first; node; node = node->next)
{
if (node->arcs == NULL)
{
@@ -233,12 +233,14 @@ void BLI_replaceNode(BGraph *graph, BNode *node_src, BNode *node_replaced)
if (arc->head == node_replaced)
{
arc->head = node_src;
node_replaced->degree--;
node_src->degree++;
}
if (arc->tail == node_replaced)
{
arc->tail = node_src;
node_replaced->degree--;
node_src->degree++;
}

View File

@@ -53,6 +53,7 @@ typedef struct ReebGraph {
int resolution;
int totnodes;
struct EdgeHash *emap;
int multi_level;
struct ReebGraph *link_up; /* for multi resolution filtering, points to higher levels */
} ReebGraph;
@@ -79,6 +80,7 @@ typedef struct ReebNode {
int index;
float weight;
int multi_level;
struct ReebNode *link_down; /* for multi resolution filtering, points to lower levels, if present */
struct ReebNode *link_up;
} ReebNode;
@@ -177,6 +179,8 @@ ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node);
ReebNode *BIF_NodeFromIndex(ReebArc *arc, ReebNode *node);
ReebNode *BIF_lowestLevelNode(ReebNode *node);
ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node);
void REEB_freeGraph(ReebGraph *rg);
void REEB_exportGraph(ReebGraph *rg, int count);
void REEB_draw();

View File

@@ -1833,13 +1833,12 @@ void *exec_retargetArctoArc(void *param)
static void matchMultiResolutionNode(RigGraph *rigg, RigNode *inode, ReebNode *top_node)
{
ReebNode *enode;
ReebNode *enode = top_node;
ReebGraph *reebg = BIF_graphForMultiNode(rigg->link_mesh, enode);
int ishape, eshape;
enode = top_node;
ishape = BLI_subtreeShape((BGraph*)rigg, (BNode*)inode, NULL, 0) % SHAPE_LEVELS;
eshape = BLI_subtreeShape((BGraph*)rigg->link_mesh, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
eshape = BLI_subtreeShape((BGraph*)reebg, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
inode->link_mesh = enode;
@@ -1848,23 +1847,26 @@ static void matchMultiResolutionNode(RigGraph *rigg, RigNode *inode, ReebNode *t
inode->link_mesh = enode;
enode = enode->link_down;
eshape = BLI_subtreeShape((BGraph*)rigg->link_mesh, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
reebg = BIF_graphForMultiNode(rigg->link_mesh, enode); /* replace with call to link_down once that exists */
eshape = BLI_subtreeShape((BGraph*)reebg, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
}
}
static void matchMultiResolutionArc(RigGraph *rigg, RigNode *start_node, RigArc *next_iarc, ReebArc *next_earc)
{
ReebNode *enode = next_earc->head;
ReebGraph *reebg = BIF_graphForMultiNode(rigg->link_mesh, enode);
int ishape, eshape;
ishape = BLI_subtreeShape((BGraph*)rigg, (BNode*)start_node, (BArc*)next_iarc, 1) % SHAPE_LEVELS;
eshape = BLI_subtreeShape((BGraph*)rigg->link_mesh, (BNode*)enode, (BArc*)next_earc, 1) % SHAPE_LEVELS;
eshape = BLI_subtreeShape((BGraph*)reebg, (BNode*)enode, (BArc*)next_earc, 1) % SHAPE_LEVELS;
while (ishape != eshape && next_earc->link_up)
{
next_earc->flag = 1; // mark previous as taken, to prevent backtrack on lower levels
next_earc = next_earc->link_up;
reebg = reebg->link_up;
enode = next_earc->head;
eshape = BLI_subtreeShape((BGraph*)rigg->link_mesh, (BNode*)enode, (BArc*)next_earc, 1) % SHAPE_LEVELS;
}
@@ -1896,7 +1898,7 @@ static void matchMultiResolutionStartingNode(RigGraph *rigg, ReebGraph *reebg, R
enode = reebg->nodes.first;
eshape = BLI_subtreeShape((BGraph*)rigg, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
eshape = BLI_subtreeShape((BGraph*)reebg, (BNode*)enode, NULL, 0) % SHAPE_LEVELS;
}
inode->link_mesh = enode;
@@ -1943,6 +1945,19 @@ static void findCorrespondingArc(RigGraph *rigg, RigArc *start_arc, RigNode *sta
/* not found, try at higher nodes (lower node might have filtered internal arcs, messing shape of tree */
if (next_iarc->link_mesh == NULL)
{
printf("--------------------------\n");
printf("NO CORRESPONDING ARC FOUND - GOING TO HIGHER LEVELS\n");
RIG_printArcBones(next_iarc);
printf("LOOKING FOR\n");
printf("flag %i -- symmetry level %i -- symmetry flag %i\n", 0, symmetry_level, symmetry_flag);
printf("CANDIDATES\n");
for(i = 0; i < enode->degree; i++)
{
next_earc = (ReebArc*)enode->arcs[i];
printf("flag %i -- symmetry level %i -- symmetry flag %i\n", next_earc->flag, next_earc->symmetry_level, next_earc->symmetry_flag);
}
if (enode->link_up)
{
start_node->link_mesh = enode->link_up;

View File

@@ -311,7 +311,7 @@ ReebArc * copyArc(ReebGraph *rg, ReebArc *arc)
return cp_arc;
}
ReebGraph * copyReebGraph(ReebGraph *rg)
ReebGraph * copyReebGraph(ReebGraph *rg, int level)
{
ReebNode *node;
ReebArc *arc;
@@ -320,11 +320,13 @@ ReebGraph * copyReebGraph(ReebGraph *rg)
cp_rg->resolution = rg->resolution;
cp_rg->length = rg->length;
cp_rg->link_up = rg;
cp_rg->multi_level = level;
/* Copy nodes */
for (node = rg->nodes.first; node; node = node->next)
{
copyNode(cp_rg, node);
ReebNode *cp_node = copyNode(cp_rg, node);
cp_node->multi_level = level;
}
/* Copy arcs */
@@ -338,6 +340,18 @@ ReebGraph * copyReebGraph(ReebGraph *rg)
return cp_rg;
}
ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node)
{
ReebGraph *multi_rg = rg;
while(multi_rg && multi_rg->multi_level != node->multi_level)
{
multi_rg = multi_rg->link_up;
}
return multi_rg;
}
ReebEdge * copyEdge(ReebEdge *edge)
{
ReebEdge *newEdge = NULL;
@@ -3383,7 +3397,7 @@ ReebGraph *BIF_ReebGraphMultiFromEditMesh(void)
for (i = 0; i < nb_levels; i++)
{
rg = copyReebGraph(rg);
rg = copyReebGraph(rg, i + 1);
}
for (rgi = rg, i = nb_levels, previous = NULL; rgi; previous = rgi, rgi = rgi->link_up, i--)