Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/depsgraph/intern/node/deg_node_operation.h')
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_operation.h239
1 files changed, 239 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.h b/source/blender/depsgraph/intern/node/deg_node_operation.h
new file mode 100644
index 00000000000..30ed457e1f5
--- /dev/null
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.h
@@ -0,0 +1,239 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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
+ * of the License, or (at your option) any later version.
+ *
+ * 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,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2013 Blender Foundation.
+ * All rights reserved.
+ *
+ * Original Author: Joshua Leung
+ * Contributor(s): None Yet
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/depsgraph/intern/node/deg_node_operation.h
+ * \ingroup depsgraph
+ */
+
+#pragma once
+
+#include "intern/node/deg_node.h"
+
+#include "intern/depsgraph_type.h"
+
+struct ID;
+struct Depsgraph;
+
+namespace DEG {
+
+struct ComponentNode;
+
+/* Evaluation Operation for atomic operation */
+// XXX: move this to another header that can be exposed?
+typedef function<void(struct ::Depsgraph *)> DepsEvalOperationCb;
+
+/* Identifiers for common operations (as an enum). */
+enum class OperationCode {
+ /* Generic Operations. -------------------------------------------------- */
+
+ /* Placeholder for operations which don't need special mention */
+ OPERATION = 0,
+
+ /* Generic parameters evaluation. */
+ ID_PROPERTY,
+ PARAMETERS_EVAL,
+
+ // XXX: Placeholder while porting depsgraph code
+ PLACEHOLDER,
+
+ /* Animation, Drivers, etc. --------------------------------------------- */
+ /* NLA + Action */
+ ANIMATION,
+ /* Driver */
+ DRIVER,
+
+ /* Object related. ------------------------------------------------------ */
+ OBJECT_BASE_FLAGS,
+
+ /* Transform. ----------------------------------------------------------- */
+ /* Transform entry point - local transforms only */
+ TRANSFORM_LOCAL,
+ /* Parenting */
+ TRANSFORM_PARENT,
+ /* Constraints */
+ TRANSFORM_CONSTRAINTS,
+ /* Transform exit point */
+ TRANSFORM_FINAL,
+ /* Handle object-level updates, mainly proxies hacks and recalc flags. */
+ TRANSFORM_OBJECT_UBEREVAL,
+
+ /* Rigid body. ---------------------------------------------------------- */
+ /* Perform Simulation */
+ RIGIDBODY_REBUILD,
+ RIGIDBODY_SIM,
+ /* Copy results to object */
+ RIGIDBODY_TRANSFORM_COPY,
+
+ /* Geometry. ------------------------------------------------------------ */
+
+ /* Evaluate the whole geometry, including modifiers. */
+ GEOMETRY_UBEREVAL,
+ /* Evaluation of a shape key. */
+ GEOMETRY_SHAPEKEY,
+
+ /* Object data. --------------------------------------------------------- */
+ LIGHT_PROBE_EVAL,
+ SPEAKER_EVAL,
+
+ /* Pose. ---------------------------------------------------------------- */
+ /* Init pose, clear flags, etc. */
+ POSE_INIT,
+ /* Initialize IK solver related pose stuff. */
+ POSE_INIT_IK,
+ /* Pose is evaluated, and runtime data can be freed. */
+ POSE_CLEANUP,
+ /* Pose has been fully evaluated and ready to be used by others. */
+ POSE_DONE,
+ /* IK/Spline Solvers */
+ POSE_IK_SOLVER,
+ POSE_SPLINE_IK_SOLVER,
+
+ /* Bone. ---------------------------------------------------------------- */
+ /* Bone local transforms - entry point */
+ BONE_LOCAL,
+ /* Pose-space conversion (includes parent + restpose, */
+ BONE_POSE_PARENT,
+ /* Constraints */
+ BONE_CONSTRAINTS,
+ /* Bone transforms are ready
+ *
+ * - "READY" This (internal, noop is used to signal that all pre-IK
+ * operations are done. Its role is to help mediate situations
+ * where cyclic relations may otherwise form (i.e. one bone in
+ * chain targeting another in same chain,
+ *
+ * - "DONE" This noop is used to signal that the bone's final pose
+ * transform can be read by others. */
+ // TODO: deform mats could get calculated in the final_transform ops...
+ BONE_READY,
+ BONE_DONE,
+ /* B-Bone segment shape computation (after DONE) */
+ BONE_SEGMENTS,
+
+ /* Particle System. ----------------------------------------------------- */
+ PARTICLE_SYSTEM_INIT,
+ PARTICLE_SYSTEM_EVAL,
+ PARTICLE_SYSTEM_DONE,
+
+ /* Particle Settings. --------------------------------------------------- */
+ PARTICLE_SETTINGS_INIT,
+ PARTICLE_SETTINGS_EVAL,
+ PARTICLE_SETTINGS_RESET,
+
+ /* Point Cache. --------------------------------------------------------- */
+ POINT_CACHE_RESET,
+
+ /* Collections. --------------------------------------------------------- */
+ VIEW_LAYER_EVAL,
+
+ /* Copy on Write. ------------------------------------------------------- */
+ COPY_ON_WRITE,
+
+ /* Shading. ------------------------------------------------------------- */
+ SHADING,
+ MATERIAL_UPDATE,
+ WORLD_UPDATE,
+
+ /* Batch caches. -------------------------------------------------------- */
+ GEOMETRY_SELECT_UPDATE,
+
+ /* Masks. --------------------------------------------------------------- */
+ MASK_ANIMATION,
+ MASK_EVAL,
+
+ /* Movie clips. --------------------------------------------------------- */
+ MOVIECLIP_EVAL,
+ MOVIECLIP_SELECT_UPDATE,
+
+ /* Synchronization clips. ----------------------------------------------- */
+ SYNCHRONIZE_TO_ORIGINAL,
+
+ /* Generic datablock ---------------------------------------------------- */
+ GENERIC_DATABLOCK_UPDATE,
+};
+const char *operationCodeAsString(OperationCode opcode);
+
+/* Flags for Depsgraph Nodes.
+ * NOTE: IS a bit shifts to allow usage as an accumulated. bitmask.
+ */
+enum OperationFlag {
+ /* Node needs to be updated. */
+ DEPSOP_FLAG_NEEDS_UPDATE = (1 << 0),
+ /* Node was directly modified, causing need for update. */
+ DEPSOP_FLAG_DIRECTLY_MODIFIED = (1 << 1),
+ /* Node was updated due to user input. */
+ DEPSOP_FLAG_USER_MODIFIED = (1 << 2),
+
+ /* Set of flags which gets flushed along the relations. */
+ DEPSOP_FLAG_FLUSH = (DEPSOP_FLAG_USER_MODIFIED),
+};
+
+/* Atomic Operation - Base type for all operations */
+struct OperationNode : public Node {
+ OperationNode();
+ ~OperationNode();
+
+ virtual string identifier() const override;
+ string full_identifier() const;
+
+ virtual void tag_update(Depsgraph *graph, eUpdateSource source) override;
+
+ bool is_noop() const { return (bool)evaluate == false; }
+
+ virtual OperationNode *get_entry_operation() override {
+ return this;
+ }
+ virtual OperationNode *get_exit_operation() override {
+ return this;
+ }
+
+ /* Set this operation as component's entry/exit operation. */
+ void set_as_entry();
+ void set_as_exit();
+
+ /* Component that contains the operation. */
+ ComponentNode *owner;
+
+ /* Callback for operation. */
+ DepsEvalOperationCb evaluate;
+
+ /* How many inlinks are we still waiting on before we can be evaluated. */
+ uint32_t num_links_pending;
+ bool scheduled;
+
+ /* Identifier for the operation being performed. */
+ OperationCode opcode;
+ int name_tag;
+
+ /* (OperationFlag) extra settings affecting evaluation. */
+ int flag;
+
+ DEG_DEPSNODE_DECLARE;
+};
+
+void deg_register_operation_depsnodes();
+
+} // namespace DEG