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
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/intern/material.c5
-rw-r--r--source/blender/editors/interface/interface_templates.c10
-rw-r--r--source/blender/editors/render/render_preview.c21
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c10
4 files changed, 30 insertions, 16 deletions
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index cac41e457a6..dae00636370 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -85,7 +85,8 @@ void free_material(Material *ma)
BKE_free_animdata((ID *)ma);
- BKE_previewimg_free(&ma->preview);
+ if(ma->preview)
+ BKE_previewimg_free(&ma->preview);
BKE_icon_delete((struct ID*)ma);
ma->id.icon_id = 0;
@@ -250,7 +251,7 @@ Material *localize_material(Material *ma)
if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col);
if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec);
- if (ma->preview) man->preview = BKE_previewimg_copy(ma->preview);
+ man->preview = NULL;
if(ma->nodetree) {
man->nodetree= ntreeLocalize(ma->nodetree);
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 03e7f058b05..d4f246fe2b7 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -1957,7 +1957,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
/************************* List Template **************************/
-static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon)
+static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon, int big)
{
ID *id= NULL;
int icon;
@@ -1978,7 +1978,7 @@ static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon)
/* get icon from ID */
if(id) {
- icon= ui_id_icon_get(C, id, 1);
+ icon= ui_id_icon_get(C, id, big);
if(icon)
return icon;
@@ -2007,7 +2007,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
sub= uiLayoutRow(overlap, 0);
/* retrieve icon and name */
- icon= list_item_icon_get(C, itemptr, rnaicon);
+ icon= list_item_icon_get(C, itemptr, rnaicon, 0);
if(icon == ICON_NULL || icon == ICON_DOT)
icon= 0;
@@ -2152,7 +2152,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
if(i == 9)
row= uiLayoutRow(col, 0);
- icon= list_item_icon_get(C, &itemptr, rnaicon);
+ icon= list_item_icon_get(C, &itemptr, rnaicon, 1);
but= uiDefIconButR(block, LISTROW, 0, icon, 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
uiButSetFlag(but, UI_BUT_NO_TOOLTIP);
@@ -2176,7 +2176,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
if(found) {
/* create button */
name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
- icon= list_item_icon_get(C, &itemptr, rnaicon);
+ icon= list_item_icon_get(C, &itemptr, rnaicon, 0);
uiItemL(row, (name)? name: "", icon);
if(name)
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 2eac7c20350..b60f948dc79 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -347,6 +347,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
sce= pr_main->scene.first;
if(sce) {
+
/* this flag tells render to not execute depsgraph or ipos etc */
sce->r.scemode |= R_PREVIEWBUTS;
/* set world always back, is used now */
@@ -358,9 +359,17 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
sce->r.color_mgt_flag = scene->r.color_mgt_flag;
+
+ /* prevent overhead for small renders and icons (32) */
+ if(id && sp->sizex < 40)
+ sce->r.xparts= sce->r.yparts= 1;
+ else
+ sce->r.xparts= sce->r.yparts= 4;
+
/* exception: don't color manage texture previews or icons */
if((id && sp->pr_method==PR_ICON_RENDER) || id_type == ID_TE)
sce->r.color_mgt_flag &= ~R_COLOR_MANAGEMENT;
+
if((id && sp->pr_method==PR_ICON_RENDER) && id_type != ID_WO)
sce->r.alphamode= R_ALPHAPREMUL;
else
@@ -380,7 +389,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
init_render_material(mat, 0, NULL); /* call that retrieves mode_l */
end_render_material(mat);
-
+
/* turn on raytracing if needed */
if(mat->mode_l & MA_RAYMIRROR)
sce->r.mode |= R_RAYTRACE;
@@ -601,7 +610,7 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
sbuts->preview= 0;
ok= 0;
}
-
+
if(ok==0) {
ED_preview_shader_job(C, sa, id, parent, slot, newx, newy, PR_BUTS_RENDER);
}
@@ -937,7 +946,7 @@ static void shader_preview_draw(void *spv, RenderResult *UNUSED(rr), volatile st
static int shader_preview_break(void *spv)
{
ShaderPreview *sp= spv;
-
+
return *(sp->stop);
}
@@ -962,7 +971,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
short idtype= GS(id->name);
char name[32];
int sizex;
-
+
/* get the stuff from the builtin preview dbase */
sce= preview_prepare_scene(sp->scene, id, idtype, sp); // XXX sizex
if(sce==NULL) return;
@@ -1021,6 +1030,8 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
/* handle results */
if(sp->pr_method==PR_ICON_RENDER) {
+ char *rct= (char *)(sp->pr_rect + 32*16 + 16);
+
if(sp->pr_rect)
RE_ResultGet32(re, sp->pr_rect);
}
@@ -1231,7 +1242,7 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r
sp->pr_method= PR_ICON_RENDER;
sp->pr_rect= rect;
sp->id = id;
-
+
/* setup job */
WM_jobs_customdata(steve, sp, shader_preview_free);
WM_jobs_timer(steve, 0.1, NC_MATERIAL, NC_MATERIAL);
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c
index 41b206f5479..b8dfae63b4d 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -283,6 +283,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve)
if(steve->running) {
/* signal job to end and restart */
steve->stop= 1;
+ // printf("job started a running job, ending... %s\n", steve->name);
}
else {
if(steve->customdata && steve->startjob) {
@@ -304,10 +305,10 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve)
steve->ready= 0;
steve->progress= 0.0;
+ // printf("job started: %s\n", steve->name);
+
BLI_init_threads(&steve->threads, do_job_thread, 1);
BLI_insert_thread(&steve->threads, steve);
-
- // printf("job started: %s\n", steve->name);
}
/* restarted job has timer already */
@@ -431,8 +432,8 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
steve->run_customdata= NULL;
steve->run_free= NULL;
- // if(steve->stop) printf("job stopped\n");
- // else printf("job finished\n");
+ // if(steve->stop) printf("job ready but stopped %s\n", steve->name);
+ // else printf("job finished %s\n", steve->name);
steve->running= 0;
BLI_end_threads(&steve->threads);
@@ -444,6 +445,7 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
/* new job added for steve? */
if(steve->customdata) {
+ // printf("job restarted with new data %s\n", steve->name);
WM_jobs_start(wm, steve);
}
else {