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:
Ton Roosendaal
2006-06-19 17:29:44 +00:00
parent bca96a4f99
commit e384f4d6f6
3 changed files with 33 additions and 1 deletions

View File

@@ -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 *************** */

View File

@@ -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;

View File

@@ -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);