[Bf-blender-cvs] [120feb3] soc-2016-uv_tools: Wrap uv chart rotation up in a nice utility function

Phil Gosch noreply at git.blender.org
Mon Sep 5 15:57:36 CEST 2016


Commit: 120feb30f78479b7aca463ab1e8e3e7eee05f7c0
Author: Phil Gosch
Date:   Mon Sep 5 15:57:19 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rB120feb30f78479b7aca463ab1e8e3e7eee05f7c0

Wrap uv chart rotation up in a nice utility function

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

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 6a5031e..0a4fe6d 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -592,6 +592,38 @@ static void p_chart_uv_scale_origin(PChart *chart, float scale)
 	p_chart_uv_translate(chart, trans);
 }
 
+static void p_chart_uv_rotate(PChart *chart, float angle)
+{
+	float sine = sinf(angle);
+	float cosine = cosf(angle);
+	PVert *v;
+
+	for (v = chart->verts; v; v = v->nextlink) {
+		float oldu = v->uv[0], oldv = v->uv[1];
+		v->uv[0] = cosine * oldu - sine * oldv;
+		v->uv[1] = sine * oldu + cosine * oldv;
+	}
+}
+
+static void p_chart_uv_rotate_origin(PChart *chart, float angle)
+{
+	float minv[2], maxv[2], trans[2];
+
+	/* Get the island center */
+	p_chart_uv_bbox(chart, minv, maxv);
+	trans[0] = (minv[0] + maxv[0]) / -2.0f;
+	trans[1] = (minv[1] + maxv[1]) / -2.0f;
+
+	/* Move center to 0,0 */
+	p_chart_uv_translate(chart, trans);
+	p_chart_uv_rotate(chart, angle);
+
+	/* Move to original center */
+	trans[0] = -trans[0];
+	trans[1] = -trans[1];
+	p_chart_uv_translate(chart, trans);
+}
+
 static void UNUSED_FUNCTION(p_scale_charts)(PHandle *handle, float scale)
 {
 	PChart *chart;
@@ -3843,23 +3875,10 @@ static float p_chart_minimum_area_angle(PChart *chart)
 	return minangle;
 }
 
-static void p_chart_rotate(PChart *chart, float angle)
-{
-	float sine = sinf(angle);
-	float cosine = cosf(angle);
-	PVert *v;
-
-	for (v = chart->verts; v; v = v->nextlink) {
-		float oldu = v->uv[0], oldv = v->uv[1];
-		v->uv[0] = cosine * oldu - sine * oldv;
-		v->uv[1] = sine * oldu + cosine * oldv;
-	}
-}
-
 static void p_chart_rotate_minimum_area(PChart *chart)
 {
 	float angle = p_chart_minimum_area_angle(chart);
-	p_chart_rotate(chart, angle);
+	p_chart_uv_rotate(chart, angle);
 }
 
 /* Area Smoothing */
@@ -5981,7 +6000,7 @@ void param_irregular_pack_begin(ParamHandle *handle, float *w_area, float margin
 		/* Initial rotation */
 		rot = (int)(chart->u.ipack.sa_params[0] * (float)rot_step) * (2 * M_PI / (float)rot_step);
 		printf("init rot for chart[%i]: %f\n", i, rot);
-		p_chart_rotate(chart, rot); /* ToDo SaphireS: Rotate in origin and transform back to original pos! */
+		p_chart_uv_rotate_origin(chart, rot);
 
 		/* Get boundaries of chart*/
 		/* Find initial boundary edge */
@@ -6130,7 +6149,7 @@ void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned int
 		printf("SA param rot_rand for chart[%i]: %f\n", rand_chart, rot_rand);
 		rot = (int)(rot_rand * (float)rot_step) * (2 * M_PI / (float)rot_step);
 		printf("SA param rot for chart[%i]: %f\n", rand_chart, rot);
-		p_chart_rotate(chart, rot);
+		p_chart_uv_rotate_origin(chart, rot);
 		p_convex_hull_update(chart->u.ipack.convex_hull, true);
 		p_convex_hull_grow(chart->u.ipack.convex_hull, margin);
 		p_convex_hull_update(chart->u.ipack.convex_hull, false);




More information about the Bf-blender-cvs mailing list