Fix #4358
Was on the todo as well; previews in Shader Nodes didn't get cleared on re-renders, noticable when you switch preview type (i.e. sphere -> cube).
This commit is contained in:
@@ -111,6 +111,8 @@ void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int
|
||||
void ntreeEndExecTree(struct bNodeTree *ntree);
|
||||
|
||||
void ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
|
||||
void ntreeClearPreview(struct bNodeTree *ntree);
|
||||
|
||||
void ntreeFreeCache(struct bNodeTree *ntree);
|
||||
|
||||
/* ************** GENERIC API, NODES *************** */
|
||||
|
||||
@@ -1449,7 +1449,7 @@ static void nodeInitPreview(bNode *node, int xsize, int ysize)
|
||||
return;
|
||||
|
||||
/* sanity checks & initialize */
|
||||
if(node->preview && node->preview->rect) {
|
||||
if(node->preview->rect) {
|
||||
if(node->preview->xsize!=xsize && node->preview->ysize!=ysize) {
|
||||
MEM_freeN(node->preview->rect);
|
||||
node->preview->rect= NULL;
|
||||
@@ -1478,6 +1478,28 @@ void ntreeInitPreview(bNodeTree *ntree, int xsize, int ysize)
|
||||
}
|
||||
}
|
||||
|
||||
static void nodeClearPreview(bNode *node)
|
||||
{
|
||||
if(node->preview && node->preview->rect)
|
||||
memset(node->preview->rect, 0, MEM_allocN_len(node->preview->rect));
|
||||
}
|
||||
|
||||
/* use it to enforce clear */
|
||||
void ntreeClearPreview(bNodeTree *ntree)
|
||||
{
|
||||
bNode *node;
|
||||
|
||||
if(ntree==NULL)
|
||||
return;
|
||||
|
||||
for(node= ntree->nodes.first; node; node= node->next) {
|
||||
if(node->typeinfo->flag & NODE_PREVIEW)
|
||||
nodeClearPreview(node);
|
||||
if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
|
||||
ntreeClearPreview((bNodeTree *)node->id);
|
||||
}
|
||||
}
|
||||
|
||||
void nodeAddToPreview(bNode *node, float *col, int x, int y)
|
||||
{
|
||||
bNodePreview *preview= node->preview;
|
||||
|
||||
@@ -415,6 +415,8 @@ void BIF_previewrender(struct ID *id, struct RenderInfo *ri, struct ScrArea *are
|
||||
|
||||
sprintf(name, "ButsPreview %d", area?area->win:0);
|
||||
re= RE_GetRender(name);
|
||||
|
||||
/* full refreshed render from first tile */
|
||||
if(re==NULL || ri->curtile==0) {
|
||||
|
||||
re= RE_NewRender(name);
|
||||
@@ -435,6 +437,12 @@ void BIF_previewrender(struct ID *id, struct RenderInfo *ri, struct ScrArea *are
|
||||
|
||||
/* allocates render result */
|
||||
RE_InitState(re, &sce->r, ri->pr_rectx, ri->pr_recty, NULL);
|
||||
|
||||
/* enforce preview image clear */
|
||||
if(GS(id->name)==ID_MA) {
|
||||
Material *ma= (Material *)id;
|
||||
ntreeClearPreview(ma->nodetree);
|
||||
}
|
||||
}
|
||||
/* entire cycle for render engine */
|
||||
RE_SetCamera(re, sce->camera);
|
||||
|
||||
Reference in New Issue
Block a user