[Bf-blender-cvs] [4eca61a] soc-2016-uv_tools: Added convex hull to chart data structures

Phil Gosch noreply at git.blender.org
Mon Jun 27 14:37:56 CEST 2016


Commit: 4eca61a6276d6509ea794f991a3bed36026c4160
Author: Phil Gosch
Date:   Mon Jun 27 14:37:21 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rB4eca61a6276d6509ea794f991a3bed36026c4160

Added convex hull to chart data structures

The convex hull is part of the new "PChartIrregularPack" union which will hold useful data during packing

I also re-enabled the line intersection code that was already there, I have to investigate if it is fine to use it or if I need to write my own

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

M	source/blender/editors/uvedit/uvedit_parametrizer.c

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

diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 0ce0dab..be1a289 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -96,6 +96,7 @@ struct PEdge;
 struct PFace;
 struct PChart;
 struct PHandle;
+struct PConvexHull;
 
 /* Simplices */
 
@@ -150,6 +151,14 @@ typedef struct PFace {
 	unsigned char flag;
 } PFace;
 
+typedef struct PConvexHull {
+	struct PVert **h_verts;
+	unsigned int nverts;
+	int right;
+	float min_v[2];
+	float max_v[2];
+} PConvexHull;
+
 enum PVertFlag {
 	PVERT_PIN = 1,
 	PVERT_SELECT = 2,
@@ -203,6 +212,10 @@ typedef struct PChart {
 			float rescale, area;
 			float size[2] /* , trans[2] */;
 		} pack;
+		struct PChartIrregularPack {
+			PConvexHull *convex_hull; /* ToDo (SaphireS): Only convex for now */
+			float area;
+		} ipack; 
 	} u;
 
 	unsigned char flag;
@@ -430,7 +443,6 @@ static float p_face_uv_area_signed(PFace *f)
 static float p_face_uv_area_combined(ParamHandle *handle)
 {
 	PHandle *phandle = (PHandle *)handle;
-	PChart *chart;
 	PFace *f;
 	float used_area = 0.0f;
 	int i;
@@ -554,7 +566,6 @@ static PBool p_intersect_line_2d_dir(float *v1, float *dir1, float *v2, float *d
 	return P_TRUE;
 }
 
-#if 0
 static PBool p_intersect_line_2d(float *v1, float *v2, float *v3, float *v4, float *isect)
 {
 	float dir1[2], dir2[2];
@@ -575,7 +586,6 @@ static PBool p_intersect_line_2d(float *v1, float *v2, float *v3, float *v4, flo
 
 	return P_TRUE;
 }
-#endif
 
 /* Topological Utilities */
 
@@ -4643,12 +4653,40 @@ void param_pack(ParamHandle *handle, float margin, bool do_rotate)
 		param_scale(handle, phandle->aspx, phandle->aspy);
 }
 
+PConvexHull *p_convex_hull_new(PChart *chart)
+{
+	PConvexHull *conv_hull = (PConvexHull *)MEM_callocN(sizeof(*conv_hull), "PConvexHull");
+	PVert **points;
+	float minv[2], maxv[2];
+	int npoint, right;
+
+	if (!p_chart_convex_hull(chart, &points, &npoint, &right))
+		printf("convex hull for chart failed!\n");
+
+	conv_hull->h_verts = points;
+	conv_hull->nverts = npoint;
+	conv_hull->right = right;
+
+	/* Fill max/min for initial positioning, with this we also know the bounding rectangle */
+	p_chart_uv_bbox(chart, conv_hull->min_v, conv_hull->max_v);
+
+	return conv_hull;
+}
+
+void p_convex_hull_delete(PConvexHull *c_hull)
+{
+	MEM_freeN(c_hull->h_verts);
+	MEM_freeN(c_hull);
+	c_hull = NULL;
+}
+
 void param_irregular_pack_begin(ParamHandle *handle)
 {
 	PHandle *phandle = (PHandle *)handle;
 	PChart *chart;
+	PVert **points;
 	PFace *f;
-	int i;
+	int npoint, right, i, j;
 
 	param_assert(phandle->state == PHANDLE_STATE_CONSTRUCTED);
 	phandle->state = PHANDLE_STATE_PACK;
@@ -4663,6 +4701,17 @@ void param_irregular_pack_begin(ParamHandle *handle)
 		for (f = chart->faces; f; f = f->nextlink) {
 			p_face_backup_uvs(f);
 		}
+
+		/* Compute convex hull for each chart */
+
+		chart->u.ipack.convex_hull = p_convex_hull_new(chart);
+
+		for (j = 0; j < chart->u.ipack.convex_hull->nverts; j++) {
+			printf("--PVert of convex hull - x: %f, y: %f\n", chart->u.ipack.convex_hull->h_verts[j]->uv[0], chart->u.ipack.convex_hull->h_verts[j]->uv[1]);
+		}
+
+		printf("Bounds of chart [%i]: minx: %f, maxx: %f, miny: %f,maxy: %f\n", i, chart->u.ipack.convex_hull->min_v[0], chart->u.ipack.convex_hull->max_v[0], chart->u.ipack.convex_hull->min_v[1], chart->u.ipack.convex_hull->max_v[1]);
+
 	}
 
 	/* ToDo (SaphireS) */
@@ -4678,7 +4727,7 @@ void param_irregular_pack_iter(ParamHandle *handle, float *w_area)
 
 	/* ToDo (SaphireS): packing solution computation */
 
-	/* Compute inner fit polygon (this probably only needs to be done once) */
+	/* Compute inner fit polygon */
 
 	/* For every chart: */
 
@@ -4699,11 +4748,19 @@ void param_irregular_pack_iter(ParamHandle *handle, float *w_area)
 void param_irregular_pack_end(ParamHandle *handle)
 {
 	PHandle *phandle = (PHandle *)handle;
+	PChart *chart;
+	int i;
 
 	param_assert(phandle->state == PHANDLE_STATE_PACK);
 	phandle->state = PHANDLE_STATE_CONSTRUCTED;
 
-	/* ToDo? (SaphireS) */
+	/* ToDo (SaphireS) */
+
+	for (i = 0; i < phandle->ncharts; i++) {
+		chart = phandle->charts[i];
+
+		p_convex_hull_delete(chart->u.ipack.convex_hull);
+	}
 
 	BLI_rng_free(phandle->rng);
 	phandle->rng = NULL;
@@ -5039,5 +5096,24 @@ void param_test(ParamHandle *handle)
 
 	float area = p_face_uv_area_combined(handle);
 
+	PHandle *phandle = (PHandle *)handle;
+	PChart *chart;
+	int npoint, right, i, j;
+	PVert **points;
+	for (i = 0; i < phandle->ncharts; i++) {
+		chart = phandle->charts[i];
+
+		if (!p_chart_convex_hull(chart, &points, &npoint, &right))
+			printf("convex hull for chart %i failed!\n", i);
+		else
+			printf("convex hull for chart %i done!\n", i);
+
+		for (j = 0; j < npoint; j++) {
+			printf("--PVert of convex hull - x: %f, y: %f\n", points[j]->uv[0], points[j]->uv[1]);
+		}
+
+		MEM_freeN(points);
+	}
+
 	printf("used uv charts area: %f\n", area);
 }




More information about the Bf-blender-cvs mailing list