transfering some ongoing work for home, nothing to see here.
This commit is contained in:
@@ -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++;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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--)
|
||||
|
||||
Reference in New Issue
Block a user