Reeb multiresolution filtering, now with more than one level

This commit is contained in:
Martin Poirier 2008-07-07 17:27:22 +00:00
parent de286af3f1
commit f139e1f1b4
5 changed files with 30 additions and 10 deletions

View File

@ -158,6 +158,7 @@ void verifyFaces(ReebGraph *rg);
/*********************** PUBLIC *********************************/
ReebGraph *BIF_ReebGraphFromEditMesh(void);
ReebGraph *BIF_ReebGraphMultiFromEditMesh(void);
void BIF_GlobalReebGraphFromEditMesh(void);
void BIF_GlobalReebFree(void);

View File

@ -440,6 +440,9 @@ typedef struct ToolSettings {
char skgen_postpro;
char skgen_postpro_passes;
char skgen_subdivisions[3];
char skgen_multi_level;
char tpad[7];
/* Alt+RMB option */
char edge_mode;

View File

@ -1354,9 +1354,11 @@ void BIF_retargetArmature()
Base *base;
ReebGraph *reebg;
reebg = BIF_ReebGraphFromEditMesh();
//reebg = BIF_ReebGraphFromEditMesh();
//BLI_markdownSymmetry((BGraph*)reebg, reebg->nodes.first, G.scene->toolsettings->skgen_symmetry_limit);
reebg = BIF_ReebGraphMultiFromEditMesh();
BLI_markdownSymmetry((BGraph*)reebg, reebg->nodes.first, G.scene->toolsettings->skgen_symmetry_limit);
printf("Reeb Graph created\n");

View File

@ -5036,6 +5036,8 @@ static void editing_panel_mesh_skgen_display(Object *ob, Mesh *me)
uiDefButBitS(block, TOG, SKGEN_DISP_LENGTH, REDRAWVIEW3D, "Length", 1025, 60, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Show Length");
uiDefButBitS(block, TOG, SKGEN_DISP_WEIGHT, REDRAWVIEW3D, "Weight", 1108, 60, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Show Weight");
uiDefButBitS(block, TOG, SKGEN_DISP_ORIG, REDRAWVIEW3D, "Original", 1191, 60, 84,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Show Original Graph");
uiDefButC(block, NUM, REDRAWVIEW3D, "Level:", 1025, 40, 125,19, &G.scene->toolsettings->skgen_multi_level, 0, 5, 1, 0,"Specify the level to draw");
}
static void editing_panel_mesh_skgen_retarget(Object *ob, Mesh *me)

View File

@ -2066,13 +2066,16 @@ ReebGraph * generateReebGraph(EditMesh *em, int subdivisions)
countfaces++;
if (countfaces % 100 == 0)
{
printf("face %i of %i\n", countfaces, totfaces);
printf("\rface %i of %i", countfaces, totfaces);
verifyFaces(rg);
}
#endif
}
}
printf("\n");
BLI_listbase_from_dlist(dlist, &rg->nodes);
removeNormalNodes(rg);
@ -2466,12 +2469,13 @@ int weightFromDistance(EditMesh *em)
current_eve->tmp.fp = currentWeight;
}
printf("\redge %i / %i", eIndex, totedge);
} while (select_eed != NULL);
MEM_freeN(edges);
printf("%i / %i\n", eIndex, totedge);
printf("\n");
}
}
}
@ -2819,6 +2823,7 @@ ReebGraph *BIF_ReebGraphMultiFromEditMesh(void)
EditMesh *em = G.editMesh;
ReebGraph *rg = NULL;
ReebGraph *rgi;
int i, nb_levels = 5;
if (em == NULL)
return NULL;
@ -2850,14 +2855,19 @@ ReebGraph *BIF_ReebGraphMultiFromEditMesh(void)
/* Filtering might have created degree 2 nodes, so remove them */
removeNormalNodes(rg);
rg = copyReebGraph(rg);
for (i = 0; i < nb_levels; i++)
{
rg = copyReebGraph(rg);
}
for (rgi = rg; rgi; rgi = rgi->link)
for (rgi = rg, i = nb_levels; rgi; rgi = rgi->link, i--)
{
/* don't fully filter last level */
if (rgi->link)
{
filterGraph(rgi, G.scene->toolsettings->skgen_options, G.scene->toolsettings->skgen_threshold_internal, G.scene->toolsettings->skgen_threshold_external);
float internal_threshold = G.scene->toolsettings->skgen_threshold_internal * (i / (float)nb_levels);
float external_threshold = G.scene->toolsettings->skgen_threshold_external * (i / (float)nb_levels);
filterGraph(rgi, G.scene->toolsettings->skgen_options, internal_threshold, external_threshold);
}
/* on last level, only smart filter and loop filter */
else
@ -2971,11 +2981,13 @@ void REEB_draw()
if (GLOBAL_RG->link && G.scene->toolsettings->skgen_options & SKGEN_DISP_ORIG)
{
rg = GLOBAL_RG->link;
for (rg = GLOBAL_RG; rg->link; rg = rg->link) ;
}
else
{
rg = GLOBAL_RG;
i = G.scene->toolsettings->skgen_multi_level;
for (rg = GLOBAL_RG; i && rg->link; i--, rg = rg->link) ;
}
glDisable(GL_DEPTH_TEST);