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:
-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);