[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37722] branches/soc-2011-avocado/blender: Some fixes and restructure.
shuvro sarker
shuvro05 at gmail.com
Wed Jun 22 06:23:39 CEST 2011
Revision: 37722
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37722
Author: shuvro
Date: 2011-06-22 04:23:34 +0000 (Wed, 22 Jun 2011)
Log Message:
-----------
Some fixes and restructure.
Modified Paths:
--------------
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.cpp
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.h
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamUtility.cpp
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamUtility.h
branches/soc-2011-avocado/blender/intern/autoseam/CMakeLists.txt
branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.c
Modified: branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp 2011-06-22 01:04:01 UTC (rev 37721)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp 2011-06-22 04:23:34 UTC (rev 37722)
@@ -17,7 +17,7 @@
int AutoseamAdjacency::get(int row, int col)
{
- return m_adjacency(row, col) > 0.9 ? 1 : 0;
+ return m_adjacency(row, col) > 0.05 ? 1 : 0;
}
AutoseamAdjacency::~AutoseamAdjacency()
@@ -52,10 +52,11 @@
Eigen::VectorXd evalues(es.eigenvalues());
int f = 0;
bool found = false;
- int seam_length=0;
+// int seam_length=0;
MatrixXd aplus;
MatrixXd aminus;
- while ( (f < n) && (f<30) ) {
+ //while ( (f < n) && (f<30) ) {
+ while ( (f < n)) {
// Eigenvalues seem to be sorted largest to smallest, we need the 30 smallest
// in the future only those will be calculated by the algorithm (if we use ARPACK)
AutoseamEigenspace* aes = new AutoseamEigenspace(evalues[n-f-1], es.eigenvectors().col(n-f-1));
@@ -95,6 +96,7 @@
{
int max_length= 0;
int best= 0;
+
for (int i=0; i < m_eigenspaces.size(); ++i) {
AutoseamEigenspace* aes = m_eigenspaces[i];
int len = aes->get_seam_length(m_adjacency);
Modified: branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.cpp 2011-06-22 01:04:01 UTC (rev 37721)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.cpp 2011-06-22 04:23:34 UTC (rev 37722)
@@ -1,6 +1,7 @@
#include "AutoseamEigenspace.h"
+
AutoseamEigenspace::AutoseamEigenspace(double eigenval, const Eigen::VectorXd& eigenvector)
: e(eigenval), v(eigenvector)
{
Modified: branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.h
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.h 2011-06-22 01:04:01 UTC (rev 37721)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.h 2011-06-22 04:23:34 UTC (rev 37722)
@@ -3,6 +3,7 @@
#include <vector>
#include "AutoseamUtility.h"
+//#include "bmesh.h"
class AutoseamEigenspace
{
Modified: branches/soc-2011-avocado/blender/intern/autoseam/AutoseamUtility.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamUtility.cpp 2011-06-22 01:04:01 UTC (rev 37721)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamUtility.cpp 2011-06-22 04:23:34 UTC (rev 37722)
@@ -27,6 +27,44 @@
*/
#include "AutoseamUtility.h"
+void depth_first_search(const MatrixXd& adjacency, int u, GraphNodeColor state[])
+{
+ int nNodes = adjacency.cols();
+ state[u] = Gray;
+ for (int v = 0; v < nNodes; v++) {
+ if (u != v) {
+ double adj = adjacency(u, v);
+ if ((adj>0.005) && state[v] == White) {
+ depth_first_search(adjacency, v, state);
+ }
+ }
+ }
+ state[u] = Black;
+}
+
+bool is_graph_connected(const MatrixXd& adjacency)
+{
+ int nNodes = adjacency.cols();
+ if (nNodes > 0) {
+ GraphNodeColor *state = new GraphNodeColor[nNodes];
+ for (int i = 0; i < nNodes; i++)
+ state[i] = White;
+ depth_first_search(adjacency, 0, state);
+ bool connected = true;
+ for (int i = 0; i < nNodes; i++) {
+ if ( state[i] != Black ) {
+ connected = false;
+ break;
+ }
+ }
+ delete [] state;
+ return connected;
+ } else {
+ return false;
+ }
+}
+
+
AutoseamUtility::AutoseamUtility()
{
m_A << 1.0f, 2.0f, 0.0f,
Modified: branches/soc-2011-avocado/blender/intern/autoseam/AutoseamUtility.h
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamUtility.h 2011-06-22 01:04:01 UTC (rev 37721)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamUtility.h 2011-06-22 04:23:34 UTC (rev 37722)
@@ -36,9 +36,11 @@
using Eigen::MatrixXd;
+enum GraphNodeColor { White, Gray, Black };
+bool is_graph_connected(const MatrixXd& adjacency);
+void depth_first_search(const MatrixXd& adjacency, int u, GraphNodeColor state[]);
-
class AutoseamUtility
{
public:
@@ -52,43 +54,7 @@
};
-enum GraphNodeColor { White, Gray, Black };
-static void depth_first_search(const MatrixXd& adjacency, int u, GraphNodeColor state[])
-{
- int nNodes = adjacency.cols();
- state[u] = Gray;
- for (int v = 0; v < nNodes; v++) {
- if (u != v) {
- double adj = adjacency(u, v);
- if ((adj>0.005) && state[v] == White) {
- depth_first_search(adjacency, v, state);
- }
- }
- }
- state[u] = Black;
-}
-static bool is_graph_connected(const MatrixXd& adjacency)
-{
- int nNodes = adjacency.cols();
- if (nNodes > 0) {
- GraphNodeColor *state = new GraphNodeColor[nNodes];
- for (int i = 0; i < nNodes; i++)
- state[i] = White;
- depth_first_search(adjacency, 0, state);
- bool connected = true;
- for (int i = 0; i < nNodes; i++) {
- if ( state[i] != Black ) {
- connected = false;
- break;
- }
- }
- delete [] state;
- return connected;
- } else {
- return false;
- }
-}
#endif
\ No newline at end of file
Modified: branches/soc-2011-avocado/blender/intern/autoseam/CMakeLists.txt
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/CMakeLists.txt 2011-06-22 01:04:01 UTC (rev 37721)
+++ branches/soc-2011-avocado/blender/intern/autoseam/CMakeLists.txt 2011-06-22 04:23:34 UTC (rev 37722)
@@ -26,6 +26,7 @@
set(INC
../../extern/Eigen3
+ ../../source/blender/bmesh
)
set(SRC
Modified: branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.c
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.c 2011-06-22 01:04:01 UTC (rev 37721)
+++ branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.c 2011-06-22 04:23:34 UTC (rev 37722)
@@ -64,12 +64,26 @@
}
/* ------------------------ Code from Andrea ------------------------ */
+static int find_index(int index, int* face_indices, int nindices)
+{
+ int found = 0;
+ int i;
+ for (i=0; i<nindices; ++i) {
+ if (index == face_indices[i]) {
+ found = 1;
+ break;
+ }
+ }
+ return found;
+}
+
static void autoseam_mark_seam(BMesh *bm, int *fplus, unsigned int nplus, int* fminus, unsigned int nminus)
{
BMEdge *edge;
BMFace *face;
+ BMFace *other_face;
BMIter edge_iter, face_iter;
- int i;
+
for(edge = BMIter_New(&edge_iter, bm, BM_EDGES_OF_MESH, NULL ); edge; edge= BMIter_Step(&edge_iter))
{
@@ -80,28 +94,30 @@
{
if(!BM_Boundary_Edge(edge)){
int bPlus = 0;
- int bMinus = 0;
- for (face=BMIter_New(&face_iter,bm, BM_FACES_OF_EDGE, edge); face; face=BMIter_Step(&face_iter)) {
- int fidx = BM_GetIndex(face);
- for (i=0; i<nplus; ++i) {
- if (fidx == fplus[i]) {
- bPlus = 1;
- }
- }
- /* added this if condition to avoid some unnecessary computation.*/
- if(bPlus){
- for (i=0; i<nminus; ++i) {
- if (fidx == fminus[i]) {
- bMinus = 1;
- }
- }
- }
+ int bSeam = 0;
+ face=BMIter_New(&face_iter,bm, BM_FACES_OF_EDGE, edge);
+ if (face) {
+ int idx1 = BM_GetIndex(face);
+ bPlus = find_index(idx1, fplus, nplus);
+ other_face = face=BMIter_Step(&face_iter);
+ while (other_face && !bSeam) {
+ int idx2 = BM_GetIndex(other_face);
+ if (bPlus) {
+ /* first face is in F+, so we look for face in F- for the seam */
+ bSeam = find_index(idx2, fminus, nminus);
+ } else {
+ /* first face is in F-, so we look for face in F+ for the seam */
+ bSeam = find_index(idx2, fplus, nplus);
+ }
+ other_face=BMIter_Step(&face_iter);
+ }
}
- if (bPlus && bMinus) BM_SetHFlag(edge, BM_SEAM);
+ if (bSeam) BM_SetHFlag(edge, BM_SEAM);
}
}
}
+
static void autoseam_prepare_graph(BMesh *bm)
{
BMFace *face;
More information about the Bf-blender-cvs
mailing list