2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2008-11-12 22:03:11 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
2012-10-15 23:11:59 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2008-11-12 22:03:11 +00:00
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2008-11-12 22:03:11 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2005 Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*/
|
2011-02-27 20:13:22 +00:00
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup nodes
|
2011-02-27 20:13:22 +00:00
|
|
|
*/
|
|
|
|
|
2008-11-12 22:03:11 +00:00
|
|
|
/*
|
2012-06-30 22:49:33 +00:00
|
|
|
* HOW TEXTURE NODES WORK
|
|
|
|
*
|
|
|
|
* In contrast to Shader nodes, which place a color into the output
|
|
|
|
* stack when executed, Texture nodes place a TexDelegate* there. To
|
|
|
|
* obtain a color value from this, a node further up the chain reads
|
|
|
|
* the TexDelegate* from its input stack, and uses tex_call_delegate to
|
|
|
|
* retrieve the color from the delegate.
|
|
|
|
*
|
|
|
|
* comments: (ton)
|
|
|
|
*
|
|
|
|
* This system needs recode, a node system should rely on the stack, and
|
|
|
|
* callbacks for nodes only should evaluate own node, not recursively go
|
|
|
|
* over other previous ones.
|
|
|
|
*/
|
2008-11-12 22:03:11 +00:00
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
#include "node_texture_util.h"
|
2008-11-12 22:03:11 +00:00
|
|
|
|
2021-04-12 18:43:23 +02:00
|
|
|
bool tex_node_poll_default(bNodeType *UNUSED(ntype),
|
|
|
|
bNodeTree *ntree,
|
|
|
|
const char **r_disabled_hint)
|
2013-03-18 16:34:57 +00:00
|
|
|
{
|
2021-04-12 18:43:23 +02:00
|
|
|
if (!STREQ(ntree->idname, "TextureNodeTree")) {
|
|
|
|
*r_disabled_hint = "Not a texture node tree";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
void tex_node_type_base(
|
|
|
|
struct bNodeType *ntype, int type, const char *name, short nclass, short flag)
|
2013-03-18 16:34:57 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
node_type_base(ntype, type, name, nclass, flag);
|
2018-06-08 08:07:48 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ntype->poll = tex_node_poll_default;
|
|
|
|
ntype->insert_link = node_insert_link_default;
|
|
|
|
ntype->update_internal_links = node_update_internal_links_default;
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
static void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread)
|
2008-11-12 22:03:11 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (dg->node->need_exec) {
|
|
|
|
dg->fn(out, params, dg->node, dg->in, thread);
|
2009-10-07 14:48:29 +00:00
|
|
|
|
2019-04-22 13:31:31 +10:00
|
|
|
if (dg->cdata->do_preview) {
|
2019-04-17 06:17:24 +02:00
|
|
|
tex_do_preview(dg->preview, params->previewco, out, dg->cdata->do_manage);
|
2019-04-22 13:31:31 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2008-11-12 22:03:11 +00:00
|
|
|
}
|
|
|
|
|
2011-02-14 18:20:10 +00:00
|
|
|
static void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, short thread)
|
2008-11-12 22:03:11 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
TexDelegate *dg = in->data;
|
|
|
|
if (dg) {
|
|
|
|
tex_call_delegate(dg, in->vec, params, thread);
|
|
|
|
|
2019-04-22 13:31:31 +10:00
|
|
|
if (in->hasoutput && in->sockettype == SOCK_FLOAT) {
|
2019-04-17 06:17:24 +02:00
|
|
|
in->vec[1] = in->vec[2] = in->vec[0];
|
2019-04-22 13:31:31 +10:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
memcpy(out, in->vec, sz * sizeof(float));
|
2008-12-14 17:32:24 +00:00
|
|
|
}
|
|
|
|
|
2009-08-17 20:30:11 +00:00
|
|
|
void tex_input_vec(float *out, bNodeStack *in, TexParams *params, short thread)
|
2008-12-14 17:32:24 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
tex_input(out, 3, in, params, thread);
|
2008-11-12 22:03:11 +00:00
|
|
|
}
|
|
|
|
|
2009-08-17 20:30:11 +00:00
|
|
|
void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread)
|
2008-11-12 22:03:11 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
tex_input(out, 4, in, params, thread);
|
|
|
|
|
|
|
|
if (in->hasoutput && in->sockettype == SOCK_FLOAT) {
|
|
|
|
out[1] = out[2] = out[0];
|
|
|
|
out[3] = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (in->hasoutput && in->sockettype == SOCK_VECTOR) {
|
|
|
|
out[0] = out[0] * 0.5f + 0.5f;
|
|
|
|
out[1] = out[1] * 0.5f + 0.5f;
|
|
|
|
out[2] = out[2] * 0.5f + 0.5f;
|
|
|
|
out[3] = 1;
|
|
|
|
}
|
2008-11-12 22:03:11 +00:00
|
|
|
}
|
|
|
|
|
2009-08-17 20:30:11 +00:00
|
|
|
float tex_input_value(bNodeStack *in, TexParams *params, short thread)
|
2008-11-12 22:03:11 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
float out[4];
|
|
|
|
tex_input_vec(out, in, params, thread);
|
|
|
|
return out[0];
|
2008-11-12 22:03:11 +00:00
|
|
|
}
|
|
|
|
|
2009-08-17 20:30:11 +00:00
|
|
|
void params_from_cdata(TexParams *out, TexCallData *in)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
out->co = in->co;
|
|
|
|
out->dxt = in->dxt;
|
|
|
|
out->dyt = in->dyt;
|
|
|
|
out->previewco = in->co;
|
|
|
|
out->osatex = in->osatex;
|
|
|
|
out->cfra = in->cfra;
|
|
|
|
out->mtex = in->mtex;
|
2009-08-17 20:30:11 +00:00
|
|
|
}
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
void tex_do_preview(bNodePreview *preview,
|
|
|
|
const float coord[2],
|
|
|
|
const float col[4],
|
|
|
|
bool do_manage)
|
2008-11-12 22:03:11 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if (preview) {
|
|
|
|
int xs = ((coord[0] + 1.0f) * 0.5f) * preview->xsize;
|
|
|
|
int ys = ((coord[1] + 1.0f) * 0.5f) * preview->ysize;
|
2018-06-08 08:07:48 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_node_preview_set_pixel(preview, col, xs, ys, do_manage);
|
|
|
|
}
|
2008-11-12 22:03:11 +00:00
|
|
|
}
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
void tex_output(bNode *node,
|
|
|
|
bNodeExecData *execdata,
|
|
|
|
bNodeStack **in,
|
|
|
|
bNodeStack *out,
|
|
|
|
TexFn texfn,
|
|
|
|
TexCallData *cdata)
|
2008-11-12 22:03:11 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
TexDelegate *dg;
|
|
|
|
|
|
|
|
if (node->flag & NODE_MUTED) {
|
|
|
|
/* do not add a delegate if the node is muted */
|
|
|
|
return;
|
|
|
|
}
|
2020-08-07 12:40:49 +02:00
|
|
|
|
|
|
|
if (!out->data) {
|
2021-02-02 09:51:38 -06:00
|
|
|
/* Freed in tex_end_exec (node.cc) */
|
2020-08-07 12:40:49 +02:00
|
|
|
dg = out->data = MEM_mallocN(sizeof(TexDelegate), "tex delegate");
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
else {
|
2020-08-07 12:40:49 +02:00
|
|
|
dg = out->data;
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
dg->cdata = cdata;
|
|
|
|
dg->fn = texfn;
|
|
|
|
dg->node = node;
|
|
|
|
dg->preview = execdata->preview;
|
|
|
|
memcpy(dg->in, in, MAX_SOCKET * sizeof(bNodeStack *));
|
|
|
|
dg->type = out->sockettype;
|
2008-11-12 22:03:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ntreeTexCheckCyclics(struct bNodeTree *ntree)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
bNode *node;
|
|
|
|
for (node = ntree->nodes.first; node; node = node->next) {
|
|
|
|
|
|
|
|
if (node->type == TEX_NODE_TEXTURE && node->id) {
|
|
|
|
/* custom2 stops the node from rendering */
|
|
|
|
if (node->custom1) {
|
|
|
|
node->custom2 = 1;
|
|
|
|
node->custom1 = 0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Tex *tex = (Tex *)node->id;
|
|
|
|
|
|
|
|
node->custom2 = 0;
|
|
|
|
|
|
|
|
node->custom1 = 1;
|
|
|
|
if (tex->use_nodes && tex->nodetree) {
|
|
|
|
ntreeTexCheckCyclics(tex->nodetree);
|
|
|
|
}
|
|
|
|
node->custom1 = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-11-12 22:03:11 +00:00
|
|
|
}
|