[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20379] branches/blender2.5/blender/source /blender: 2.5
Ton Roosendaal
ton at blender.org
Sun May 24 15:29:29 CEST 2009
Revision: 20379
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20379
Author: ton
Date: 2009-05-24 15:29:29 +0200 (Sun, 24 May 2009)
Log Message:
-----------
2.5
First version of region-scaling. WIP commit, so bear with me a while!
- All fixed sized regions have a small 'drag' widget, on the left or top.
(not yet for free-sized regions, like 4-split).
- Mouse-over on widget changes cursor and allows drag.
- Click on widget hides/reveals.
- Fun for test; 3d view header, if high enough, draws more rows of
buttons when width is too small.
The WIP stuff;
- It doesn't save yet in files, using the "minsize" variable of region
definitions, also means other similar areas show same sizes now.
- Definitions for pref size, min/max will be added.
- Properties panel in Fcurve window draws widget on wrong place when
hidden (subdiv system needs tweak)
- Widgets don't draw perfect yet, also needs further tweaks.
But, in general it's quite fun and usable. :) Many variatians are possible,
like for real tabs, or little icons, or just click-drag on edge.
The reason to first try the widget/tab variation:
- it re-uses the "Area Action Zone" code, widgets for layouting Screens
- it's visible, hotkey-only options for screen layouts are not preferred.
- distinguish clearly area-edges from region-edges this way. Having the
cursor change shape on every edge (and block input) is probably annoying
too... but that can be tested.
Later more!
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/blenlib/BLI_arithb.h
branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c
branches/blender2.5/blender/source/blender/blenlib/intern/rct.c
branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h
branches/blender2.5/blender/source/blender/editors/screen/area.c
branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_header.c
branches/blender2.5/blender/source/blender/windowmanager/wm_event_types.h
Modified: branches/blender2.5/blender/source/blender/blenlib/BLI_arithb.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/BLI_arithb.h 2009-05-24 12:53:49 UTC (rev 20378)
+++ branches/blender2.5/blender/source/blender/blenlib/BLI_arithb.h 2009-05-24 13:29:29 UTC (rev 20379)
@@ -402,7 +402,7 @@
void VecfCubicInterpol(float *x1, float *v1, float *x2, float *v2, float t, float *x, float *v);
void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
void PointInFace2DUV(int isquad, float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
-int IsPointInTri2D(float v0[2], float v1[2], float v2[2], float pt[2]);
+int IsPointInTri2D(float v1[2], float v2[2], float v3[2], float pt[2]);
int IsPointInTri2DInts(int x1, int y1, int x2, int y2, int a, int b);
int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
Modified: branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c 2009-05-24 12:53:49 UTC (rev 20378)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c 2009-05-24 13:29:29 UTC (rev 20379)
@@ -4515,6 +4515,21 @@
}
}
+int IsPointInTri2D(float v1[2], float v2[2], float v3[2], float pt[2])
+{
+ float inp1, inp2, inp3;
+
+ inp1= (v2[0]-v1[0])*(v1[1]-pt[1]) + (v1[1]-v2[1])*(v1[0]-pt[0]);
+ inp2= (v3[0]-v2[0])*(v2[1]-pt[1]) + (v2[1]-v3[1])*(v2[0]-pt[0]);
+ inp3= (v1[0]-v3[0])*(v3[1]-pt[1]) + (v3[1]-v1[1])*(v3[0]-pt[0]);
+
+ if(inp1<=0.0f && inp2<=0.0f && inp3<=0.0f) return 1;
+ if(inp1>=0.0f && inp2>=0.0f && inp3>=0.0f) return 1;
+
+ return 0;
+}
+
+#if 0
int IsPointInTri2D(float v0[2], float v1[2], float v2[2], float pt[2])
{
/* not for quads, use for our abuse of LineIntersectsTriangleUV */
@@ -4542,6 +4557,7 @@
/* Doing this in 3D is not nice */
return LineIntersectsTriangle(p1_3d, p2_3d, v0_3d, v1_3d, v2_3d, &lambda, uv);
}
+#endif
/*
Modified: branches/blender2.5/blender/source/blender/blenlib/intern/rct.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/rct.c 2009-05-24 12:53:49 UTC (rev 20378)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/rct.c 2009-05-24 13:29:29 UTC (rev 20379)
@@ -88,17 +88,42 @@
void BLI_init_rctf(rctf *rect, float xmin, float xmax, float ymin, float ymax)
{
- rect->xmin= xmin;
- rect->xmax= xmax;
- rect->ymin= ymin;
- rect->ymax= ymax;
+ if(xmin <= xmax) {
+ rect->xmin= xmin;
+ rect->xmax= xmax;
+ }
+ else {
+ rect->xmax= xmin;
+ rect->xmin= xmax;
+ }
+ if(ymin <= ymax) {
+ rect->ymin= ymin;
+ rect->ymax= ymax;
+ }
+ else {
+ rect->ymax= ymin;
+ rect->ymin= ymax;
+ }
}
+
void BLI_init_rcti(rcti *rect, int xmin, int xmax, int ymin, int ymax)
{
- rect->xmin= xmin;
- rect->xmax= xmax;
- rect->ymin= ymin;
- rect->ymax= ymax;
+ if(xmin <= xmax) {
+ rect->xmin= xmin;
+ rect->xmax= xmax;
+ }
+ else {
+ rect->xmax= xmin;
+ rect->xmin= xmax;
+ }
+ if(ymin <= ymax) {
+ rect->ymin= ymin;
+ rect->ymax= ymax;
+ }
+ else {
+ rect->ymax= ymin;
+ rect->ymin= ymax;
+ }
}
void BLI_translate_rcti(rcti *rect, int x, int y)
Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h 2009-05-24 12:53:49 UTC (rev 20378)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen_types.h 2009-05-24 13:29:29 UTC (rev 20379)
@@ -38,27 +38,20 @@
typedef struct AZone {
struct AZone *next, *prev;
+ ARegion *ar;
int type;
- short flag;
+ /* region-azone, which of the edges */
+ short edge;
+ /* internal */
short do_draw;
- int pos;
- short x1, y1, x2, y2;
+ /* for draw */
+ short x1, y1, x2, y2, x3, y3;
+ /* for clip */
+ rcti rect;
} AZone;
/* actionzone type */
-#define AZONE_TRI 1
-#define AZONE_QUAD 2
+#define AZONE_AREA 1
+#define AZONE_REGION 2
-/* actionzone flag */
-
-/* actionzone pos */
-#define AZONE_S 1
-#define AZONE_SW 2
-#define AZONE_W 3
-#define AZONE_NW 4
-#define AZONE_N 5
-#define AZONE_NE 6
-#define AZONE_E 7
-#define AZONE_SE 8
-
#endif /* ED_SCREEN_TYPES_H__ */
Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c 2009-05-24 12:53:49 UTC (rev 20378)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c 2009-05-24 13:29:29 UTC (rev 20379)
@@ -157,7 +157,16 @@
AZone *az;
for(az= sa->actionzones.first; az; az= az->next) {
- int xs= (az->x1+az->x2)/2, ys= (az->y1+az->y2)/2;
+ int xs, ys;
+
+ if(az->type==AZONE_AREA) {
+ xs= (az->x1+az->x2)/2;
+ ys= (az->y1+az->y2)/2;
+ }
+ else {
+ xs= az->x3;
+ ys= az->y3;
+ }
/* test if inside */
if(BLI_in_rcti(&ar->winrct, xs, ys)) {
@@ -187,6 +196,28 @@
fdrawline(xmin, ymax-2*dy+1, xmax-2*dx+1, ymin);
}
+static void region_draw_azone(ScrArea *sa, AZone *az)
+{
+ if(az->ar==NULL) return;
+
+ UI_SetTheme(sa->spacetype, az->ar->type->regionid);
+
+ UI_ThemeColor(TH_BACK);
+ glBegin(GL_TRIANGLES);
+ glVertex2s(az->x1, az->y1);
+ glVertex2s(az->x2, az->y2);
+ glVertex2s(az->x3, az->y3);
+ glEnd();
+
+ UI_ThemeColorShade(TH_BACK, 50);
+ sdrawline(az->x1, az->y1, az->x3, az->y3);
+
+ UI_ThemeColorShade(TH_BACK, -50);
+ sdrawline(az->x2, az->y2, az->x3, az->y3);
+
+}
+
+
/* only exported for WM */
void ED_area_overdraw(bContext *C)
{
@@ -204,9 +235,11 @@
AZone *az;
for(az= sa->actionzones.first; az; az= az->next) {
if(az->do_draw) {
- if(az->type==AZONE_TRI) {
+ if(az->type==AZONE_AREA)
area_draw_azone(az->x1, az->y1, az->x2, az->y2);
- }
+ else if(az->type==AZONE_REGION)
+ region_draw_azone(sa, az);
+
az->do_draw= 0;
}
}
@@ -360,8 +393,124 @@
}
}
+/* ************************************************************ */
+
+
+#define AZONESPOT 12
+static void area_azone_initialize(ScrArea *sa)
+{
+ AZone *az;
+
+ /* reinitalize entirely, regions add azones too */
+ BLI_freelistN(&sa->actionzones);
+
+ /* set area action zones */
+ az= (AZone *)MEM_callocN(sizeof(AZone), "actionzone");
+ BLI_addtail(&(sa->actionzones), az);
+ az->type= AZONE_AREA;
+ az->x1= sa->totrct.xmin;
+ az->y1= sa->totrct.ymin;
+ az->x2= sa->totrct.xmin + AZONESPOT-1;
+ az->y2= sa->totrct.ymin + AZONESPOT-1;
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
+
+ az= (AZone *)MEM_callocN(sizeof(AZone), "actionzone");
+ BLI_addtail(&(sa->actionzones), az);
+ az->type= AZONE_AREA;
+ az->x1= sa->totrct.xmax+1;
+ az->y1= sa->totrct.ymax+1;
+ az->x2= sa->totrct.xmax-AZONESPOT+1;
+ az->y2= sa->totrct.ymax-AZONESPOT+1;
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
+}
+
+static void region_azone_initialize(ScrArea *sa, ARegion *ar, char edge)
+{
+ AZone *az, *azt;
+
+ az= (AZone *)MEM_callocN(sizeof(AZone), "actionzone");
+ BLI_addtail(&(sa->actionzones), az);
+ az->type= AZONE_REGION;
+ az->ar= ar;
+ az->edge= edge;
+
+ if(edge=='t') {
+ az->x1= ar->winrct.xmin+AZONESPOT;
+ az->y1= ar->winrct.ymax;
+ az->x2= ar->winrct.xmin+2*AZONESPOT;
+ az->y2= ar->winrct.ymax;
+ az->x3= (az->x1+az->x2)/2;
+ az->y3= az->y2+AZONESPOT/2;
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y3);
+ }
+ else if(edge=='b') {
+ az->x1= ar->winrct.xmin+AZONESPOT;
+ az->y1= ar->winrct.ymin;
+ az->x2= ar->winrct.xmin+2*AZONESPOT;
+ az->y2= ar->winrct.ymin;
+ az->x3= (az->x1+az->x2)/2;
+ az->y3= az->y2-AZONESPOT/2;
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y3, az->y1);
+ }
+ else if(edge=='l') {
+ az->x1= ar->winrct.xmin;
+ az->y1= ar->winrct.ymax-AZONESPOT;
+ az->x2= ar->winrct.xmin;
+ az->y2= ar->winrct.ymax-2*AZONESPOT;
+ az->x3= az->x2-AZONESPOT/2;
+ az->y3= (az->y1+az->y2)/2;
+ BLI_init_rcti(&az->rect, az->x3, az->x1, az->y1, az->y2);
+ }
+ else { // if(edge=='r') {
+ az->x1= ar->winrct.xmax;
+ az->y1= ar->winrct.ymax-AZONESPOT;
+ az->x2= ar->winrct.xmax;
+ az->y2= ar->winrct.ymax-2*AZONESPOT;
+ az->x3= az->x2+AZONESPOT/2;
+ az->y3= (az->y1+az->y2)/2;
+ BLI_init_rcti(&az->rect, az->x1, az->x3, az->y1, az->y2);
+ }
+
+ /* if more azones on 1 spot, set offset */
+ for(azt= sa->actionzones.first; azt; azt= azt->next) {
+ if(az!=azt) {
+ if(az->x1==azt->x1 && az->y1==azt->y1) {
+ if(edge=='t' || edge=='b') {
+ az->x1+= AZONESPOT;
+ az->x2+= AZONESPOT;
+ az->x3+= AZONESPOT;
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y3);
+ }
+ else {
+ az->y1-= AZONESPOT;
+ az->y2-= AZONESPOT;
+ az->y3-= AZONESPOT;
+ BLI_init_rcti(&az->rect, az->x1, az->x3, az->y1, az->y2);
+ }
+ }
+ }
+ }
+
+}
+
+
/* *************************************************************** */
+static void region_azone_add(ScrArea *sa, ARegion *ar, int alignment)
+{
+ /* edge code (t b l r) is where azone will be drawn */
+
+ if(alignment==RGN_ALIGN_TOP)
+ region_azone_initialize(sa, ar, 'b');
+ else if(alignment==RGN_ALIGN_BOTTOM)
+ region_azone_initialize(sa, ar, 't');
+ else if(ELEM(alignment, RGN_ALIGN_RIGHT, RGN_OVERLAP_RIGHT))
+ region_azone_initialize(sa, ar, 'l');
+ else if(ELEM(alignment, RGN_ALIGN_LEFT, RGN_OVERLAP_LEFT))
+ region_azone_initialize(sa, ar, 'r');
+
+}
+
/* dir is direction to check, not the splitting edge direction! */
static int rct_fits(rcti *rect, char dir, int size)
{
@@ -373,7 +522,7 @@
}
}
-static void region_rect_recursive(ARegion *ar, rcti *remainder, int quad)
+static void region_rect_recursive(ScrArea *sa, ARegion *ar, rcti *remainder, int quad)
{
rcti *remainder_prev= remainder;
int prefsizex, prefsizey;
@@ -382,6 +531,7 @@
if(ar==NULL)
return;
+ /* no returns in function, winrct gets set in the end again */
BLI_init_rcti(&ar->winrct, 0, 0, 0, 0);
/* for test; allow split of previously defined region */
@@ -540,7 +690,27 @@
ar->prev->winy= ar->prev->winrct.ymax - ar->prev->winrct.ymin + 1;
}
}
- region_rect_recursive(ar->next, remainder, quad);
+
+ /* set winrect for azones */
+ if(ar->flag & (RGN_FLAG_HIDDEN|RGN_FLAG_TOO_SMALL)) {
+ ar->winrct= *remainder;
+
+ if(alignment==RGN_ALIGN_TOP)
+ ar->winrct.ymin= ar->winrct.ymax;
+ else if(alignment==RGN_ALIGN_BOTTOM)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list