Fix T57633: Particle texture update problem
[blender.git] / source / blender / depsgraph / intern / nodes / deg_node_component.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) 2013 Blender Foundation.
19  * All rights reserved.
20  *
21  * Original Author: Joshua Leung
22  * Contributor(s): None Yet
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/depsgraph/intern/nodes/deg_node_component.h
28  *  \ingroup depsgraph
29  */
30
31 #pragma once
32
33 #include "intern/nodes/deg_node.h"
34
35 #include "BLI_utildefines.h"
36 #include "BLI_string.h"
37
38 struct ID;
39 struct bPoseChannel;
40 struct GHash;
41
42 namespace DEG {
43
44 struct Depsgraph;
45 struct OperationDepsNode;
46 struct BoneComponentDepsNode;
47 struct IDDepsNode;
48
49 /* ID Component - Base type for all components */
50 struct ComponentDepsNode : public DepsNode {
51         /* Key used to look up operations within a component */
52         struct OperationIDKey
53         {
54                 eDepsOperation_Code opcode;
55                 const char *name;
56                 int name_tag;
57
58                 OperationIDKey();
59                 OperationIDKey(eDepsOperation_Code opcode);
60                 OperationIDKey(eDepsOperation_Code opcode,
61                                const char *name,
62                                int name_tag);
63
64                 string identifier() const;
65                 bool operator==(const OperationIDKey &other) const;
66         };
67
68         /* Typedef for container of operations */
69         ComponentDepsNode();
70         ~ComponentDepsNode();
71
72         void init(const ID *id, const char *subdata) override;
73
74         virtual string identifier() const override;
75
76         /* Find an existing operation, if requested operation does not exist
77          * NULL will be returned.
78          */
79         OperationDepsNode *find_operation(OperationIDKey key) const;
80         OperationDepsNode *find_operation(eDepsOperation_Code opcode,
81                                          const char *name,
82                                          int name_tag) const;
83
84         /* Find an existing operation, will throw an assert() if it does not exist. */
85         OperationDepsNode *get_operation(OperationIDKey key) const;
86         OperationDepsNode *get_operation(eDepsOperation_Code opcode,
87                                          const char *name,
88                                          int name_tag) const;
89
90         /* Check operation exists and return it. */
91         bool has_operation(OperationIDKey key) const;
92         bool has_operation(eDepsOperation_Code opcode,
93                            const char *name,
94                            int name_tag) const;
95
96         /**
97          * Create a new node for representing an operation and add this to graph
98          * \warning If an existing node is found, it will be modified. This helps
99          * when node may have been partially created earlier (e.g. parent ref before
100          * parent item is added)
101          *
102          * \param type: Operation node type (corresponding to context/component that
103          *              it operates in)
104          * \param optype: Role that operation plays within component
105          *                (i.e. where in eval process)
106          * \param op: The operation to perform
107          * \param name: Identifier for operation - used to find/locate it again
108          */
109         OperationDepsNode *add_operation(const DepsEvalOperationCb& op,
110                                          eDepsOperation_Code opcode,
111                                          const char *name,
112                                          int name_tag);
113
114         /* Entry/exit operations management.
115          *
116          * Use those instead of direct set since this will perform sanity checks.
117          */
118         void set_entry_operation(OperationDepsNode *op_node);
119         void set_exit_operation(OperationDepsNode *op_node);
120
121         void clear_operations();
122
123         virtual void tag_update(Depsgraph *graph, eDepsTag_Source source) override;
124
125         virtual OperationDepsNode *get_entry_operation() override;
126         virtual OperationDepsNode *get_exit_operation() override;
127
128         void finalize_build(Depsgraph *graph);
129
130         IDDepsNode *owner;
131
132         /* ** Inner nodes for this component ** */
133
134         /* Operations stored as a hash map, for faster build.
135          * This hash map will be freed when graph is fully built.
136          */
137         GHash *operations_map;
138
139         /* This is a "normal" list of operations, used by evaluation
140          * and other routines after construction.
141          */
142         vector<OperationDepsNode *> operations;
143
144         OperationDepsNode *entry_operation;
145         OperationDepsNode *exit_operation;
146
147         virtual bool depends_on_cow() { return true; }
148
149         /* Denotes whether COW component is to be tagged when this component
150          * is tagged for update.
151          */
152         virtual bool need_tag_cow_before_update() { return true; }
153
154         /* Denotes whether this component affects (possibly indirectly) on a
155          * directly visible object.
156          */
157         bool affects_directly_visible;
158 };
159
160 /* ---------------------------------------- */
161
162 #define DEG_COMPONENT_NODE_DEFINE_TYPEINFO(NodeType, type_, tname_, id_recalc_tag) \
163     const DepsNode::TypeInfo NodeType::typeinfo = \
164         DepsNode::TypeInfo(type_, tname_, id_recalc_tag)
165
166 #define DEG_COMPONENT_NODE_DECLARE DEG_DEPSNODE_DECLARE
167
168 #define DEG_COMPONENT_NODE_DEFINE(name, NAME, id_recalc_tag)            \
169     DEG_COMPONENT_NODE_DEFINE_TYPEINFO(name ## ComponentDepsNode,       \
170                                        DEG_NODE_TYPE_ ## NAME,          \
171                                        #name  " Component",             \
172                                        id_recalc_tag) ;                 \
173     static DepsNodeFactoryImpl<name ## ComponentDepsNode> DNTI_ ## NAME
174
175 #define DEG_COMPONENT_NODE_DECLARE_GENERIC(name)                   \
176         struct name ## ComponentDepsNode : public ComponentDepsNode {  \
177                 DEG_COMPONENT_NODE_DECLARE;                                \
178         }
179
180 #define DEG_COMPONENT_NODE_DECLARE_NO_COW_TAG_ON_UPDATE(name)      \
181         struct name ## ComponentDepsNode : public ComponentDepsNode {  \
182                 DEG_COMPONENT_NODE_DECLARE;                                \
183                 virtual bool need_tag_cow_before_update() { return false; }  \
184         }
185
186 DEG_COMPONENT_NODE_DECLARE_GENERIC(Animation);
187 DEG_COMPONENT_NODE_DECLARE_NO_COW_TAG_ON_UPDATE(BatchCache);
188 DEG_COMPONENT_NODE_DECLARE_GENERIC(Cache);
189 DEG_COMPONENT_NODE_DECLARE_GENERIC(CopyOnWrite);
190 DEG_COMPONENT_NODE_DECLARE_GENERIC(Geometry);
191 DEG_COMPONENT_NODE_DECLARE_GENERIC(LayerCollections);
192 DEG_COMPONENT_NODE_DECLARE_GENERIC(Parameters);
193 DEG_COMPONENT_NODE_DECLARE_GENERIC(Particles);
194 DEG_COMPONENT_NODE_DECLARE_GENERIC(ParticleSettings);
195 DEG_COMPONENT_NODE_DECLARE_GENERIC(Pose);
196 DEG_COMPONENT_NODE_DECLARE_GENERIC(PointCache);
197 DEG_COMPONENT_NODE_DECLARE_GENERIC(Proxy);
198 DEG_COMPONENT_NODE_DECLARE_GENERIC(Sequencer);
199 DEG_COMPONENT_NODE_DECLARE_NO_COW_TAG_ON_UPDATE(Shading);
200 DEG_COMPONENT_NODE_DECLARE_GENERIC(ShadingParameters);
201 DEG_COMPONENT_NODE_DECLARE_GENERIC(Transform);
202 DEG_COMPONENT_NODE_DECLARE_NO_COW_TAG_ON_UPDATE(ObjectFromLayer);
203 DEG_COMPONENT_NODE_DECLARE_GENERIC(Dupli);
204 DEG_COMPONENT_NODE_DECLARE_GENERIC(Synchronize);
205 DEG_COMPONENT_NODE_DECLARE_GENERIC(GenericDatablock);
206
207 /* Bone Component */
208 struct BoneComponentDepsNode : public ComponentDepsNode {
209         void init(const ID *id, const char *subdata);
210
211         struct bPoseChannel *pchan;     /* the bone that this component represents */
212
213         DEG_COMPONENT_NODE_DECLARE;
214 };
215
216 void deg_register_component_depsnodes();
217
218 }  // namespace DEG