GSOC 2013 paint
[blender-staging.git] / source / blender / nodes / intern / node_exec.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2007 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Nathan Letwory.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file blender/nodes/intern/node_exec.h
29  *  \ingroup nodes
30  */
31
32
33 #ifndef __NODE_EXEC_H__
34 #define __NODE_EXEC_H__
35
36 #include "DNA_listBase.h"
37
38 #include "BLI_utildefines.h"
39
40 #include "BKE_node.h"
41
42 #include "node_util.h"
43
44 #include "RNA_types.h"
45
46 struct bNodeTree;
47 struct bNode;
48 struct bNodeStack;
49
50 /* Node execution data */
51 typedef struct bNodeExec {
52         struct bNode *node;                             /* backpointer to node */
53         bNodeExecData data;
54         
55         NodeFreeExecFunction freeexecfunc; /* free function, stored in exec itself to avoid dangling node pointer access */
56 } bNodeExec;
57
58 /* Execution Data for each instance of node tree execution */
59 typedef struct bNodeTreeExec {
60         struct bNodeTree *nodetree;             /* backpointer to node tree */
61         
62         int totnodes;                                   /* total node count */
63         struct bNodeExec *nodeexec;             /* per-node execution data */
64         
65         int stacksize;
66         struct bNodeStack *stack;               /* socket data stack */
67         /* only used by material and texture trees to keep one stack for each thread */
68         ListBase *threadstack;                  /* one instance of the stack for each thread */
69 } bNodeTreeExec;
70
71 /* stores one stack copy for each thread (material and texture trees) */
72 typedef struct bNodeThreadStack {
73         struct bNodeThreadStack *next, *prev;
74         struct bNodeStack *stack;
75         bool used;
76 } bNodeThreadStack;
77
78 int node_exec_socket_use_stack(struct bNodeSocket *sock);
79
80 struct bNodeStack *node_get_socket_stack(struct bNodeStack *stack, struct bNodeSocket *sock);
81 void node_get_stack(struct bNode *node, struct bNodeStack *stack, struct bNodeStack **in, struct bNodeStack **out);
82
83 struct bNodeTreeExec *ntree_exec_begin(struct bNodeExecContext *context, struct bNodeTree *ntree, bNodeInstanceKey parent_key);
84 void ntree_exec_end(struct bNodeTreeExec *exec);
85
86 struct bNodeThreadStack *ntreeGetThreadStack(struct bNodeTreeExec *exec, int thread);
87 void ntreeReleaseThreadStack(struct bNodeThreadStack *nts);
88 bool ntreeExecThreadNodes(struct bNodeTreeExec *exec, struct bNodeThreadStack *nts, void *callerdata, int thread);
89
90 struct bNodeTreeExec *ntreeShaderBeginExecTree_internal(struct bNodeExecContext *context, struct bNodeTree *ntree, bNodeInstanceKey parent_key);
91 void ntreeShaderEndExecTree_internal(struct bNodeTreeExec *exec);
92
93 struct bNodeTreeExec *ntreeTexBeginExecTree_internal(struct bNodeExecContext *context, struct bNodeTree *ntree, bNodeInstanceKey parent_key);
94 void ntreeTexEndExecTree_internal(struct bNodeTreeExec *exec);
95
96 #endif