Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Poirier <theeth@yahoo.com>2008-07-10 22:48:27 +0400
committerMartin Poirier <theeth@yahoo.com>2008-07-10 22:48:27 +0400
commitccc62d3385f6961afeed795c495d5e4667810ece (patch)
tree42fc030cbbeac8b3338aa4174820815d2ff73062 /source/blender
parentfbc105335f561400333ad3349538a0ca6e0fbd9d (diff)
Use tree length as parameter for multi resolution filtering.
This is the begining of the simplification phase (meaning less parameters to mess up users)
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenlib/BLI_graph.h5
-rw-r--r--source/blender/blenlib/intern/graph.c53
-rw-r--r--source/blender/include/reeb.h2
-rw-r--r--source/blender/src/autoarmature.c2
-rw-r--r--source/blender/src/reeb.c20
5 files changed, 73 insertions, 9 deletions
diff --git a/source/blender/blenlib/BLI_graph.h b/source/blender/blenlib/BLI_graph.h
index ae99ad5f5c7..d309d73fbee 100644
--- a/source/blender/blenlib/BLI_graph.h
+++ b/source/blender/blenlib/BLI_graph.h
@@ -24,6 +24,8 @@ typedef struct BGraph {
ListBase arcs;
ListBase nodes;
+ float length;
+
/* function pointer to deal with custom fonctionnality */
FreeArc free_arc;
FreeNode free_node;
@@ -79,6 +81,8 @@ void BLI_freeAdjacencyList(BGraph *rg);
int BLI_FlagSubgraphs(BGraph *graph);
int BLI_subtreeShape(BNode *node, BArc *rootArc, int include_root);
+float BLI_subtreeLength(BNode *node, BArc *rootArc);
+void BLI_calcGraphLength(BGraph *graph);
void BLI_replaceNode(BGraph *graph, BNode *node_src, BNode *node_replaced);
void BLI_removeDoubleNodes(BGraph *graph, float limit);
@@ -88,7 +92,6 @@ BArc * BLI_findConnectedArc(BGraph *graph, BArc *arc, BNode *v);
int BLI_isGraphCyclic(BGraph *graph);
/*------------ Symmetry handling ------------*/
-// float limit = G.scene->toolsettings->skgen_symmetry_limit;
void BLI_markdownSymmetry(BGraph *graph, BNode *root_node, float limit);
void BLI_mirrorAlongAxis(float v[3], float center[3], float axis[3]);
diff --git a/source/blender/blenlib/intern/graph.c b/source/blender/blenlib/intern/graph.c
index 9bdf286d248..a3089369c22 100644
--- a/source/blender/blenlib/intern/graph.c
+++ b/source/blender/blenlib/intern/graph.c
@@ -358,6 +358,59 @@ int BLI_subtreeShape(BNode *node, BArc *rootArc, int include_root)
}
}
+float BLI_subtreeLength(BNode *node, BArc *rootArc)
+{
+ float length = 0;
+ int i;
+
+ for(i = 0; i < node->degree; i++)
+ {
+ BArc *arc = node->arcs[i];
+
+ /* don't go back on the root arc */
+ if (arc != rootArc)
+ {
+ length = MAX2(length, BLI_subtreeLength(BLI_otherNode(arc, node), arc));
+ }
+ }
+
+ if (rootArc)
+ {
+ length += rootArc->length;
+ }
+
+ return length;
+}
+
+void BLI_calcGraphLength(BGraph *graph)
+{
+ if (BLI_isGraphCyclic(graph) == 0)
+ {
+ float length = 0;
+ int nb_subgraphs;
+ int i;
+
+ nb_subgraphs = BLI_FlagSubgraphs(graph);
+
+ for (i = 1; i <= nb_subgraphs; i++)
+ {
+ BNode *node;
+
+ for (node = graph->nodes.first; node; node = node->next)
+ {
+ /* start on an external node of the subgraph */
+ if (node->flag == i && node->degree == 1)
+ {
+ length = MAX2(length, BLI_subtreeLength(node, NULL));
+ break;
+ }
+ }
+ }
+
+ graph->length = length;
+ }
+}
+
/********************************* SYMMETRY DETECTION **************************************************/
void markdownSymmetryArc(BGraph *graph, BArc *arc, BNode *node, int level, float limit);
diff --git a/source/blender/include/reeb.h b/source/blender/include/reeb.h
index 2eca4137a79..6baaaf1ca96 100644
--- a/source/blender/include/reeb.h
+++ b/source/blender/include/reeb.h
@@ -42,6 +42,8 @@ typedef struct ReebGraph {
ListBase arcs;
ListBase nodes;
+ float length;
+
FreeArc free_arc;
FreeNode free_node;
RadialSymmetry radial_symmetry;
diff --git a/source/blender/src/autoarmature.c b/source/blender/src/autoarmature.c
index 487524865be..9af3d639894 100644
--- a/source/blender/src/autoarmature.c
+++ b/source/blender/src/autoarmature.c
@@ -74,6 +74,8 @@ typedef struct RigGraph {
ListBase arcs;
ListBase nodes;
+ float length;
+
FreeArc free_arc;
FreeNode free_node;
RadialSymmetry radial_symmetry;
diff --git a/source/blender/src/reeb.c b/source/blender/src/reeb.c
index 31a233452c3..a174c5c199f 100644
--- a/source/blender/src/reeb.c
+++ b/source/blender/src/reeb.c
@@ -310,6 +310,7 @@ ReebGraph * copyReebGraph(ReebGraph *rg)
ReebGraph *cp_rg = newReebGraph();
cp_rg->resolution = rg->resolution;
+ cp_rg->length = rg->length;
cp_rg->link_up = rg;
/* Copy nodes */
@@ -2947,11 +2948,19 @@ ReebGraph *BIF_ReebGraphMultiFromEditMesh(void)
/* Remove arcs without embedding */
filterNullReebGraph(rg);
+ /* smart filter and loop filter on basic level */
+ filterGraph(rg, SKGEN_FILTER_SMART, 0, 0);
+
repositionNodes(rg);
/* Filtering might have created degree 2 nodes, so remove them */
removeNormalNodes(rg);
+ BLI_rebuildAdjacencyList((BGraph*)rg);
+
+ /* calc length before copy, so we have same length on all levels */
+ BLI_calcGraphLength((BGraph*)rg);
+
for (i = 0; i < nb_levels; i++)
{
rg = copyReebGraph(rg);
@@ -2959,18 +2968,13 @@ ReebGraph *BIF_ReebGraphMultiFromEditMesh(void)
for (rgi = rg, i = nb_levels, previous = NULL; rgi; previous = rgi, rgi = rgi->link_up, i--)
{
- /* don't fully filter last level */
+ /* don't filter last level */
if (rgi->link_up)
{
- 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);
+ float internal_threshold = rg->length * G.scene->toolsettings->skgen_threshold_internal * (i / (float)nb_levels);
+ float external_threshold = rg->length * 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
- {
- filterGraph(rgi, SKGEN_FILTER_SMART, 0, 0);
- }
finalizeGraph(rgi, G.scene->toolsettings->skgen_postpro_passes, G.scene->toolsettings->skgen_postpro);