Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-06-08 14:00:14 +0400
committerTon Roosendaal <ton@blender.org>2009-06-08 14:00:14 +0400
commitca6a8a233b653e4545427b00fe265566da924522 (patch)
tree1fef07ad3ac191f5c2ddba1f78f3da4054078457 /source
parent9d4ebe1088dd5f59b2a53d47eaed1d40ab5c0a3e (diff)
2.5
Preview renders: - Added proper button type (BUT_EXTRA) for preview buttons, to handle drawing better. It now first draws an alpha mask, to ensure the preview is correctly fitting inside the widget style. It then draws the outline. - Added protection for executing preview renders while regular rendering, that's not going to work...
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenlib/BLI_threads.h4
-rw-r--r--source/blender/editors/include/UI_interface.h1
-rw-r--r--source/blender/editors/interface/interface.c8
-rw-r--r--source/blender/editors/interface/interface_intern.h2
-rw-r--r--source/blender/editors/interface/interface_layout.c2
-rw-r--r--source/blender/editors/interface/interface_templates.c4
-rw-r--r--source/blender/editors/interface/interface_widgets.c54
-rw-r--r--source/blender/editors/preview/previewrender.c17
-rw-r--r--source/blender/render/intern/source/pipeline.c2
-rw-r--r--source/blender/windowmanager/intern/wm_subwindow.c10
10 files changed, 82 insertions, 22 deletions
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h
index 5a7e84c42fb..8babb5fe780 100644
--- a/source/blender/blenlib/BLI_threads.h
+++ b/source/blender/blenlib/BLI_threads.h
@@ -53,6 +53,10 @@ void BLI_unlock_thread (int type);
int BLI_system_thread_count( void ); /* gets the number of threads the system can make use of */
+ /* exported by preview render, it has to ensure render buffers are not freed while draw */
+void BLI_lock_malloc_thread(void);
+void BLI_unlock_malloc_thread(void);
+
/* ThreadedWorker is a simple tool for dispatching work to a limited number of threads in a transparent
* fashion from the caller's perspective
* */
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index f7a0fccf12b..14394b124c3 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -193,6 +193,7 @@ typedef struct uiLayout uiLayout;
#define OPTION (38<<9)
#define OPTIONN (39<<9)
#define SEARCH_MENU (40<<9)
+#define BUT_EXTRA (41<<9)
#define BUTTYPE (63<<9)
/* Drawing
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 072bc5a6feb..bef01b5a454 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -665,13 +665,7 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
/* widgets */
for(but= block->buttons.first; but; but= but->next) {
ui_but_to_pixelrect(&rect, ar, block, but);
- ui_draw_but(ar, &style, but, &rect);
-
- /* temp? roundbox defines size/location of preview, and ID type */
- if(but->type==ROUNDBOX)
- if(block->drawextra)
- block->drawextra(C, but->poin, &rect);
-
+ ui_draw_but(C, ar, &style, but, &rect);
}
/* restore matrix */
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 1cab28abc4e..18423434eef 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -403,7 +403,7 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y
void ui_draw_menu_back(struct uiStyle *style, uiBlock *block, rcti *rect);
void ui_draw_search_back(struct uiStyle *style, uiBlock *block, rcti *rect);
-extern void ui_draw_but(ARegion *ar, struct uiStyle *style, uiBut *but, rcti *rect);
+extern void ui_draw_but(const struct bContext *C, ARegion *ar, struct uiStyle *style, uiBut *but, rcti *rect);
/* theme color init */
struct ThemeUI;
void ui_widget_color_init(struct ThemeUI *tui);
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index df7d81b8806..911d10f74d7 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -51,8 +51,6 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-#include "BIF_gl.h"
-
#include "ED_util.h"
#include "ED_types.h"
#include "ED_screen.h"
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 1d44fc90ce9..020d442bfe6 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -1321,8 +1321,8 @@ void uiTemplatePreview(uiLayout *layout, ID *id)
col= uiLayoutColumn(row, 0);
uiLayoutSetKeepAspect(col, 1);
- uiDefBut(block, ROUNDBOX, 0, "", 0, 0, UI_UNIT_X*6, UI_UNIT_Y*6, id, 0.0, 0.0, 0, 0, "");
- /* extra draw is tied to roundbox for now */
+
+ uiDefBut(block, BUT_EXTRA, 0, "", 0, 0, UI_UNIT_X*6, UI_UNIT_Y*6, id, 0.0, 0.0, 0, 0, "");
uiBlockSetDrawExtraFunc(block, ED_preview_draw);
uiBlockSetHandleFunc(block, do_preview_buttons, NULL);
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index e3f850ddfd4..cb4d30213ca 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -545,12 +545,20 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
/* backdrop non AA */
if(wtb->inner) {
if(wcol->shaded==0) {
+
+ /* this is to enable drawing zero alpha masks */
+ if(wcol->inner[3]==0)
+ glDisable(GL_BLEND);
+
/* filled center, solid */
glColor4ubv(wcol->inner);
glBegin(GL_POLYGON);
for(a=0; a<wtb->totvert; a++)
glVertex2fv(wtb->inner_v[a]);
glEnd();
+
+ if(wcol->inner[3]==0)
+ glEnable(GL_BLEND);
}
else {
char col1[4], col2[4];
@@ -1596,6 +1604,46 @@ static void widget_roundbut(uiWidgetColors *wcol, rcti *rect, int state, int rou
widgetbase_draw(&wtb, wcol);
}
+static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *wt, rcti *rect)
+{
+ uiWidgetBase wtb;
+ uiWidgetColors *wcol= &wt->wcol;
+ char col[4];
+
+ /* state copy! */
+ wt->wcol= *(wt->wcol_theme);
+
+ widget_init(&wtb);
+
+ /* filled rect in back color, alpha 1 */
+ UI_GetThemeColor4ubv(TH_BACK, col);
+ col[3]= 255;
+ glColor4ubv(col);
+ glRecti(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
+
+ /* inner mask with alpha zero */
+ wcol->inner[0]= wcol->inner[1]= wcol->inner[2]= wcol->inner[3]= 0;
+ wtb.outline= 0;
+ round_box_edges(&wtb, 15, rect, 5.0f);
+ widgetbase_draw(&wtb, wcol);
+
+ if(but->block->drawextra) {
+ glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);
+ glEnable(GL_BLEND);
+
+ but->block->drawextra(C, but->poin, rect);
+
+ glDisable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ /* outline */
+ wtb.outline= 1;
+ wtb.inner= 0;
+ widgetbase_draw(&wtb, wcol);
+
+}
+
+
static void widget_disabled(rcti *rect)
{
float col[4];
@@ -1774,7 +1822,7 @@ static int widget_roundbox_set(uiBut *but, rcti *rect)
}
/* conversion from old to new buttons, so still messy */
-void ui_draw_but(ARegion *ar, uiStyle *style, uiBut *but, rcti *rect)
+void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rcti *rect)
{
bTheme *btheme= U.themes.first;
ThemeUI *tui= &btheme->tui;
@@ -1864,6 +1912,10 @@ void ui_draw_but(ARegion *ar, uiStyle *style, uiBut *but, rcti *rect)
case ROUNDBOX:
wt= widget_type(UI_WTYPE_BOX);
break;
+
+ case BUT_EXTRA:
+ widget_draw_extra_mask(C, but, widget_type(UI_WTYPE_BOX), rect);
+ break;
// XXX four old button types
case HSVCUBE:
diff --git a/source/blender/editors/preview/previewrender.c b/source/blender/editors/preview/previewrender.c
index 096282a0f58..56ec22a44b0 100644
--- a/source/blender/editors/preview/previewrender.c
+++ b/source/blender/editors/preview/previewrender.c
@@ -640,14 +640,8 @@ void ED_preview_draw(const bContext *C, void *idp, rcti *rect)
if(rres.rectf) {
if(rres.rectx==newx && rres.recty==newy) {
- glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
- glEnable(GL_BLEND);
-
glaDrawPixelsSafe(rect->xmin, rect->ymin, rres.rectx, rres.recty, rres.rectx, GL_RGBA, GL_FLOAT, rres.rectf);
ok= 1;
-
- glDisable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
}
BLI_unlock_malloc_thread();
@@ -1083,8 +1077,15 @@ static void shader_preview_free(void *customdata)
void ED_preview_shader_job(const bContext *C, void *owner, ID *id, int sizex, int sizey)
{
- wmJob *steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner);
- ShaderPreview *sp= MEM_callocN(sizeof(ShaderPreview), "shader preview");
+ wmJob *steve;
+ ShaderPreview *sp;
+
+ /* XXX ugly global still, but we can't do preview while rendering */
+ if(G.rendering)
+ return;
+
+ steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner);
+ sp= MEM_callocN(sizeof(ShaderPreview), "shader preview");
/* customdata for preview thread */
sp->scene= CTX_data_scene(C);
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 1de41d086de..e464cbd1f43 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -2432,7 +2432,7 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim)
/* general Blender frame render call */
void RE_BlenderFrame(Render *re, Scene *scene, int frame)
{
- /* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
+ /* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */
G.rendering= 1;
re->result_ok= 0;
diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c
index 67ba31b84c0..9bd55e1c5a7 100644
--- a/source/blender/windowmanager/intern/wm_subwindow.c
+++ b/source/blender/windowmanager/intern/wm_subwindow.c
@@ -307,10 +307,16 @@ void wmMultMatrix(float mat[][4])
glGetFloatv(GL_MODELVIEW_MATRIX, (float *)_curswin->winmat);
}
+static int debugpush= 0;
+
void wmPushMatrix(void)
{
if(_curswin==NULL) return;
+ if(debugpush)
+ printf("wmPushMatrix error already pushed\n");
+ debugpush= 1;
+
Mat4CpyMat4(_curswin->viewmat1, _curswin->viewmat);
Mat4CpyMat4(_curswin->winmat1, _curswin->winmat);
}
@@ -319,6 +325,10 @@ void wmPopMatrix(void)
{
if(_curswin==NULL) return;
+ if(debugpush==0)
+ printf("wmPopMatrix error nothing popped\n");
+ debugpush= 0;
+
Mat4CpyMat4(_curswin->viewmat, _curswin->viewmat1);
Mat4CpyMat4(_curswin->winmat, _curswin->winmat1);