[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49747] branches/soc-2012-bratwurst/source /blender/editors/uvedit/uvedit_parametrizer.c: Isomap Unwrapper
Antony Riakiotakis
kalast at gmail.com
Fri Aug 10 01:59:29 CEST 2012
Revision: 49747
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49747
Author: psy-fi
Date: 2012-08-09 23:59:28 +0000 (Thu, 09 Aug 2012)
Log Message:
-----------
Isomap Unwrapper
=================
* Cleanup, separate common code to function
Modified Paths:
--------------
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer.c
Modified: branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer.c 2012-08-09 23:00:57 UTC (rev 49746)
+++ branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_parametrizer.c 2012-08-09 23:59:28 UTC (rev 49747)
@@ -3076,6 +3076,57 @@
HeapNode * node;
} GraphVertInfo;
+void p_chart_isomap_iterate_graph_edge(int i0, PEdge *p_edge, PBool inverted, float *dist_map, int nverts, GraphVertInfo *visited, Heap *graph_heap)
+{
+ PBool update = P_FALSE;
+
+ int ij;
+ int ic;
+ float sum_dist;
+ float d[3];
+
+ PVert *p_cent;
+ PVert *p_viter;
+
+ if(inverted) {
+ p_cent = p_edge->next->vert;
+ p_viter = p_edge->vert;
+ } else {
+ p_cent = p_edge->vert;
+ p_viter = p_edge->next->vert;
+ }
+
+ ic = p_cent->u.id;
+ ij = p_viter->u.id;
+
+ d[0] = p_viter->co[0] - p_cent->co[0];
+ d[1] = p_viter->co[1] - p_cent->co[1];
+ d[2] = p_viter->co[2] - p_cent->co[2];
+
+ sum_dist = dist_map[ic*nverts + i0] + sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+ update = (dist_map[i0*nverts + ij] > sum_dist);
+
+ /* add pverts in the hash */
+ if(update) {
+ dist_map[i0*nverts + ij] = dist_map[ij*nverts + i0] = sum_dist;
+ if(!visited[ij].removed) {
+ if (visited[ij].node) {
+ BLI_heap_remove(graph_heap, visited[ij].node);
+ }
+
+ visited[ij].node = BLI_heap_insert(graph_heap, sum_dist , p_viter);
+ }
+ }
+ if(!visited[ij].removed && !visited[ij].node) {
+ visited[ij].node = BLI_heap_insert(graph_heap, sum_dist , p_viter);
+ }
+
+ /* assert that one of the two edge vertices is actually the p_cent vertex */
+ //BLI_assert (e_iter->vert == p_cent || e_iter->next->vert == p_cent);
+ /* also assert that one of the two edge vertices is actually the p_viter vertex */
+ //BLI_assert (e_iter->vert == p_viter || e_iter->next->vert == p_viter);
+}
+
static PBool p_chart_lscm_solve(PHandle *handle, PChart *chart)
{
enum UnwrapMethods method = handle->method;
@@ -3112,13 +3163,9 @@
/* iterate through the edge ring vertices of p0 and calculate geodesic
* distances */
int ic = p_cent->u.id;
- char update = FALSE;
/* iterate through all edges and update distances to distance matrix */
- PEdge *e_iter, *e_init, *e_ipair;
- PVert *p_viter;
- int ij;
- float sum_dist;
+ PEdge *e_iter, *e_init;
/* iterating through this vert means we no longer need to update the graph for
* it (distances may need to be updated though) */
@@ -3126,66 +3173,28 @@
visited[ic].node = NULL;
e_iter = e_init = p_cent->edge;
- e_ipair = e_init->pair;
- p_viter = e_iter->next->vert;
- ij = p_viter->u.id;
- sum_dist = dist_map[ic*nverts + i0] + p_edge_length(e_iter);
- update = (dist_map[i0*nverts + ij] > sum_dist);
-
- /* add pverts in the heap */
- if(update) {
- dist_map[i0*nverts + ij] = dist_map[ij*nverts + i0] = sum_dist;
- if(!visited[ij].removed) {
- if (visited[ij].node) {
- BLI_heap_remove(graph_heap, visited[ij].node);
- }
-
- visited[ij].node = BLI_heap_insert(graph_heap, sum_dist , p_viter);
- }
- }
- if(!visited[ij].removed && !visited[ij].node) {
- visited[ij].node = BLI_heap_insert(graph_heap, sum_dist , p_viter);
- }
do {
- update = FALSE;
+ p_chart_isomap_iterate_graph_edge(i0, e_iter, P_FALSE,
+ dist_map, nverts, visited, graph_heap);
e_iter = e_iter->next->next;
- p_viter = e_iter->vert;
- ij = p_viter->u.id;
- sum_dist = dist_map[ic*nverts + i0] + p_edge_length(e_iter);
- update = (dist_map[i0*nverts + ij] > sum_dist);
- /* add pverts in the hash */
- if(update) {
- dist_map[i0*nverts + ij] = dist_map[ij*nverts + i0] = sum_dist;
- if(!visited[ij].removed) {
- if (visited[ij].node) {
- BLI_heap_remove(graph_heap, visited[ij].node);
- }
-
- visited[ij].node = BLI_heap_insert(graph_heap, sum_dist , p_viter);
- }
+ if(e_iter->pair)
+ e_iter = e_iter->pair;
+ else {
+ p_chart_isomap_iterate_graph_edge(i0, e_iter, P_TRUE,
+ dist_map, nverts, visited, graph_heap);
+ break;
}
- if(!visited[ij].removed && !visited[ij].node) {
- visited[ij].node = BLI_heap_insert(graph_heap, sum_dist , p_viter);
- }
- /* assert that one of the two edge vertices is actually the p_cent vertex */
- BLI_assert (e_iter->vert == p_cent || e_iter->next->vert == p_cent);
- /* also assert that one of the two edge vertices is actually the p_viter vertex */
- BLI_assert (e_iter->vert == p_viter || e_iter->next->vert == p_viter);
+ } while (e_iter != e_init);
- e_iter = e_iter->pair;
- } while (e_iter && e_iter != e_init);
-
- BLI_assert(e_iter || !e_ipair);
-
if(BLI_heap_size(graph_heap) > 0) {
p_cent = BLI_heap_popmin(graph_heap);
-
}
- else
+ else {
p_cent = NULL;
+ }
}
}
More information about the Bf-blender-cvs
mailing list