This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/depsgraph/intern/depsgraph_intern.h

154 lines
4.4 KiB
C++

/*
* ***** 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/depsgraph_intern.h
* \ingroup depsgraph
*
* API's for internal use in the Depsgraph
* - Also, defines for "Node Type Info"
*/
#pragma once
#include <cstdlib>
#include "MEM_guardedalloc.h"
extern "C" {
#include "BKE_global.h"
}
#include "intern/nodes/deg_node.h"
#include "intern/nodes/deg_node_component.h"
#include "intern/nodes/deg_node_operation.h"
#include "intern/depsgraph.h"
#include "DEG_depsgraph_debug.h"
struct DEGEditorUpdateContext;
struct Collection;
struct ListBase;
struct Main;
struct Scene;
namespace DEG {
/* Node Types Handling ================================================= */
/* "Typeinfo" for Node Types ------------------------------------------- */
/* Typeinfo Struct (nti) */
struct DepsNodeFactory {
virtual eDepsNode_Type type() const = 0;
virtual const char *tname() const = 0;
virtual int id_recalc_tag() const = 0;
virtual DepsNode *create_node(const ID *id,
const char *subdata,
const char *name) const = 0;
};
template <class NodeType>
struct DepsNodeFactoryImpl : public DepsNodeFactory {
eDepsNode_Type type() const { return NodeType::typeinfo.type; }
const char *tname() const { return NodeType::typeinfo.tname; }
int id_recalc_tag() const { return NodeType::typeinfo.id_recalc_tag; }
DepsNode *create_node(const ID *id, const char *subdata, const char *name) const
{
DepsNode *node = OBJECT_GUARDED_NEW(NodeType);
/* populate base node settings */
node->type = type();
if (name[0] != '\0') {
/* set name if provided ... */
node->name = name;
}
else {
/* ... otherwise use default type name */
node->name = tname();
}
node->init(id, subdata);
return node;
}
};
/* Typeinfo Management -------------------------------------------------- */
/* Register typeinfo */
void deg_register_node_typeinfo(DepsNodeFactory *factory);
/* Get typeinfo for specified type */
DepsNodeFactory *deg_type_get_factory(const eDepsNode_Type type);
/* Editors Integration -------------------------------------------------- */
void deg_editors_id_update(const DEGEditorUpdateContext *update_ctx,
struct ID *id);
void deg_editors_scene_update(const DEGEditorUpdateContext *update_ctx,
bool updated);
#define DEG_DEBUG_PRINTF(depsgraph, type, ...) \
do { \
if (DEG_debug_flags_get(depsgraph) & G_DEBUG_DEPSGRAPH_ ## type) { \
DEG_debug_print_begin(depsgraph); \
fprintf(stdout, __VA_ARGS__); \
} \
} while (0)
#define DEG_GLOBAL_DEBUG_PRINTF(type, ...) \
do { \
if (G.debug & G_DEBUG_DEPSGRAPH_ ## type) { \
fprintf(stdout, __VA_ARGS__); \
} \
} while (0)
#define DEG_ERROR_PRINTF(...) \
do { \
fprintf(stderr, __VA_ARGS__); \
fflush(stderr); \
} while (0)
bool deg_terminal_do_color(void);
string deg_color_for_pointer(const void *pointer);
string deg_color_end(void);
/* Physics Utilities -------------------------------------------------- */
struct ListBase *deg_build_effector_relations(Depsgraph *graph, struct Collection *collection);
struct ListBase *deg_build_collision_relations(Depsgraph *graph, struct Collection *collection, unsigned int modifier_type);
void deg_clear_physics_relations(Depsgraph *graph);
/* Tagging Utilities -------------------------------------------------------- */
eDepsNode_Type deg_geometry_tag_to_component(const ID *id);
} // namespace DEG