36
36
#include "DNA_material_types.h"
37
37
#include "DNA_node_types.h"
38
38
#include "DNA_scene_types.h"
39
#include "DNA_space_types.h"
39
40
#include "DNA_world_types.h"
41
42
#include "BLI_listbase.h"
59
63
#include "node_util.h"
60
64
#include "node_shader_util.h"
62
static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
68
for (ma = main->mat.first; ma; ma = ma->id.next)
70
func(calldata, &ma->id, ma->nodetree);
72
for (la = main->lamp.first; la; la = la->id.next)
74
func(calldata, &la->id, la->nodetree);
76
for (wo = main->world.first; wo; wo = wo->id.next)
78
func(calldata, &wo->id, wo->nodetree);
66
static int shader_tree_poll(const bContext *C, bNodeTreeType *UNUSED(treetype))
68
Scene *scene = CTX_data_scene(C);
69
/* allow empty engine string too, this is from older versions that didn't have registerable engines yet */
70
return (scene->r.engine[0] == '\0' ||
71
STREQ(scene->r.engine, "BLENDER_RENDER") ||
72
STREQ(scene->r.engine, "BLENDER_GAME") ||
73
STREQ(scene->r.engine, "CYCLES"));
76
static void shader_get_from_context(const bContext *C, bNodeTreeType *UNUSED(treetype), bNodeTree **r_ntree, ID **r_id, ID **r_from)
78
SpaceNode *snode = CTX_wm_space_node(C);
79
Scene *scene = CTX_data_scene(C);
82
if (snode->shaderfrom == SNODE_SHADER_OBJECT) {
85
if (ob->type == OB_LAMP) {
87
*r_ntree = ((Lamp *)ob->data)->nodetree;
90
Material *ma = give_current_material(ob, ob->actcol);
93
*r_ntree = ma->nodetree;
98
else { /* SNODE_SHADER_WORLD */
101
*r_id = &scene->world->id;
102
*r_ntree = scene->world->nodetree;
81
107
static void foreach_nodeclass(Scene *scene, void *calldata, bNodeClassCallback func)
93
119
func(calldata, NODE_CLASS_CONVERTOR, N_("Convertor"));
94
120
func(calldata, NODE_CLASS_SCRIPT, N_("Script"));
95
121
func(calldata, NODE_CLASS_GROUP, N_("Group"));
122
func(calldata, NODE_CLASS_INTERFACE, N_("Interface"));
96
123
func(calldata, NODE_CLASS_LAYOUT, N_("Layout"));
114
141
static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
118
/* copy over contents of previews */
119
for (lnode = localtree->nodes.first; lnode; lnode = lnode->next) {
120
if (ntreeNodeExists(ntree, lnode->new_node)) {
121
bNode *node = lnode->new_node;
123
if (node->preview && node->preview->rect) {
124
if (lnode->preview && lnode->preview->rect) {
125
int xsize = node->preview->xsize;
126
int ysize = node->preview->ysize;
127
memcpy(node->preview->rect, lnode->preview->rect, 4 * xsize + xsize * ysize * sizeof(char) * 4);
143
BKE_node_preview_sync_tree(ntree, localtree);
146
static void local_merge(bNodeTree *localtree, bNodeTree *ntree)
148
BKE_node_preview_merge_tree(ntree, localtree, true);
134
151
static void update(bNodeTree *ntree)
136
153
ntreeSetOutput(ntree);
138
155
ntree_update_reroute_nodes(ntree);
141
bNodeTreeType ntreeType_Shader = {
142
/* type */ NTREE_SHADER,
143
/* id_name */ "NTShader Nodetree",
145
/* node_types */ { NULL, NULL },
147
/* free_cache */ NULL,
148
/* free_node_cache */ NULL,
149
/* foreach_nodetree */ foreach_nodetree,
150
/* foreach_nodeclass */ foreach_nodeclass,
151
/* localize */ localize,
152
/* local_sync */ local_sync,
153
/* local_merge */ NULL,
155
/* update_node */ NULL,
156
/* validate_link */ NULL,
157
/* update_internal_links */ node_update_internal_links_default
157
if (ntree->update & NTREE_UPDATE_NODES) {
158
/* clean up preview cache, in case nodes have been removed */
159
BKE_node_preview_remove_unused(ntree);
163
bNodeTreeType *ntreeType_Shader;
165
void register_node_tree_type_sh(void)
167
bNodeTreeType *tt = ntreeType_Shader = MEM_callocN(sizeof(bNodeTreeType), "shader node tree type");
169
tt->type = NTREE_SHADER;
170
strcpy(tt->idname, "ShaderNodeTree");
171
strcpy(tt->ui_name, "Shader");
172
tt->ui_icon = 0; /* defined in drawnode.c */
173
strcpy(tt->ui_description, "Shader nodes");
175
tt->foreach_nodeclass = foreach_nodeclass;
176
tt->localize = localize;
177
tt->local_sync = local_sync;
178
tt->local_merge = local_merge;
180
tt->poll = shader_tree_poll;
181
tt->get_from_context = shader_get_from_context;
183
tt->ext.srna = &RNA_ShaderNodeTree;
160
188
/* GPU material from shader nodes */
164
192
bNodeTreeExec *exec;
166
exec = ntreeShaderBeginExecTree(ntree, 1);
194
exec = ntreeShaderBeginExecTree(ntree);
168
196
ntreeExecGPUNodes(exec, mat, 1);
170
ntreeShaderEndExecTree(exec, 1);
198
ntreeShaderEndExecTree(exec);
173
201
/* **************** call to switch lamploop for material node ************ */
183
/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
184
* If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
186
bNodeTreeExec *ntreeShaderBeginExecTree(bNodeTree *ntree, int use_tree_data)
211
bNodeTreeExec *ntreeShaderBeginExecTree_internal(bNodeExecContext *context, bNodeTree *ntree, bNodeInstanceKey parent_key)
188
213
bNodeTreeExec *exec;
192
/* XXX hack: prevent exec data from being generated twice.
193
* this should be handled by the renderer!
196
return ntree->execdata;
199
216
/* ensures only a single output node is enabled */
200
217
ntreeSetOutput(ntree);
202
219
/* common base initialization */
203
exec = ntree_exec_begin(ntree);
220
exec = ntree_exec_begin(context, ntree, parent_key);
205
222
/* allocate the thread stack listbase array */
206
223
exec->threadstack = MEM_callocN(BLENDER_MAX_THREADS * sizeof(ListBase), "thread stack array");
208
225
for (node = exec->nodetree->nodes.first; node; node = node->next)
209
226
node->need_exec = 1;
212
/* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
213
* which only store the ntree pointer. Should be fixed at some point!
215
ntree->execdata = exec;
231
bNodeTreeExec *ntreeShaderBeginExecTree(bNodeTree *ntree)
233
bNodeExecContext context;
236
/* XXX hack: prevent exec data from being generated twice.
237
* this should be handled by the renderer!
240
return ntree->execdata;
242
context.previews = ntree->previews;
244
exec = ntreeShaderBeginExecTree_internal(&context, ntree, NODE_INSTANCE_KEY_BASE);
246
/* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
247
* which only store the ntree pointer. Should be fixed at some point!
249
ntree->execdata = exec;
254
void ntreeShaderEndExecTree_internal(bNodeTreeExec *exec)
256
bNodeThreadStack *nts;
259
if (exec->threadstack) {
260
for (a = 0; a < BLENDER_MAX_THREADS; a++) {
261
for (nts = exec->threadstack[a].first; nts; nts = nts->next)
262
if (nts->stack) MEM_freeN(nts->stack);
263
BLI_freelistN(&exec->threadstack[a]);
266
MEM_freeN(exec->threadstack);
267
exec->threadstack = NULL;
270
ntree_exec_end(exec);
221
/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
222
* If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
224
void ntreeShaderEndExecTree(bNodeTreeExec *exec, int use_tree_data)
273
void ntreeShaderEndExecTree(bNodeTreeExec *exec)
276
/* exec may get freed, so assign ntree */
227
277
bNodeTree *ntree = exec->nodetree;
228
bNodeThreadStack *nts;
231
if (exec->threadstack) {
232
for (a = 0; a < BLENDER_MAX_THREADS; a++) {
233
for (nts = exec->threadstack[a].first; nts; nts = nts->next)
234
if (nts->stack) MEM_freeN(nts->stack);
235
BLI_freelistN(&exec->threadstack[a]);
238
MEM_freeN(exec->threadstack);
239
exec->threadstack = NULL;
242
ntree_exec_end(exec);
245
/* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
246
ntree->execdata = NULL;
278
ntreeShaderEndExecTree_internal(exec);
280
/* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
281
ntree->execdata = NULL;