Reeb multiresolution filtering, now with more than one level
This commit is contained in:
parent
de286af3f1
commit
f139e1f1b4
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue