More texnode preview fixes. Previews now have correct aspect ratio and are drawn by the renderer.
This commit is contained in:
@@ -421,10 +421,9 @@ extern struct ListBase node_all_textures;
|
|||||||
|
|
||||||
/* API */
|
/* API */
|
||||||
int ntreeTexTagAnimated(struct bNodeTree *ntree);
|
int ntreeTexTagAnimated(struct bNodeTree *ntree);
|
||||||
void ntreeTexUpdatePreviews( struct bNodeTree* nodetree );
|
void ntreeTexSetPreviewFlag(int);
|
||||||
void ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, char do_preview, short thread, struct Tex *tex, short which_output, int cfra);
|
void ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, short thread, struct Tex *tex, short which_output, int cfra);
|
||||||
void ntreeTexCheckCyclics(struct bNodeTree *ntree);
|
void ntreeTexCheckCyclics(struct bNodeTree *ntree);
|
||||||
void ntreeTexAssignIndex(struct bNodeTree *ntree, struct bNode *node);
|
|
||||||
char* ntreeTexOutputMenu(struct bNodeTree *ntree);
|
char* ntreeTexOutputMenu(struct bNodeTree *ntree);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -947,6 +947,10 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M
|
|||||||
if(G.rendering)
|
if(G.rendering)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(GS(id->name) == ID_TE) {
|
||||||
|
ntreeTexSetPreviewFlag(1);
|
||||||
|
}
|
||||||
|
|
||||||
steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner);
|
steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner);
|
||||||
sp= MEM_callocN(sizeof(ShaderPreview), "shader preview");
|
sp= MEM_callocN(sizeof(ShaderPreview), "shader preview");
|
||||||
|
|
||||||
|
@@ -574,7 +574,6 @@ void ED_node_texture_default(Tex *tx)
|
|||||||
nodeAddLink(tx->nodetree, in, fromsock, out, tosock);
|
nodeAddLink(tx->nodetree, in, fromsock, out, tosock);
|
||||||
|
|
||||||
ntreeSolveOrder(tx->nodetree); /* needed for pointers */
|
ntreeSolveOrder(tx->nodetree); /* needed for pointers */
|
||||||
ntreeTexUpdatePreviews(tx->nodetree); /* XXX texture nodes should follow shader node methods (ton) */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Here we set the active tree(s), even called for each redraw now, so keep it fast :) */
|
/* Here we set the active tree(s), even called for each redraw now, so keep it fast :) */
|
||||||
@@ -1111,9 +1110,6 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
node->width= nsw->oldwidth + mx - nsw->mxstart;
|
node->width= nsw->oldwidth + mx - nsw->mxstart;
|
||||||
CLAMP(node->width, node->typeinfo->minwidth, node->typeinfo->maxwidth);
|
CLAMP(node->width, node->typeinfo->minwidth, node->typeinfo->maxwidth);
|
||||||
}
|
}
|
||||||
// XXX
|
|
||||||
if(snode->nodetree->type == NTREE_TEXTURE)
|
|
||||||
ntreeTexUpdatePreviews(snode->nodetree); /* XXX texture nodes should follow shader node methods (ton) */
|
|
||||||
|
|
||||||
ED_region_tag_redraw(ar);
|
ED_region_tag_redraw(ar);
|
||||||
|
|
||||||
@@ -1659,7 +1655,6 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
|
|||||||
|
|
||||||
if(snode->nodetree->type==NTREE_TEXTURE) {
|
if(snode->nodetree->type==NTREE_TEXTURE) {
|
||||||
ntreeTexCheckCyclics(snode->edittree);
|
ntreeTexCheckCyclics(snode->edittree);
|
||||||
ntreeTexUpdatePreviews(snode->edittree); /* XXX texture nodes should follow shader node methods (ton) */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
|
@@ -184,8 +184,9 @@ static void node_area_refresh(const struct bContext *C, struct ScrArea *sa)
|
|||||||
}
|
}
|
||||||
else if(snode->treetype==NTREE_TEXTURE) {
|
else if(snode->treetype==NTREE_TEXTURE) {
|
||||||
Tex *tex= (Tex *)snode->id;
|
Tex *tex= (Tex *)snode->id;
|
||||||
if(tex->use_nodes)
|
if(tex->use_nodes) {
|
||||||
ntreeTexUpdatePreviews(tex->nodetree);
|
ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -47,6 +47,8 @@
|
|||||||
|
|
||||||
#define PREV_RES 128 /* default preview resolution */
|
#define PREV_RES 128 /* default preview resolution */
|
||||||
|
|
||||||
|
int preview_flag = 0;
|
||||||
|
|
||||||
void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread)
|
void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread)
|
||||||
{
|
{
|
||||||
if(dg->node->need_exec)
|
if(dg->node->need_exec)
|
||||||
@@ -108,12 +110,6 @@ static void init_preview(bNode *node)
|
|||||||
if(node->preview==NULL)
|
if(node->preview==NULL)
|
||||||
node->preview= MEM_callocN(sizeof(bNodePreview), "node preview");
|
node->preview= MEM_callocN(sizeof(bNodePreview), "node preview");
|
||||||
|
|
||||||
if(node->preview->rect)
|
|
||||||
if(node->preview->xsize!=xsize && node->preview->ysize!=ysize) {
|
|
||||||
MEM_freeN(node->preview->rect);
|
|
||||||
node->preview->rect= NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(node->preview->rect==NULL) {
|
if(node->preview->rect==NULL) {
|
||||||
node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(float)*4, "node preview rect");
|
node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(float)*4, "node preview rect");
|
||||||
node->preview->xsize= xsize;
|
node->preview->xsize= xsize;
|
||||||
@@ -136,6 +132,8 @@ void tex_do_preview(bNode *node, bNodeStack *ns, TexCallData *cdata)
|
|||||||
bNodePreview *preview;
|
bNodePreview *preview;
|
||||||
float coord[3] = {0, 0, 0};
|
float coord[3] = {0, 0, 0};
|
||||||
TexParams params;
|
TexParams params;
|
||||||
|
int resolution;
|
||||||
|
int xsize, ysize;
|
||||||
|
|
||||||
if(!cdata->do_preview)
|
if(!cdata->do_preview)
|
||||||
return;
|
return;
|
||||||
@@ -146,19 +144,23 @@ void tex_do_preview(bNode *node, bNodeStack *ns, TexCallData *cdata)
|
|||||||
init_preview(node);
|
init_preview(node);
|
||||||
|
|
||||||
preview = node->preview;
|
preview = node->preview;
|
||||||
|
xsize = preview->xsize;
|
||||||
|
ysize = preview->ysize;
|
||||||
|
|
||||||
params.dxt = 0;
|
params.dxt = 0;
|
||||||
params.dyt = 0;
|
params.dyt = 0;
|
||||||
params.cfra = cdata->cfra;
|
params.cfra = cdata->cfra;
|
||||||
params.coord = coord;
|
params.coord = coord;
|
||||||
|
|
||||||
for(x=0; x<preview->xsize; x++)
|
resolution = (xsize < ysize) ? xsize : ysize;
|
||||||
for(y=0; y<preview->ysize; y++)
|
|
||||||
{
|
|
||||||
params.coord[0] = ((float) x / preview->xsize) * 2 - 1;
|
|
||||||
params.coord[1] = ((float) y / preview->ysize) * 2 - 1;
|
|
||||||
|
|
||||||
result = preview->rect + 4 * (preview->xsize*y + x);
|
for(x=0; x<xsize; x++)
|
||||||
|
for(y=0; y<ysize; y++)
|
||||||
|
{
|
||||||
|
params.coord[0] = ((float) x / resolution) * 2 - 1;
|
||||||
|
params.coord[1] = ((float) y / resolution) * 2 - 1;
|
||||||
|
|
||||||
|
result = preview->rect + 4 * (xsize*y + x);
|
||||||
|
|
||||||
tex_input_rgba(result, ns, ¶ms, cdata->thread);
|
tex_input_rgba(result, ns, ¶ms, cdata->thread);
|
||||||
}
|
}
|
||||||
@@ -212,7 +214,6 @@ void ntreeTexExecTree(
|
|||||||
TexResult *texres,
|
TexResult *texres,
|
||||||
float *coord,
|
float *coord,
|
||||||
float *dxt, float *dyt,
|
float *dxt, float *dyt,
|
||||||
char do_preview,
|
|
||||||
short thread,
|
short thread,
|
||||||
Tex *tex,
|
Tex *tex,
|
||||||
short which_output,
|
short which_output,
|
||||||
@@ -230,28 +231,19 @@ void ntreeTexExecTree(
|
|||||||
data.dxt = dxt;
|
data.dxt = dxt;
|
||||||
data.dyt = dyt;
|
data.dyt = dyt;
|
||||||
data.target = texres;
|
data.target = texres;
|
||||||
data.do_preview = do_preview;
|
data.do_preview = preview_flag;
|
||||||
data.thread = thread;
|
data.thread = thread;
|
||||||
data.which_output = which_output;
|
data.which_output = which_output;
|
||||||
data.cfra= cfra;
|
data.cfra= cfra;
|
||||||
|
|
||||||
|
preview_flag = 0;
|
||||||
|
|
||||||
ntreeExecTree(nodes, &data, thread);
|
ntreeExecTree(nodes, &data, thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ntreeTexUpdatePreviews(bNodeTree* nodetree)
|
void ntreeTexSetPreviewFlag(int doit)
|
||||||
{
|
{
|
||||||
Tex *tex;
|
preview_flag = doit;
|
||||||
float coord[] = {0,0,0};
|
|
||||||
TexResult dummy_texres;
|
|
||||||
|
|
||||||
for(tex= G.main->tex.first; tex; tex= tex->id.next)
|
|
||||||
if(tex->nodetree == nodetree) break;
|
|
||||||
if(tex) {
|
|
||||||
dummy_texres.nor = 0;
|
|
||||||
|
|
||||||
ntreeBeginExecTree(nodetree);
|
|
||||||
ntreeTexExecTree(nodetree, &dummy_texres, coord, 0, 0, 1, 0, tex, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char* ntreeTexOutputMenu(bNodeTree *ntree)
|
char* ntreeTexOutputMenu(bNodeTree *ntree)
|
||||||
|
@@ -102,8 +102,7 @@ float tex_input_value(bNodeStack *in, TexParams *params, short thread);
|
|||||||
void tex_output(bNode *node, bNodeStack **in, bNodeStack *out, TexFn texfn);
|
void tex_output(bNode *node, bNodeStack **in, bNodeStack *out, TexFn texfn);
|
||||||
void tex_do_preview(bNode *node, bNodeStack *ns, TexCallData *cdata);
|
void tex_do_preview(bNode *node, bNodeStack *ns, TexCallData *cdata);
|
||||||
|
|
||||||
void ntreeTexUpdatePreviews( bNodeTree* nodetree );
|
void ntreeTexExecTree(bNodeTree *nodes, TexResult *texres, float *coord, float *dxt, float *dyt, short thread, struct Tex *tex, short which_output, int cfra);
|
||||||
void ntreeTexExecTree(bNodeTree *nodes, TexResult *texres, float *coord, float *dxt, float *dyt, char do_preview, short thread, struct Tex *tex, short which_output, int cfra);
|
|
||||||
|
|
||||||
void params_from_cdata(TexParams *out, TexCallData *in);
|
void params_from_cdata(TexParams *out, TexCallData *in);
|
||||||
|
|
||||||
|
@@ -719,7 +719,7 @@ static int evalnodes(Tex *tex, float *texvec, float *dxt, float *dyt, TexResult
|
|||||||
short rv = TEX_INT;
|
short rv = TEX_INT;
|
||||||
bNodeTree *nodes = tex->nodetree;
|
bNodeTree *nodes = tex->nodetree;
|
||||||
|
|
||||||
ntreeTexExecTree(nodes, texres, texvec, dxt, dyt, 0, thread, tex, which_output, R.r.cfra);
|
ntreeTexExecTree(nodes, texres, texvec, dxt, dyt, thread, tex, which_output, R.r.cfra);
|
||||||
|
|
||||||
if(texres->nor) rv |= TEX_NOR;
|
if(texres->nor) rv |= TEX_NOR;
|
||||||
rv |= TEX_RGB;
|
rv |= TEX_RGB;
|
||||||
|
Reference in New Issue
Block a user