Commit: 5aac8ee281ebbe0fece3fdb20d84a236c0922602
Author: Alexander Pinzon Fernandez
Date:   Mon Aug 25 09:21:59 2014 -0500
Branches: soc-2014-remesh
https://developer.blender.org/rB5aac8ee281ebbe0fece3fdb20d84a236c0922602

Clean code.
Completed all methods to compute flow lines.

===================================================================

M       source/blender/modifiers/intern/MOD_quadremesh.c
M       source/blender/modifiers/intern/MOD_quadremesh_geom.c
M       source/blender/modifiers/intern/MOD_quadremesh_geom.h

===================================================================

diff --git a/source/blender/modifiers/intern/MOD_quadremesh.c 
b/source/blender/modifiers/intern/MOD_quadremesh.c
index a04b1af..1aaffb8 100644
--- a/source/blender/modifiers/intern/MOD_quadremesh.c
+++ b/source/blender/modifiers/intern/MOD_quadremesh.c
@@ -33,59 +33,16 @@
 
 #include "MEM_guardedalloc.h"
 
-#include "BKE_mesh_mapping.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_particle.h"
 #include "BKE_deform.h"
 
 #include "MOD_util.h"
+#include "MOD_quadremesh_geom.h"
 
 
 #ifdef WITH_OPENNL
 
-#include "ONL_opennl.h"
-
-typedef struct GradientFlowLine {
-       int *edges;                             /* Pointer to a edge */
-       int *index;                             /* Pointer to a coordinate in 
cogfl*/
-       int total_verts;                /* Total number of points in a flow 
line */
-       int total_allocated;    /* Total number of points in memory */
-} GradientFlowLine;
-
-typedef struct LaplacianSystem {
-       bool command_compute_flow;
-       bool has_solution;
-       bool command_remesh;
-       int total_verts;
-       int total_edges;
-       int total_faces;
-       int total_features;
-       int total_gflines;
-       int total_gfverts;
-       char features_grp_name[64];             /* Vertex Group name */
-       float(*co)[3];                                  /* Original vertex 
coordinates */
-       float(*cogfl)[3];                               /* Vertex coordinate 
Gradient flow line */
-       float(*no)[3];                                  /* Original face normal 
*/
-       float(*gf1)[3];                                 /* Gradient Field g1 */
-       float(*gf2)[3];                                 /* Gradient Field g2 */
-       float *weights;                                 /* Feature points 
weights*/
-       float *U_field;                                 /* Initial scalar 
field*/
-       float *h1;                                              /* Sampling 
distance function h1*/
-       float *h2;                                              /* Sampling 
distance function h2*/
-       int *constraints;                               /* Feature points 
constraints*/
-       int *ringf_indices;                             /* Indices of faces per 
vertex */
-       int *ringv_indices;                             /* Indices of 
neighbors(vertex) per vertex */
-       int *ringe_indices;                             /* Indices of edges per 
vertex */
-       unsigned int(*faces)[4];                /* Copy of MFace (tessface) 
v1-v4 */
-       unsigned int(*edges)[2];                /* Copy of edges v1-v2 */
-       unsigned int(*faces_edge)[2];   /* Faces by edges  */
-       GradientFlowLine *gflines;              /* Gradien flow lines of field 
g1*/
-       MeshElemMap *ringf_map;                 /* Map of faces per vertex */
-       MeshElemMap *ringv_map;                 /* Map of vertex per vertex */
-       MeshElemMap *ringe_map;                 /* Map of edges per vertex */
-       NLContext *context;                             /* System for solve 
general implicit rotations */
-} LaplacianSystem;
-
 
 static LaplacianSystem *newLaplacianSystem(void)
 {
@@ -133,7 +90,6 @@ static LaplacianSystem *initLaplacianSystem(int totalVerts, 
int totalEdges, int
 
 static void deleteLaplacianSystem(LaplacianSystem *sys)
 {
-       int i;
        MEM_SAFE_FREE(sys->faces);
        MEM_SAFE_FREE(sys->edges);
        MEM_SAFE_FREE(sys->faces_edge);
@@ -153,51 +109,12 @@ static void deleteLaplacianSystem(LaplacianSystem *sys)
        MEM_SAFE_FREE(sys->ringf_map);
        MEM_SAFE_FREE(sys->ringv_map);
        MEM_SAFE_FREE(sys->ringe_map);
-       for (i = 0; i < sys->total_gflines; i++) {
-               MEM_SAFE_FREE(sys->gflines[i].edges);
-               MEM_SAFE_FREE(sys->gflines[i].index);
-       }
-       MEM_SAFE_FREE(sys->gflines);
        if (sys->context) {
                nlDeleteContext(sys->context);
        }
        MEM_SAFE_FREE(sys);
 }
 
-static int insertNewGradienFlowLine(LaplacianSystem *sys, int total_allocated, 
int delta){
-       int total;
-       total = total_allocated;
-       if (sys->total_gflines == total_allocated){
-               total += delta;
-               sys->gflines = MEM_reallocN(sys->gflines, 
sizeof(GradientFlowLine)* total);
-       }
-
-       return total;
-}
-
-static int insertVertToGradientFlowLine(LaplacianSystem *sys, GradientFlowLine 
*gfl, int inedge, float v[3], int total_allocated, int delta){
-       int total;
-       total = total_allocated;
-       if (sys->total_gfverts == total_allocated){
-               total += delta;
-               sys->cogfl = MEM_reallocN(sys->cogfl, sizeof(float)* 3 * total);
-       }
-
-       if (gfl->total_allocated == gfl->total_verts) {
-               gfl->total_allocated += delta;
-               gfl->edges = MEM_reallocN(gfl->edges, sizeof(int)* 
gfl->total_allocated);
-               gfl->index = MEM_reallocN(gfl->index, sizeof(int)* 
gfl->total_allocated);
-       }
-
-       copy_v3_v3(sys->cogfl[sys->total_gfverts], v);
-       
-       gfl->edges[gfl->total_verts] = inedge;
-       gfl->index[gfl->total_verts] = sys->total_gfverts;
-       sys->total_gfverts = sys->total_gfverts + 1;
-       gfl->total_verts = gfl->total_verts + 1;
-       return total;
-}
-
 static void createFaceRingMap(
        const int mvert_tot, const MFace *mface, const int mface_tot,
        MeshElemMap **r_map, int **r_indices)
@@ -495,60 +412,6 @@ static void computeScalarField(LaplacianSystem *sys)
 #endif
 }
 
-/*
-* Return 1 if the intersections exist
-* Return -1 if the intersections does not exist
-*/
-static int computeIsectLineWithEdge(float r[3], float p1[3], float p2[3], 
float ori[3], float dir[3])
-{
-       float v[3], i1[3], i2[3];
-       int i;
-       //isect_line_line_v3
-
-       add_v3_v3v3(v, ori, dir);
-       i = isect_line_line_v3(p1, p2, ori, v, i1, i2);
-       if (i == 0) {
-               sub_v3_v3v3(i1, p1, ori);
-               normalize_v3(i1);
-               if (equals_v3v3(i1, dir)) {
-                       copy_v3_v3(r, p1);
-               }
-               else {
-                       copy_v3_v3(r, p2);
-               }
-       }
-       else {
-               sub_v3_v3v3(v, i1, ori);
-               normalize_v3(v);
-               if (equals_v3v3(v, dir)) {
-                       copy_v3_v3(r, i1);
-               }
-               else {
-                       return -1;
-               }
-       }
-       return 1;
-}
-
-/*
-* Return 1 if the intersections exist
-* Return -1 if the intersections does not exist
-*/
-static int computeIsectLineWithTriangle(float r[3], float p1[3], float p2[3], 
float p3[3], float ori[3], float dir[3])
-{
-       if (computeIsectLineWithEdge(r, p1, p2, ori, dir) == 1) {
-               return 1;
-       }
-       else if (computeIsectLineWithEdge(r, p2, p3, ori, dir) == 1) {
-               return 1;
-       }
-       else if (computeIsectLineWithEdge(r, p3, p1, ori, dir) == 1) {
-               return 1;
-       }
-       return -1;
-
-}
-
 /**
 * Compute the gradient fields
 *
@@ -630,393 +493,6 @@ static void uniformRandomPointWithinFace(float r[3], 
LaplacianSystem *sys, int i
        uniformRandomPointWithinTriangle(r, sys->co[vin[0]], sys->co[vin[1]], 
sys->co[vin[2]]);
 }
 
-static int getEdgeFromVerts(LaplacianSystem *sys, int v1, int v2)
-{
-       int *eidn, nume, i;
-       nume = sys->ringe_map[v1].count;
-       eidn = sys->ringe_map[v1].indices;
-       for (i = 0; i < nume; i++) {
-               if (sys->edges[eidn[i]][0] == v2 || sys->edges[eidn[i]][1] == 
v2){
-                       return eidn[i];
-               }
-       }
-       return -1;
-}
-
-static bool isBetweenLine(float p1[3], float p2[3], float q[3]){
-       if (   (q[0] >= min_ff(p1[0], p2[0]))
-               && (q[1] >= min_ff(p1[1], p2[1]))
-               && (q[2] >= min_ff(p1[2], p2[2]))
-               && (q[0] <= max_ff(p1[0], p2[0]))
-               && (q[1] <= max_ff(p1[1], p2[1]))
-               && (q[2] <= max_ff(p1[2], p2[2]))
-               ) {
-               return true;
-       }
-       return false;
-}
-
-static int getDifferentVertexFaceEdge(LaplacianSystem *sys, int oldface, int 
inde)
-{
-       int i1, i2, i3;
-       i1 = sys->edges[inde][0];
-       i2 = sys->edges[inde][1];
-
-       if (i1 == sys->faces[oldface][0]) {
-               if (i2 == sys->faces[oldface][1]) {
-                       i3 = sys->faces[oldface][2];
-               }
-               else {
-                       i3 = sys->faces[oldface][1];
-               }
-       }
-       else if (i1 == sys->faces[oldface][1]) {
-               if (i2 == sys->faces[oldface][2]) {
-                       i3 = sys->faces[oldface][0];
-               }
-               else {
-                       i3 = sys->faces[oldface][2];
-               }
-       }
-       else {
-               if (i2 == sys->faces[oldface][0]) {
-                       i3 = sys->faces[oldface][1];
-               }
-               else {
-                       i3 = sys->faces[oldface][0];
-               }
-       }
-
-       return i3;
-}
-
-/**
-* return -1 if max U was found
-* float r[3] vertex with next point on flow line
-* float q[3] actual point on flow line.
-* int olface index of old face
-* int inde edge from origin of actual point
-*/ 
-static int nextPointFlowLine(float r[3], LaplacianSystem *sys, float q[3], int 
oldface, int inde)
-{
-       float v1[3], v2[3], dir[3], dq[3], res[3], r2[3];
-       float u1, u2, u3, u4, maxu;
-       int i1, i2, i3, i4, ix;
-       int newface, fs[2];
-       int numv, *vidn;
-       int i, iu, ie, isect;
-       i1 = sys->edges[inde][0];
-       i2 = sys->edges[inde][1];
-       copy_v3_v3(v1, sys->co[i1]);
-       copy_v3_v3(v2, sys->co[i2]);
-       i3 = getDifferentVertexFaceEdge(sys, oldface, inde);
-       u1 = sys->U_field[i1];
-       u2 = sys->U_field[i2];
-       u3 = sys->U_field[i3];
-       copy_v2_v2_int(fs, sys->faces_edge[inde]);
-       //getFacesAdjacentToEdge(fs, sys, inde);
-       newface = fs[0] == oldface ? fs[1] : fs [0];
-       i4 = getDifferentVertexFaceEdge(sys, newface, inde);
-       u4 = sys->U_field[i4];
-
-       /* The actual point on flow line correspond to a vertex in a mesh */
-       if (equals_v3v3(q, v1) || equals_v3v3(q, v2)) {
-               ix = equals_v3v3(q, v1) ? i1 : i2;
-               numv = sys->ringv_map[ix].count;
-               vidn = sys->ringf_map[ix].indices;
-               iu = -1;
-               maxu = -1000000;
-               for (i = 0; i < numv; i++) {
-                       if (vidn[i] != ix) {
-                               if (sys->U_field[ix] < sys->U_field[vidn[i]]) {
-                                       if (maxu < sys->U_field[vidn[i]]){
-                                               iu = vidn[i];
-                                               maxu = sys->U_field[vidn[i]];
-                                       }
-                                       
-                               }
-                       }
-               }
-               /*Max U found*/
-               if (iu == -1) {
-                       printf("/*Max U found*/\n");
-                       return -1;
-               }
-
-               ie = getEdgeFromVerts(sys, ix, iu);
-               
-               //getFacesAdjacentToEdge(fs, sys, ie);
-               copy_v2_v2_int(fs, sys->faces_edge[ie]);
-               i1 = ix;
-               i2 = iu;
-               i3 = getDifferentVertexFaceEdge(sys, fs[0], ie);
-               i4 = getDifferentVertexFaceEdge(sys, fs[1], ie);
-               u1 = sys->U_field[i1];
-               u2 = sys->U_field[i2];
-               u3 = sys->U_field[i3];
-               u3 = sys->U_field[i4];
-
-               /* the next point is the opposite vertex in the edge*/
-               if (u2 >= u3 && u2 >= u4 && u1 >= u3 && u1 >= u4) {
-                       copy_v3_v3(r, sys->co[iu]);
-                       return ie;
-
-               /* the next point is on face fs[0]*/
-               } else if (u3 >= u4) {
-                       copy_v3_v3(dir, sys->gf1[fs[0]]);
-                       //projectGradientOnFace(dir, sys, sys->gf1, fs[0]);
-                       mul_v3_fl(dir, 100);
-                       add_v3_v3v3(dq, q, dir);
-                       isect = isect_line_line_v3(sys->co[i3], sys->co[i2], q, 
dq, res, r2);
-                       copy_v3_v3(r, res);
-                       return ie;
-               /* the next point is on face fs[1]*/
-               } else {
-                       copy_v3_v3(dir, sys->gf1[fs[1]]);
-                       //projectGradientOnFace(dir, sys, sys->gf1, fs[1]);
-                       mul_v3_fl(dir, 100);
-                       add_v3_v3v3(dq, q, dir);
-                       isect = isect_line_line_v3(sys->co[i4], sys->co[i2], q, 
dq, res, r2);
-                       copy_v3_v3(r, res);
-                       return ie;
-               }
-
-       /* There is simple intersection on new face adjacent to inde */
-       } else if (u1 <= u3 && u2 <= u3) {
-               copy_v3_v3(dir, sys->gf1[newface]);
-               //projectGradientOnFace(dir, sys, sys->gf1, newface);
-               mul_v3_fl(dir, 100);
-               add_v3_v3v3(dq, q, dir);
-               if (u1 >= u2) {
-                       isect = isect_line_line_v3(sys->co[i3], sys->co[i1], q, 
dq, res, r2);
-                       copy_v3_v3(r, res);
-                       return getEdgeFromVerts(sys, i3, 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to