[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38216] branches/soc-2011-avocado/blender/ source/blender/editors: Initial implementation of the stretch calculation algorithm for recursive autoseam algorithm .
shuvro sarker
shuvro05 at gmail.com
Fri Jul 8 08:16:18 CEST 2011
Revision: 38216
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38216
Author: shuvro
Date: 2011-07-08 06:16:17 +0000 (Fri, 08 Jul 2011)
Log Message:
-----------
Initial implementation of the stretch calculation algorithm for recursive autoseam algorithm. This is not yet set as a stopping criteria for the recursive algorithm.
Modified Paths:
--------------
branches/soc-2011-avocado/blender/source/blender/editors/include/ED_uvedit.h
branches/soc-2011-avocado/blender/source/blender/editors/mesh/CMakeLists.txt
branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.c
branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.h
Modified: branches/soc-2011-avocado/blender/source/blender/editors/include/ED_uvedit.h
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/editors/include/ED_uvedit.h 2011-07-08 04:43:53 UTC (rev 38215)
+++ branches/soc-2011-avocado/blender/source/blender/editors/include/ED_uvedit.h 2011-07-08 06:16:17 UTC (rev 38216)
@@ -89,6 +89,8 @@
void minimize_stretch_iteration(bContext *C, wmOperator *op, int interactive);
void minimize_stretch_exit(bContext *C, wmOperator *op, int cancel);
+
+
/* uvedit_draw.c */
void draw_uvedit_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct Object *obedit);
Modified: branches/soc-2011-avocado/blender/source/blender/editors/mesh/CMakeLists.txt
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/editors/mesh/CMakeLists.txt 2011-07-08 04:43:53 UTC (rev 38215)
+++ branches/soc-2011-avocado/blender/source/blender/editors/mesh/CMakeLists.txt 2011-07-08 06:16:17 UTC (rev 38216)
@@ -26,6 +26,7 @@
../../blenloader
../../blenlib
../../bmesh
+ ../../bmesh/intern/
../../imbuf
../../makesdna
../../makesrna
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-07-08 04:43:53 UTC (rev 38215)
+++ branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.c 2011-07-08 06:16:17 UTC (rev 38216)
@@ -27,9 +27,20 @@
*/
#include "autoseam_tools.h"
+#include "BLI_array.h"
+#include "BLI_math.h"
+#include "bmesh_private.h"
+#define EDGE_NEW 1
+#define FACE_NEW 1
+#define ELE_NEW 1
+#define FACE_MARK 2
+#define EDGE_MARK 4
+
+
+
/* ------------------------ Code from Andrea ------------------------ */
static int find_index(int index, int* face_indices, int nindices)
{
@@ -198,7 +209,7 @@
*component_size = *component_size + 1;
}
-int handle_separate_components(AUTOSEAM_Adjacency adj, int num_nodes, BMesh *bm, int recursion_depth)
+int handle_separate_components(AUTOSEAM_Adjacency adj, int num_nodes, BMesh *bm, int recursion_depth, bContext *C)
{
int i, j, k;
int remaining_nodes = num_nodes;
@@ -251,7 +262,7 @@
}
/* now call the recursive function for a single component*/
- generate_seam_recursive(bm, connected_adjacency, adj, recursion_depth);
+ generate_seam_recursive(bm, connected_adjacency, adj, recursion_depth, C);
}
@@ -263,8 +274,170 @@
autoseam_delete_adjacency(adj);
return 0;
}
-int generate_seam_recursive(BMesh *bm, AUTOSEAM_Adjacency adj, AUTOSEAM_Adjacency adj_big, int recursion_depth)
+
+
+/* The function assumes that there this is a triangulated face*/
+float stretch_of_triangulated_face(BMesh *bm, BMFace *face, bContext *C)
{
+ BMVert *vert[3];
+ BMEdge *edge[3];
+ int i = 0;
+ BMIter iter2;
+ //BMVert *v;
+ BMEdge *e;
+ float Ps[3], Pt[3];
+ float *uv[3];
+ float face_area = BM_face_area(face);
+ BMLoop *l;
+ MLoopUV *luv;
+ BMIter liter;
+ float a,c,T;
+ int j;
+ float w, tmp[3];
+// Scene *scene= CTX_data_scene(C);
+// Object *obedit= CTX_data_edit_object(C);
+
+// if(!ED_uvedit_ensure_uvs(C, scene, obedit)) {
+// //invalid case
+// return -1.0;
+// }
+
+ if (face_area <= 0.0f)
+ return 1e10f;
+
+ w= 1.0f/(2.0f*face_area);
+
+ i = 0;
+ BM_ITER(e, &iter2, bm, BM_EDGES_OF_FACE, face) {
+ //if(i == 3) break;
+ edge[i++] = e;
+ }
+
+ /* now get the texture co-ordinates */
+ i = 0;
+ BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, face) {
+ luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
+ uv[i] = luv->uv;
+ vert[i++] = l->v;
+
+ }
+
+ // compute derivatives
+ copy_v3_v3(Ps, vert[0]->co);
+ mul_v3_fl(Ps, (uv[1][1] - uv[2][1]));
+
+ copy_v3_v3(tmp, vert[1]->co);
+ mul_v3_fl(tmp, (uv[2][1] - uv[0][1]));
+ add_v3_v3(Ps, tmp);
+
+ copy_v3_v3(tmp, vert[2]->co);
+ mul_v3_fl(tmp, (uv[0][1] - uv[1][1]));
+ add_v3_v3(Ps, tmp);
+
+ mul_v3_fl(Ps, w);
+
+ copy_v3_v3(Pt, vert[0]->co);
+ mul_v3_fl(Pt, (uv[2][0] - uv[1][0]));
+
+ copy_v3_v3(tmp, vert[1]->co);
+ mul_v3_fl(tmp, (uv[0][0] - uv[2][0]));
+ add_v3_v3(Pt, tmp);
+
+ copy_v3_v3(tmp, vert[2]->co);
+ mul_v3_fl(tmp, (uv[1][0] - uv[0][0]));
+ add_v3_v3(Pt, tmp);
+
+ mul_v3_fl(Pt, w);
+
+
+ //Sander Tensor
+ a= dot_v3v3(Ps, Ps);
+ c= dot_v3v3(Pt, Pt);
+
+ T = sqrt(0.5f*(a + c));
+// if (face->flag & PFACE_FILLED)
+// T *= 0.2f;
+
+ return T;
+
+}
+
+float stretch_of_mesh(bContext *C)
+{
+
+ BMIter face_iter;
+ BMFace *face, **newfaces = NULL;
+ BLI_array_declare(newfaces);
+ float (*projectverts)[3] = NULL;
+ BLI_array_declare(projectverts);
+ int i, lastlen=0;
+ Scene *scene= CTX_data_scene(C);
+ Object *obedit= CTX_data_edit_object(C);
+ BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh;
+ BMesh *bm = em->bm;
+
+ float total_stretch = 0.0;
+
+ /*first of all, unwrap the mesh once again*/
+
+ if(!ED_uvedit_ensure_uvs(C, scene, obedit)) {
+ //invalid case
+ return -1.0;
+ }
+ ED_unwrap_lscm(scene, obedit, TRUE);
+
+ /*
+ Now calculate the stretch.
+ sum = 0;
+ for all the faces of the mesh,
+ triangulate each face,
+ for all the faces that is generated for the triangulation
+ sum += strecth_of_face
+ return sum;
+ */
+
+ i = 0;
+ for(face = BMIter_New(&face_iter, bm, BM_FACES_OF_MESH, NULL); face; face= BMIter_Step(&face_iter))
+ {
+ BMFace *temp_face;
+ int count_faces = 0;
+
+ if (lastlen < face->len) {
+ BLI_array_empty(projectverts);
+ BLI_array_empty(newfaces);
+ /* allocate necessary memories*/
+ for (lastlen=0; lastlen < face->len; lastlen++) {
+ BLI_array_growone(projectverts);
+ BLI_array_growone(projectverts);
+ BLI_array_growone(projectverts);
+ BLI_array_growone(newfaces);
+ }
+ }
+
+ /* triangulate face */
+ BM_Triangulate_Face(bm, face, projectverts, EDGE_NEW, FACE_NEW, newfaces);
+
+ for (i=0; newfaces[i]; i++) {
+ //calculate strecth for each face, update stretch
+ total_stretch += stretch_of_triangulated_face(bm, newfaces[i], C);
+ count_faces++;
+ }
+
+ /* join the triangulated faces. */
+ if(count_faces > 1) temp_face = BM_Join_TwoFaces(bm, newfaces[0], newfaces[1], NULL);
+ for(i = 2; newfaces[i]; i++ ){
+ temp_face = BM_Join_TwoFaces(bm, temp_face, newfaces[i], NULL);
+ }
+ }
+
+ BLI_array_free(projectverts);
+ BLI_array_free(newfaces);
+ return total_stretch;
+}
+
+
+int generate_seam_recursive(BMesh *bm, AUTOSEAM_Adjacency adj, AUTOSEAM_Adjacency adj_big, int recursion_depth, bContext *C)
+{
int s;
int i, j;
int num_faces;
@@ -274,6 +447,7 @@
AUTOSEAM_Adjacency adj_plus;
AUTOSEAM_Adjacency adj_minus;
+
if(!recursion_depth) {
autoseam_delete_adjacency(adj);
return 0;
@@ -296,7 +470,8 @@
//autoseam_clear_seam(bm);
autoseam_mark_seam(bm, fplus, nplus, fminus, nminus);
- /* create adj_plus */
+ printf("Stretch value is: %f\n", stretch_of_mesh(C));
+ /* create adj_plus */
adj_plus = autoseam_create_adjacency(nplus);
autoseam_set_min_value(adj_plus, min_value);
@@ -337,10 +512,14 @@
recursion_depth--;
/* recursive calls for two parts of the mesh. */
- if(nplus > 0)
- generate_seam_recursive(bm, adj_plus, adj_big, recursion_depth);
- if(nminus > 0)
- generate_seam_recursive(bm, adj_minus, adj_big, recursion_depth);
+ if(nplus > 0){
+ //can we construct PChart for this part and calculate strectch for that part?
+ generate_seam_recursive(bm, adj_plus, adj_big, recursion_depth, C);
+ }
+ if(nminus > 0){
+ //same is applicable for this part.
+ generate_seam_recursive(bm, adj_minus, adj_big, recursion_depth, C);
+ }
autoseam_delete_adjacency(adj);
@@ -387,7 +566,7 @@
autoseam_set_map_default(adj);
/* This function will call the recusive function for each of the components of bmesh*/
- handle_separate_components(adj, num_faces, bm, maxdepth);
+ handle_separate_components(adj, num_faces, bm, maxdepth, C);
/* add uvs if they don't exist yet */
if(!ED_uvedit_ensure_uvs(C, scene, obedit)) {
@@ -407,12 +586,12 @@
/* Now try to minimize the stretch of the mesh */
- minimize_stretch_init(C, op);
-
- iterations= RNA_int_get(op->ptr, "iterations");
- for(i=0; i<iterations; i++)
- minimize_stretch_iteration(C, op, 0);
- minimize_stretch_exit(C, op, 0);
+// minimize_stretch_init(C, op);
+//
+// iterations= RNA_int_get(op->ptr, "iterations");
+// for(i=0; i<iterations; i++)
+// minimize_stretch_iteration(C, op, 0);
+// minimize_stretch_exit(C, op, 0);
Modified: branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.h
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.h 2011-07-08 04:43:53 UTC (rev 38215)
+++ branches/soc-2011-avocado/blender/source/blender/editors/mesh/autoseam_tools.h 2011-07-08 06:16:17 UTC (rev 38216)
@@ -70,7 +70,7 @@
void calculate_eigen(float **dual_graph, int dimension, float **eigen_vectors, float *eigen_valuess);
int get_sign(float number);
static void autoseam_clear_seam(BMesh *bm);
-int generate_seam_recursive(BMesh *bm, AUTOSEAM_Adjacency adj, AUTOSEAM_Adjacency adj_big, int recursion_depth);
+int generate_seam_recursive(BMesh *bm, AUTOSEAM_Adjacency adj, AUTOSEAM_Adjacency adj_big, int recursion_depth, bContext *C);
More information about the Bf-blender-cvs
mailing list