[Bf-blender-cvs] [b20cf5c] soc-2014-remesh: I add a structure to manage the flow lines. The main structure is modified to save a set of flow lines. It created a method to calculate a flow line, given the index of a vertex that will serve as the seed of the line.

Alexander Pinzon Fernandez noreply at git.blender.org
Sat Jul 12 04:00:37 CEST 2014


Commit: b20cf5c2b441cc5162c14ae3bde1d21d18d9f9a0
Author: Alexander Pinzon Fernandez
Date:   Fri Jul 11 20:57:49 2014 -0500
https://developer.blender.org/rBb20cf5c2b441cc5162c14ae3bde1d21d18d9f9a0

I add a structure to manage the flow lines.
The main structure is modified to save a set of flow lines.
It created a method to calculate a flow line, given the index of a vertex that will serve as the seed of the line.

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

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

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

diff --git a/source/blender/modifiers/intern/MOD_quadremesh.c b/source/blender/modifiers/intern/MOD_quadremesh.c
index 51226fa..1493b54 100644
--- a/source/blender/modifiers/intern/MOD_quadremesh.c
+++ b/source/blender/modifiers/intern/MOD_quadremesh.c
@@ -44,6 +44,12 @@
 
 #include "ONL_opennl.h"
 
+typedef struct GradientFlowLine {
+	int total_verts;
+	float(*co)[3];
+
+} GradientFlowLine;
+
 typedef struct LaplacianSystem {
 	bool is_matrix_computed;
 	bool has_solution;
@@ -51,6 +57,7 @@ typedef struct LaplacianSystem {
 	int total_edges;
 	int total_faces;
 	int total_features;
+	int total_gflines;
 	char features_grp_name[64];	/* Vertex Group name */
 	float(*co)[3];				/* Original vertex coordinates */
 	float(*no)[3];				/* Original face normal */
@@ -61,12 +68,25 @@ typedef struct LaplacianSystem {
 	int *constraints;			/* Feature points constraints*/
 	int *ringf_indices;			/* Indices of faces per vertex */
 	int *ringv_indices;			/* Indices of neighbors(vertex) per vertex */
+	GradientFlowLine *gflines;  /* Gradien flow lines of field g1*/
 	unsigned int(*faces)[4];	/* Copy of MFace (tessface) v1-v4 */
 	MeshElemMap *ringf_map;		/* Map of faces per vertex */
 	MeshElemMap *ringv_map;		/* Map of vertex per vertex */
 	NLContext *context;			/* System for solve general implicit rotations */
 } LaplacianSystem;
 
+static GradientFlowLine *newGradientFlowLine(LaplacianSystem *sys)
+{
+	if (sys->total_gflines == 0){
+		sys->gflines = MEM_mallocN(sizeof(GradientFlowLine), "QuadRemeshgflines");
+	}
+	else {
+		sys->gflines = MEM_reallocN(sys->gflines, sizeof(GradientFlowLine)* sys->total_gflines + 1);
+		sys->total_gflines += 1;
+	}
+	return &(sys->gflines[sys->total_gflines - 1]);
+}
+
 static LaplacianSystem *newLaplacianSystem(void)
 {
 	LaplacianSystem *sys;
@@ -119,6 +139,7 @@ static void UNUSED_FUNCTION(deleteLaplacianSystem)(LaplacianSystem *sys)
 	MEM_SAFE_FREE(sys->ringv_indices);
 	MEM_SAFE_FREE(sys->ringf_map);
 	MEM_SAFE_FREE(sys->ringv_map);
+	MEM_SAFE_FREE(sys->gflines);
 	if (sys->context) {
 		nlDeleteContext(sys->context);
 	}
@@ -289,6 +310,83 @@ static void computeGradientFields(LaplacianSystem * sys)
 	}
 }
 
+/** 
+* int ifs; Index of vertx, this vertex is the seed for trace this flow line
+*/
+static void computeGradientFlowLine(LaplacianSystem * sys, int ivs){
+	float uvalue, minU, tempminU, x[3], p[3], q[3], i1[3], i2[3];
+	int i, numf, indexf, actualf;
+	int *fidn;
+	int *vin, has4v;
+	int totalverts = 0;
+	float(*vflowline)[3] = MEM_mallocN(sizeof(float[3]) * sys->total_verts, __func__);  /* over-alloc */
+	
+
+	numf = sys->ringf_map[ivs].count;
+	/* Choose the face with minimun value of U field*/
+	minU = 1000000;
+	fidn = sys->ringf_map[ivs].indices;
+	for (i = 0; i < numf; i++) {
+		indexf = fidn[i];
+		if (sys->U_field[indexf] < minU){
+			minU = sys->U_field[indexf];
+			i = numf + 1;
+		}
+	}
+
+	vin = sys->faces[indexf];
+	has4v = vin[3] ? 4 : 3;
+	zero_v3(x);
+	for (i = 0; i < has4v; i++){
+		add_v3_v3(x, sys->co[vin[i]]);
+	}
+	mul_v3_fl(x, 1.0 / ((float)has4v));
+	copy_v3_v3(vflowline[0], x);
+	totalverts++;
+
+	tempminU = 1000000;
+	actualf = indexf;
+	while (minU < tempminU) {
+		copy_v3_v3(p, vflowline[totalverts - 1]);
+		vin = sys->faces[actualf];
+		has4v = vin[3] ? 4 : 3;
+		if (has4v == 3) {
+			/** 1 - lines are coplanar, i1 is set to intersection*/
+			if (isect_line_line_v3(sys->co[vin[0]], sys->co[vin[1]], p, sys->gf1[actualf], i1, i2) == 1) {
+				copy_v3_v3(vflowline[totalverts], i1);
+				totalverts++;
+			}
+			else if (isect_line_line_v3(sys->co[vin[1]], sys->co[vin[2]], p, sys->gf1[actualf], i1, i2) == 1) {
+				copy_v3_v3(vflowline[totalverts], i1);
+				totalverts++;
+			}
+			else if (isect_line_line_v3(sys->co[vin[2]], sys->co[vin[0]], p, sys->gf1[actualf], i1, i2) == 1) {
+				copy_v3_v3(vflowline[totalverts], i1);
+				totalverts++;
+			}
+		}
+		else{
+			if (isect_line_line_v3(sys->co[vin[0]], sys->co[vin[1]], p, sys->gf1[actualf], i1, i2) == 1) {
+				copy_v3_v3(vflowline[totalverts], i1);
+				totalverts++;
+			}
+			else if (isect_line_line_v3(sys->co[vin[1]], sys->co[vin[2]], p, sys->gf1[actualf], i1, i2) == 1) {
+				copy_v3_v3(vflowline[totalverts], i1);
+				totalverts++;
+			}
+			else if (isect_line_line_v3(sys->co[vin[2]], sys->co[vin[3]], p, sys->gf1[actualf], i1, i2) == 1) {
+				copy_v3_v3(vflowline[totalverts], i1);
+				totalverts++;
+			}
+			else if (isect_line_line_v3(sys->co[vin[3]], sys->co[vin[0]], p, sys->gf1[actualf], i1, i2) == 1) {
+				copy_v3_v3(vflowline[totalverts], i1);
+				totalverts++;
+			}
+		}
+	}
+
+		
+}
 
 static LaplacianSystem * initSystem(QuadRemeshModifierData *qmd, Object *ob, DerivedMesh *dm,
 	float(*vertexCos)[3], int numVerts)
@@ -333,6 +431,14 @@ static LaplacianSystem * initSystem(QuadRemeshModifierData *qmd, Object *ob, Der
 	memcpy(sys->weights, weights, sizeof(float)* numVerts);
 	MEM_freeN(weights);
 	MEM_freeN(constraints);
+
+	createFaceRingMap(
+		dm->getNumVerts(dm), dm->getTessFaceArray(dm), dm->getNumTessFaces(dm),
+		&sys->ringf_map, &sys->ringf_indices);
+	createVertRingMap(
+		dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm),
+		&sys->ringv_map, &sys->ringv_indices);
+
 	tessface = dm->getTessFaceArray(dm);
 
 	for (i = 0; i < sys->total_faces; i++) {




More information about the Bf-blender-cvs mailing list