/*
 * ***** 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) 2014 Blender Foundation.
 * All rights reserved.
 *
 * Original Author: Joshua Leung
 * Contributor(s): None Yet
 *
 * ***** END GPL LICENSE BLOCK *****
 */

/** \file blender/depsgraph/intern/depsnode_opcodes.h
 *  \ingroup depsgraph
 *
 * \par OpCodes for OperationDepsNodes
 *
 * This file defines all the "operation codes" (opcodes) used to identify
 * common operation node types. The intention of these defines is to have
 * a fast and reliable way of identifying the relevant nodes within a component
 * without having to use fragile dynamic strings.
 *
 * This file is meant to be used like UI_icons.h. That is, before including
 * the file, the host file must define the DEG_OPCODE(_label) macro, which
 * is responsible for converting the define into whatever form is suitable.
 * Therefore, it intentionally doesn't have header guards.
 */


/* Example macro define: */
/* #define DEF_DEG_OPCODE(label) DEG_OPCODE_##label, */

/* Generic Operations ------------------------------ */

/* Placeholder for operations which don't need special mention */
DEF_DEG_OPCODE(OPERATION)

// XXX: Placeholder while porting depsgraph code
DEF_DEG_OPCODE(PLACEHOLDER)

DEF_DEG_OPCODE(NOOP)

/* Animation, Drivers, etc. ------------------------ */

/* NLA + Action */
DEF_DEG_OPCODE(ANIMATION)

/* Driver */
DEF_DEG_OPCODE(DRIVER)

/* Proxy Inherit? */
//DEF_DEG_OPCODE(PROXY)

/* Transform --------------------------------------- */

/* Transform entry point - local transforms only */
DEF_DEG_OPCODE(TRANSFORM_LOCAL)

/* Parenting */
DEF_DEG_OPCODE(TRANSFORM_PARENT)

/* Constraints */
DEF_DEG_OPCODE(TRANSFORM_CONSTRAINTS)
//DEF_DEG_OPCODE(TRANSFORM_CONSTRAINTS_INIT)
//DEF_DEG_OPCODE(TRANSFORM_CONSTRAINT)
//DEF_DEG_OPCODE(TRANSFORM_CONSTRAINTS_DONE)

/* Rigidbody Sim - Perform Sim */
DEF_DEG_OPCODE(RIGIDBODY_REBUILD)
DEF_DEG_OPCODE(RIGIDBODY_SIM)

/* Rigidbody Sim - Copy Results to Object */
DEF_DEG_OPCODE(TRANSFORM_RIGIDBODY)

/* Transform exitpoint */
DEF_DEG_OPCODE(TRANSFORM_FINAL)

/* XXX: ubereval is for temporary porting purposes only */
DEF_DEG_OPCODE(OBJECT_UBEREVAL)

/* Geometry ---------------------------------------- */

/* XXX: Placeholder - UberEval */
DEF_DEG_OPCODE(GEOMETRY_UBEREVAL)

/* Modifier */
DEF_DEG_OPCODE(GEOMETRY_MODIFIER)

/* Curve Objects - Path Calculation (used for path-following tools) */
DEF_DEG_OPCODE(GEOMETRY_PATH)

/* Pose -------------------------------------------- */

/* Init IK Trees, etc. */
DEF_DEG_OPCODE(POSE_INIT)

/* Free IK Trees + Compute Deform Matrices */
DEF_DEG_OPCODE(POSE_DONE)

/* IK/Spline Solvers */
DEF_DEG_OPCODE(POSE_IK_SOLVER)
DEF_DEG_OPCODE(POSE_SPLINE_IK_SOLVER)

/* Bone -------------------------------------------- */

/* Bone local transforms - Entrypoint */
DEF_DEG_OPCODE(BONE_LOCAL)

/* Pose-space conversion (includes parent + restpose) */
DEF_DEG_OPCODE(BONE_POSE_PARENT)

/* Constraints */
DEF_DEG_OPCODE(BONE_CONSTRAINTS)
//DEF_DEG_OPCODE(BONE_CONSTRAINTS_INIT)
//DEF_DEG_OPCODE(BONE_CONSTRAINT)
//DEF_DEG_OPCODE(BONE_CONSTRAINTS_DONE)

/* 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 targetting 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...
DEF_DEG_OPCODE(BONE_READY)
DEF_DEG_OPCODE(BONE_DONE)

/* Particles --------------------------------------- */

/* XXX: placeholder - Particle System eval */
DEF_DEG_OPCODE(PSYS_EVAL)
