[Bf-blender-cvs] [1f1c2d8ce87] blender2.8: Cleanup: Move area geometry management into an own file

Severin noreply at git.blender.org
Sat Jun 30 02:01:11 CEST 2018


Commit: 1f1c2d8ce8744c84d0c663885ef5da04c301fefc
Author: Severin
Date:   Sat Jun 30 01:56:07 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB1f1c2d8ce8744c84d0c663885ef5da04c301fefc

Cleanup: Move area geometry management into an own file

Area geometry management is quite complex and not easy to get into. We should
gradualy build an API that abstracts away this complexity.

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

M	source/blender/editors/screen/CMakeLists.txt
M	source/blender/editors/screen/screen_draw.c
M	source/blender/editors/screen/screen_edit.c
A	source/blender/editors/screen/screen_geometry.c
M	source/blender/editors/screen/screen_intern.h
M	source/blender/editors/screen/screen_ops.c

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

diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt
index ee114eba3c5..4be65f60b21 100644
--- a/source/blender/editors/screen/CMakeLists.txt
+++ b/source/blender/editors/screen/CMakeLists.txt
@@ -46,6 +46,7 @@ set(SRC
 	screen_context.c
 	screen_draw.c
 	screen_edit.c
+	screen_geometry.c
 	screen_ops.c
 	screen_user_menu.c
 	screendump.c
diff --git a/source/blender/editors/screen/screen_draw.c b/source/blender/editors/screen/screen_draw.c
index 0a693893310..b5b0d16f6a7 100644
--- a/source/blender/editors/screen/screen_draw.c
+++ b/source/blender/editors/screen/screen_draw.c
@@ -44,8 +44,8 @@
  */
 static void draw_horizontal_join_shape(ScrArea *sa, char dir, unsigned int pos)
 {
-	const float width = area_geometry_width(sa) - 1;
-	const float height = area_geometry_height(sa) - 1;
+	const float width = screen_geom_area_width(sa) - 1;
+	const float height = screen_geom_area_height(sa) - 1;
 	vec2f points[10];
 	short i;
 	float w, h;
@@ -125,8 +125,8 @@ static void draw_horizontal_join_shape(ScrArea *sa, char dir, unsigned int pos)
  */
 static void draw_vertical_join_shape(ScrArea *sa, char dir, unsigned int pos)
 {
-	const float width = area_geometry_width(sa) - 1;
-	const float height = area_geometry_height(sa) - 1;
+	const float width = screen_geom_area_width(sa) - 1;
+	const float height = screen_geom_area_height(sa) - 1;
 	vec2f points[10];
 	short i;
 	float w, h;
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index b3424ae3fb4..1b2908104f5 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -74,104 +74,6 @@
 #include "screen_intern.h"  /* own module include */
 
 
-/* ******************* screen vert, edge, area managing *********************** */
-
-static ScrVert *screen_addvert_ex(ScrAreaMap *area_map, short x, short y)
-{
-	ScrVert *sv = MEM_callocN(sizeof(ScrVert), "addscrvert");
-	sv->vec.x = x;
-	sv->vec.y = y;
-
-	BLI_addtail(&area_map->vertbase, sv);
-	return sv;
-}
-static ScrVert *screen_addvert(bScreen *sc, short x, short y)
-{
-	return screen_addvert_ex(AREAMAP_FROM_SCREEN(sc), x, y);
-}
-
-static ScrEdge *screen_addedge_ex(ScrAreaMap *area_map, ScrVert *v1, ScrVert *v2)
-{
-	ScrEdge *se = MEM_callocN(sizeof(ScrEdge), "addscredge");
-
-	BKE_screen_sort_scrvert(&v1, &v2);
-	se->v1 = v1;
-	se->v2 = v2;
-
-	BLI_addtail(&area_map->edgebase, se);
-	return se;
-}
-static ScrEdge *screen_addedge(bScreen *sc, ScrVert *v1, ScrVert *v2)
-{
-	return screen_addedge_ex(AREAMAP_FROM_SCREEN(sc), v1, v2);
-}
-
-bool scredge_is_horizontal(ScrEdge *se)
-{
-	return (se->v1->vec.y == se->v2->vec.y);
-}
-
-/**
- * \param bounds_rect: Either window or screen bounds. Used to exclude edges along window/screen edges.
- */
-ScrEdge *screen_area_map_find_active_scredge(
-        const ScrAreaMap *area_map,
-        const rcti *bounds_rect,
-        const int mx, const int my)
-{
-	int safety = U.widget_unit / 10;
-
-	CLAMP_MIN(safety, 2);
-
-	for (ScrEdge *se = area_map->edgebase.first; se; se = se->next) {
-		if (scredge_is_horizontal(se)) {
-			if ((se->v1->vec.y > bounds_rect->ymin) && (se->v1->vec.y < (bounds_rect->ymax - 1))) {
-				short min, max;
-				min = MIN2(se->v1->vec.x, se->v2->vec.x);
-				max = MAX2(se->v1->vec.x, se->v2->vec.x);
-
-				if (abs(my - se->v1->vec.y) <= safety && mx >= min && mx <= max)
-					return se;
-			}
-		}
-		else {
-			if ((se->v1->vec.x > bounds_rect->xmin) && (se->v1->vec.x < (bounds_rect->xmax - 1))) {
-				short min, max;
-				min = MIN2(se->v1->vec.y, se->v2->vec.y);
-				max = MAX2(se->v1->vec.y, se->v2->vec.y);
-
-				if (abs(mx - se->v1->vec.x) <= safety && my >= min && my <= max)
-					return se;
-			}
-		}
-	}
-
-	return NULL;
-}
-
-/* need win size to make sure not to include edges along screen edge */
-ScrEdge *screen_find_active_scredge(
-        const wmWindow *win, const bScreen *screen,
-        const int mx, const int my)
-{
-	/* Use layout size (screen excluding global areas) for screen-layout area edges */
-	rcti screen_rect;
-	ScrEdge *se;
-
-	WM_window_screen_rect_calc(win, &screen_rect);
-	se = screen_area_map_find_active_scredge(AREAMAP_FROM_SCREEN(screen), &screen_rect, mx, my);
-
-	if (!se) {
-		/* Use entire window size (screen including global areas) for global area edges */
-		rcti win_rect;
-		WM_window_rect_calc(win, &win_rect);
-		se = screen_area_map_find_active_scredge(&win->global_areas, &win_rect, mx, my);
-	}
-	return se;
-}
-
-
-
 /* adds no space data */
 static ScrArea *screen_addarea_ex(
         ScrAreaMap *area_map,
@@ -210,68 +112,6 @@ static void screen_delarea(bContext *C, bScreen *sc, ScrArea *sa)
 	MEM_freeN(sa);
 }
 
-/* return 0: no split possible */
-/* else return (integer) screencoordinate split point */
-static short testsplitpoint(ScrArea *sa, const rcti *window_rect, char dir, float fac)
-{
-	short x, y;
-	const int cur_area_width = area_geometry_width(sa);
-	const int cur_area_height = area_geometry_height(sa);
-	const short area_min_x = AREAMINX;
-	const short area_min_y = ED_area_headersize();
-	int area_min;
-
-	// area big enough?
-	if (dir == 'v' && (cur_area_width <= 2 * area_min_x)) return 0;
-	if (dir == 'h' && (cur_area_height <= 2 * area_min_y)) return 0;
-
-	// to be sure
-	CLAMP(fac, 0.0f, 1.0f);
-
-	if (dir == 'h') {
-		y = sa->v1->vec.y + round_fl_to_short(fac * cur_area_height);
-
-		area_min = area_min_y;
-
-		if (sa->v1->vec.y > window_rect->ymin) {
-			area_min += U.pixelsize;
-		}
-		if (sa->v2->vec.y < (window_rect->ymax - 1)) {
-			area_min += U.pixelsize;
-		}
-
-		if (y - sa->v1->vec.y < area_min) {
-			y = sa->v1->vec.y + area_min;
-		}
-		else if (sa->v2->vec.y - y < area_min) {
-			y = sa->v2->vec.y - area_min;
-		}
-
-		return y;
-	}
-	else {
-		x = sa->v1->vec.x + round_fl_to_short(fac * cur_area_width);
-
-		area_min = area_min_x;
-
-		if (sa->v1->vec.x > window_rect->xmin) {
-			area_min += U.pixelsize;
-		}
-		if (sa->v4->vec.x < (window_rect->xmax - 1)) {
-			area_min += U.pixelsize;
-		}
-
-		if (x - sa->v1->vec.x < area_min) {
-			x = sa->v1->vec.x + area_min;
-		}
-		else if (sa->v4->vec.x - x < area_min) {
-			x = sa->v4->vec.x - area_min;
-		}
-
-		return x;
-	}
-}
-
 ScrArea *area_split(const wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac, int merge)
 {
 	ScrArea *newa = NULL;
@@ -283,7 +123,7 @@ ScrArea *area_split(const wmWindow *win, bScreen *sc, ScrArea *sa, char dir, flo
 
 	WM_window_rect_calc(win, &window_rect);
 
-	split = testsplitpoint(sa, &window_rect, dir, fac);
+	split = screen_geom_find_area_split_point(sa, &window_rect, dir, fac);
 	if (split == 0) return NULL;
 
 	/* note regarding (fac > 0.5f) checks below.
@@ -292,15 +132,15 @@ ScrArea *area_split(const wmWindow *win, bScreen *sc, ScrArea *sa, char dir, flo
 
 	if (dir == 'h') {
 		/* new vertices */
-		sv1 = screen_addvert(sc, sa->v1->vec.x, split);
-		sv2 = screen_addvert(sc, sa->v4->vec.x, split);
+		sv1 = screen_geom_vertex_add(sc, sa->v1->vec.x, split);
+		sv2 = screen_geom_vertex_add(sc, sa->v4->vec.x, split);
 
 		/* new edges */
-		screen_addedge(sc, sa->v1, sv1);
-		screen_addedge(sc, sv1, sa->v2);
-		screen_addedge(sc, sa->v3, sv2);
-		screen_addedge(sc, sv2, sa->v4);
-		screen_addedge(sc, sv1, sv2);
+		screen_geom_edge_add(sc, sa->v1, sv1);
+		screen_geom_edge_add(sc, sv1, sa->v2);
+		screen_geom_edge_add(sc, sa->v3, sv2);
+		screen_geom_edge_add(sc, sv2, sa->v4);
+		screen_geom_edge_add(sc, sv1, sv2);
 
 		if (fac > 0.5f) {
 			/* new areas: top */
@@ -324,15 +164,15 @@ ScrArea *area_split(const wmWindow *win, bScreen *sc, ScrArea *sa, char dir, flo
 	}
 	else {
 		/* new vertices */
-		sv1 = screen_addvert(sc, split, sa->v1->vec.y);
-		sv2 = screen_addvert(sc, split, sa->v2->vec.y);
+		sv1 = screen_geom_vertex_add(sc, split, sa->v1->vec.y);
+		sv2 = screen_geom_vertex_add(sc, split, sa->v2->vec.y);
 
 		/* new edges */
-		screen_addedge(sc, sa->v1, sv1);
-		screen_addedge(sc, sv1, sa->v4);
-		screen_addedge(sc, sa->v2, sv2);
-		screen_addedge(sc, sv2, sa->v3);
-		screen_addedge(sc, sv1, sv2);
+		screen_geom_edge_add(sc, sa->v1, sv1);
+		screen_geom_edge_add(sc, sv1, sa->v4);
+		screen_geom_edge_add(sc, sa->v2, sv2);
+		screen_geom_edge_add(sc, sv2, sa->v3);
+		screen_geom_edge_add(sc, sv1, sv2);
 
 		if (fac > 0.5f) {
 			/* new areas: right */
@@ -375,15 +215,15 @@ bScreen *screen_add(Main *bmain, const char *name, const rcti *rect)
 	sc->do_refresh = true;
 	sc->redraws_flag = TIME_ALL_3D_WIN | TIME_ALL_ANIM_WIN;
 
-	sv1 = screen_addvert(sc, rect->xmin,     rect->ymin);
-	sv2 = screen_addvert(sc, rect->xmin,     rect->ymax - 1);
-	sv3 = screen_addvert(sc, rect->xmax - 1, rect->ymax - 1);
-	sv4 = screen_addvert(sc, rect->xmax - 1, rect->ymin);
+	sv1 = screen_geom_vertex_add(sc, rect->xmin,     rect->ymin);
+	sv2 = screen_geom_vertex_add(sc, rect->xmin,     rect->ymax - 1);
+	sv3 = screen_geom_vertex_add(sc, rect->xmax - 1, rect->ymax - 1);
+	sv4 = screen_geom_vertex_add(sc, rect->xmax - 1, rect->ymin);
 
-	screen_addedge(sc, sv1, sv2);
-	screen_addedge(sc, sv2, sv3);
-	screen_addedge(sc, sv3, sv4);
-	screen_addedge(sc, sv4, sv1);
+	screen_geom_edge_add(sc, sv1, sv2);
+	screen_geom_edge_add(sc, sv2, sv3);
+	screen_geom_edge_add(sc, sv3, sv4);
+	screen_geom_edge_add(sc, sv4, sv1);
 
 	/* dummy type, no spacedata */
 	screen_addarea(sc, sv1, sv2, sv3, sv4, SPACE_EMPTY);
@@ -447,15 +287,6 @@ void screen_new_activate_prepare(const wmWindow *win, bScreen *screen_new)
 }
 
 
-int area_geometry_height(const ScrArea *area)
-{
-	return area->v2->vec.y - area->v1->vec.y + 1;
-}
-int area_geometry_width(const ScrArea *area)
-{
-	return area->v4->vec.x - area->v1->vec.x + 1;
-}
-
 /* with sa as center, sb is located at: 0=W, 1=N, 2=E, 3=S */
 /* -1 = not valid check */
 /* used with join operator */
@@ -508,26 +339,26 @@ int screen_area_join(bContext *C, bScreen *scr, ScrArea *sa1, ScrArea *sa2)
 	if (dir == 0) {
 		sa1->v1 = sa2->v1;
 		sa1->v2 = sa2->v2;
-		screen_addedge(scr, sa1->v2, sa1->v3);
-		screen_addedge(scr, sa1->v1, sa1->v4);
+		screen_geom_edge_add(scr, sa1->v2, sa1->v3);
+		screen_geom_edge_add(scr, sa1->v1, sa1->v4);
 	}
 	else if (dir == 1) {
 		sa1->v2 = sa2

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list