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')
-rw-r--r--source/blender/depsgraph/intern/node/deg_node.cc4
-rw-r--r--source/blender/depsgraph/intern/node/deg_node.h4
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_component.cc71
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_component.h21
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_id.cc54
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_id.h18
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_operation.cc7
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_operation.h5
8 files changed, 80 insertions, 104 deletions
diff --git a/source/blender/depsgraph/intern/node/deg_node.cc b/source/blender/depsgraph/intern/node/deg_node.cc
index d95e05a6f4f..10760d3170b 100644
--- a/source/blender/depsgraph/intern/node/deg_node.cc
+++ b/source/blender/depsgraph/intern/node/deg_node.cc
@@ -114,6 +114,8 @@ const char *nodeTypeAsString(NodeType type)
return "ARMATURE";
case NodeType::GENERIC_DATABLOCK:
return "GENERIC_DATABLOCK";
+ case NodeType::SIMULATION:
+ return "SIMULATION";
/* Total number of meaningful node types. */
case NodeType::NUM_TYPES:
@@ -172,6 +174,7 @@ eDepsSceneComponentType nodeTypeToSceneComponent(NodeType type)
case NodeType::SHADING:
case NodeType::CACHE:
case NodeType::PROXY:
+ case NodeType::SIMULATION:
return DEG_SCENE_COMP_PARAMETERS;
}
BLI_assert(!"Unhandled node type, not suppsed to happen.");
@@ -245,6 +248,7 @@ eDepsObjectComponentType nodeTypeToObjectComponent(NodeType type)
case NodeType::BATCH_CACHE:
case NodeType::DUPLI:
case NodeType::SYNCHRONIZATION:
+ case NodeType::SIMULATION:
case NodeType::UNDEFINED:
case NodeType::NUM_TYPES:
return DEG_OB_COMP_PARAMETERS;
diff --git a/source/blender/depsgraph/intern/node/deg_node.h b/source/blender/depsgraph/intern/node/deg_node.h
index ffa37341ea6..f0ce38ddeae 100644
--- a/source/blender/depsgraph/intern/node/deg_node.h
+++ b/source/blender/depsgraph/intern/node/deg_node.h
@@ -127,6 +127,8 @@ enum class NodeType {
DUPLI,
/* Synchronization back to original datablock. */
SYNCHRONIZATION,
+ /* Simulation component. */
+ SIMULATION,
/* Total number of meaningful node types. */
NUM_TYPES,
@@ -163,7 +165,7 @@ struct Node {
* The reason why all depsgraph nodes are descended from this type (apart
* from basic serialization benefits - from the typeinfo) is that we can
* have relationships between these nodes. */
- typedef vector<Relation *> Relations;
+ typedef Vector<Relation *> Relations;
string name; /* Identifier - mainly for debugging purposes. */
NodeType type; /* Structural type of node. */
diff --git a/source/blender/depsgraph/intern/node/deg_node_component.cc b/source/blender/depsgraph/intern/node/deg_node_component.cc
index 54796b8965b..f4d042fecf9 100644
--- a/source/blender/depsgraph/intern/node/deg_node_component.cc
+++ b/source/blender/depsgraph/intern/node/deg_node_component.cc
@@ -26,14 +26,11 @@
#include <cstring> /* required for STREQ later on. */
#include <stdio.h>
-#include "BLI_ghash.h"
#include "BLI_utildefines.h"
-extern "C" {
#include "DNA_object_types.h"
#include "BKE_action.h"
-} /* extern "C" */
#include "intern/node/deg_node_factory.h"
#include "intern/node/deg_node_id.h"
@@ -72,41 +69,10 @@ bool ComponentNode::OperationIDKey::operator==(const OperationIDKey &other) cons
return (opcode == other.opcode) && (STREQ(name, other.name)) && (name_tag == other.name_tag);
}
-static unsigned int comp_node_hash_key(const void *key_v)
-{
- const ComponentNode::OperationIDKey *key =
- reinterpret_cast<const ComponentNode::OperationIDKey *>(key_v);
- int opcode_as_int = static_cast<int>(key->opcode);
- return BLI_ghashutil_combine_hash(BLI_ghashutil_uinthash(opcode_as_int),
- BLI_ghashutil_strhash_p(key->name));
-}
-
-static bool comp_node_hash_key_cmp(const void *a, const void *b)
-{
- const ComponentNode::OperationIDKey *key_a =
- reinterpret_cast<const ComponentNode::OperationIDKey *>(a);
- const ComponentNode::OperationIDKey *key_b =
- reinterpret_cast<const ComponentNode::OperationIDKey *>(b);
- return !(*key_a == *key_b);
-}
-
-static void comp_node_hash_key_free(void *key_v)
-{
- typedef ComponentNode::OperationIDKey OperationIDKey;
- OperationIDKey *key = reinterpret_cast<OperationIDKey *>(key_v);
- OBJECT_GUARDED_DELETE(key, OperationIDKey);
-}
-
-static void comp_node_hash_value_free(void *value_v)
-{
- OperationNode *op_node = reinterpret_cast<OperationNode *>(value_v);
- OBJECT_GUARDED_DELETE(op_node, OperationNode);
-}
-
ComponentNode::ComponentNode()
: entry_operation(nullptr), exit_operation(nullptr), affects_directly_visible(false)
{
- operations_map = BLI_ghash_new(comp_node_hash_key, comp_node_hash_key_cmp, "Depsgraph id hash");
+ operations_map = new Map<ComponentNode::OperationIDKey, OperationNode *>();
}
/* Initialize 'component' node - from pointer data given */
@@ -121,7 +87,7 @@ ComponentNode::~ComponentNode()
{
clear_operations();
if (operations_map != nullptr) {
- BLI_ghash_free(operations_map, comp_node_hash_key_free, comp_node_hash_value_free);
+ delete operations_map;
}
}
@@ -137,7 +103,7 @@ OperationNode *ComponentNode::find_operation(OperationIDKey key) const
{
OperationNode *node = nullptr;
if (operations_map != nullptr) {
- node = (OperationNode *)BLI_ghash_lookup(operations_map, &key);
+ node = operations_map->lookup_default(key, nullptr);
}
else {
for (OperationNode *op_node : operations) {
@@ -203,8 +169,8 @@ OperationNode *ComponentNode::add_operation(const DepsEvalOperationCb &op,
op_node = (OperationNode *)factory->create_node(this->owner->id_orig, "", name);
/* register opnode in this component's operation set */
- OperationIDKey *key = OBJECT_GUARDED_NEW(OperationIDKey, opcode, name, name_tag);
- BLI_ghash_insert(operations_map, key, op_node);
+ OperationIDKey key(opcode, name, name_tag);
+ operations_map->add(key, op_node);
/* set backlink */
op_node->owner = this;
@@ -242,7 +208,10 @@ void ComponentNode::set_exit_operation(OperationNode *op_node)
void ComponentNode::clear_operations()
{
if (operations_map != nullptr) {
- BLI_ghash_clear(operations_map, comp_node_hash_key_free, comp_node_hash_value_free);
+ for (OperationNode *op_node : operations_map->values()) {
+ OBJECT_GUARDED_DELETE(op_node, OperationNode);
+ }
+ operations_map->clear();
}
for (OperationNode *op_node : operations) {
OBJECT_GUARDED_DELETE(op_node, OperationNode);
@@ -261,10 +230,9 @@ void ComponentNode::tag_update(Depsgraph *graph, eUpdateSource source)
}
// It is possible that tag happens before finalization.
if (operations_map != nullptr) {
- GHASH_FOREACH_BEGIN (OperationNode *, op_node, operations_map) {
+ for (OperationNode *op_node : operations_map->values()) {
op_node->tag_update(graph, source);
}
- GHASH_FOREACH_END();
}
}
@@ -273,13 +241,12 @@ OperationNode *ComponentNode::get_entry_operation()
if (entry_operation) {
return entry_operation;
}
- else if (operations_map != nullptr && BLI_ghash_len(operations_map) == 1) {
+ else if (operations_map != nullptr && operations_map->size() == 1) {
OperationNode *op_node = nullptr;
/* TODO(sergey): This is somewhat slow. */
- GHASH_FOREACH_BEGIN (OperationNode *, tmp, operations_map) {
+ for (OperationNode *tmp : operations_map->values()) {
op_node = tmp;
}
- GHASH_FOREACH_END();
/* Cache for the subsequent usage. */
entry_operation = op_node;
return op_node;
@@ -295,13 +262,12 @@ OperationNode *ComponentNode::get_exit_operation()
if (exit_operation) {
return exit_operation;
}
- else if (operations_map != nullptr && BLI_ghash_len(operations_map) == 1) {
+ else if (operations_map != nullptr && operations_map->size() == 1) {
OperationNode *op_node = nullptr;
/* TODO(sergey): This is somewhat slow. */
- GHASH_FOREACH_BEGIN (OperationNode *, tmp, operations_map) {
+ for (OperationNode *tmp : operations_map->values()) {
op_node = tmp;
}
- GHASH_FOREACH_END();
/* Cache for the subsequent usage. */
exit_operation = op_node;
return op_node;
@@ -314,12 +280,11 @@ OperationNode *ComponentNode::get_exit_operation()
void ComponentNode::finalize_build(Depsgraph * /*graph*/)
{
- operations.reserve(BLI_ghash_len(operations_map));
- GHASH_FOREACH_BEGIN (OperationNode *, op_node, operations_map) {
+ operations.reserve(operations_map->size());
+ for (OperationNode *op_node : operations_map->values()) {
operations.push_back(op_node);
}
- GHASH_FOREACH_END();
- BLI_ghash_free(operations_map, comp_node_hash_key_free, nullptr);
+ delete operations_map;
operations_map = nullptr;
}
@@ -368,6 +333,7 @@ DEG_COMPONENT_NODE_DEFINE(Synchronization, SYNCHRONIZATION, 0);
DEG_COMPONENT_NODE_DEFINE(Audio, AUDIO, 0);
DEG_COMPONENT_NODE_DEFINE(Armature, ARMATURE, 0);
DEG_COMPONENT_NODE_DEFINE(GenericDatablock, GENERIC_DATABLOCK, 0);
+DEG_COMPONENT_NODE_DEFINE(Simulation, SIMULATION, 0);
/* Node Types Register =================================== */
@@ -397,6 +363,7 @@ void deg_register_component_depsnodes()
register_node_typeinfo(&DNTI_AUDIO);
register_node_typeinfo(&DNTI_ARMATURE);
register_node_typeinfo(&DNTI_GENERIC_DATABLOCK);
+ register_node_typeinfo(&DNTI_SIMULATION);
}
} // namespace DEG
diff --git a/source/blender/depsgraph/intern/node/deg_node_component.h b/source/blender/depsgraph/intern/node/deg_node_component.h
index 38ea4005a72..ca37401d200 100644
--- a/source/blender/depsgraph/intern/node/deg_node_component.h
+++ b/source/blender/depsgraph/intern/node/deg_node_component.h
@@ -26,10 +26,11 @@
#include "intern/node/deg_node.h"
#include "intern/node/deg_node_operation.h"
+#include "BLI_ghash.h"
+#include "BLI_hash.hh"
#include "BLI_string.h"
#include "BLI_utildefines.h"
-struct GHash;
struct ID;
struct bPoseChannel;
@@ -115,7 +116,7 @@ struct ComponentNode : public Node {
/* Operations stored as a hash map, for faster build.
* This hash map will be freed when graph is fully built. */
- GHash *operations_map;
+ Map<ComponentNode::OperationIDKey, OperationNode *> *operations_map;
/* This is a "normal" list of operations, used by evaluation
* and other routines after construction. */
@@ -190,6 +191,7 @@ DEG_COMPONENT_NODE_DECLARE_GENERIC(Synchronization);
DEG_COMPONENT_NODE_DECLARE_GENERIC(Audio);
DEG_COMPONENT_NODE_DECLARE_GENERIC(Armature);
DEG_COMPONENT_NODE_DECLARE_GENERIC(GenericDatablock);
+DEG_COMPONENT_NODE_DECLARE_GENERIC(Simulation);
/* Bone Component */
struct BoneComponentNode : public ComponentNode {
@@ -203,3 +205,18 @@ struct BoneComponentNode : public ComponentNode {
void deg_register_component_depsnodes();
} // namespace DEG
+
+namespace BLI {
+
+template<> struct DefaultHash<DEG::ComponentNode::OperationIDKey> {
+ uint32_t operator()(const DEG::ComponentNode::OperationIDKey &key) const
+ {
+ const int opcode_as_int = static_cast<int>(key.opcode);
+ return BLI_ghashutil_combine_hash(
+ key.name_tag,
+ BLI_ghashutil_combine_hash(BLI_ghashutil_uinthash(opcode_as_int),
+ BLI_ghashutil_strhash_p(key.name)));
+ }
+};
+
+} // namespace BLI
diff --git a/source/blender/depsgraph/intern/node/deg_node_id.cc b/source/blender/depsgraph/intern/node/deg_node_id.cc
index 0bb09390b4f..4a7e5c4568b 100644
--- a/source/blender/depsgraph/intern/node/deg_node_id.cc
+++ b/source/blender/depsgraph/intern/node/deg_node_id.cc
@@ -26,17 +26,13 @@
#include <cstring> /* required for STREQ later on. */
#include <stdio.h>
-#include "BLI_ghash.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
-extern "C" {
#include "DNA_ID.h"
#include "DNA_anim_types.h"
-#include "BKE_animsys.h"
#include "BKE_lib_id.h"
-}
#include "DEG_depsgraph.h"
@@ -70,34 +66,6 @@ bool IDNode::ComponentIDKey::operator==(const ComponentIDKey &other) const
return type == other.type && STREQ(name, other.name);
}
-static unsigned int id_deps_node_hash_key(const void *key_v)
-{
- const IDNode::ComponentIDKey *key = reinterpret_cast<const IDNode::ComponentIDKey *>(key_v);
- const int type_as_int = static_cast<int>(key->type);
- return BLI_ghashutil_combine_hash(BLI_ghashutil_uinthash(type_as_int),
- BLI_ghashutil_strhash_p(key->name));
-}
-
-static bool id_deps_node_hash_key_cmp(const void *a, const void *b)
-{
- const IDNode::ComponentIDKey *key_a = reinterpret_cast<const IDNode::ComponentIDKey *>(a);
- const IDNode::ComponentIDKey *key_b = reinterpret_cast<const IDNode::ComponentIDKey *>(b);
- return !(*key_a == *key_b);
-}
-
-static void id_deps_node_hash_key_free(void *key_v)
-{
- typedef IDNode::ComponentIDKey ComponentIDKey;
- ComponentIDKey *key = reinterpret_cast<ComponentIDKey *>(key_v);
- OBJECT_GUARDED_DELETE(key, ComponentIDKey);
-}
-
-static void id_deps_node_hash_value_free(void *value_v)
-{
- ComponentNode *comp_node = reinterpret_cast<ComponentNode *>(value_v);
- OBJECT_GUARDED_DELETE(comp_node, ComponentNode);
-}
-
/* Initialize 'id' node - from pointer data given. */
void IDNode::init(const ID *id, const char *UNUSED(subdata))
{
@@ -117,9 +85,6 @@ void IDNode::init(const ID *id, const char *UNUSED(subdata))
visible_components_mask = 0;
previously_visible_components_mask = 0;
-
- components = BLI_ghash_new(
- id_deps_node_hash_key, id_deps_node_hash_key_cmp, "Depsgraph id components hash");
}
void IDNode::init_copy_on_write(ID *id_cow_hint)
@@ -159,7 +124,9 @@ void IDNode::destroy()
return;
}
- BLI_ghash_free(components, id_deps_node_hash_key_free, id_deps_node_hash_value_free);
+ for (ComponentNode *comp_node : components.values()) {
+ OBJECT_GUARDED_DELETE(comp_node, ComponentNode);
+ }
/* Free memory used by this CoW ID. */
if (id_cow != id_orig && id_cow != nullptr) {
@@ -186,7 +153,7 @@ string IDNode::identifier() const
ComponentNode *IDNode::find_component(NodeType type, const char *name) const
{
ComponentIDKey key(type, name);
- return reinterpret_cast<ComponentNode *>(BLI_ghash_lookup(components, &key));
+ return components.lookup_default(key, nullptr);
}
ComponentNode *IDNode::add_component(NodeType type, const char *name)
@@ -197,8 +164,8 @@ ComponentNode *IDNode::add_component(NodeType type, const char *name)
comp_node = (ComponentNode *)factory->create_node(this->id_orig, "", name);
/* Register. */
- ComponentIDKey *key = OBJECT_GUARDED_NEW(ComponentIDKey, type, name);
- BLI_ghash_insert(components, key, comp_node);
+ ComponentIDKey key(type, name);
+ components.add_new(key, comp_node);
comp_node->owner = this;
}
return comp_node;
@@ -206,7 +173,7 @@ ComponentNode *IDNode::add_component(NodeType type, const char *name)
void IDNode::tag_update(Depsgraph *graph, eUpdateSource source)
{
- GHASH_FOREACH_BEGIN (ComponentNode *, comp_node, components) {
+ for (ComponentNode *comp_node : components.values()) {
/* Relations update does explicit animation update when needed. Here we ignore animation
* component to avoid loss of possible unkeyed changes. */
if (comp_node->type == NodeType::ANIMATION && source == DEG_UPDATE_SOURCE_RELATIONS) {
@@ -214,30 +181,27 @@ void IDNode::tag_update(Depsgraph *graph, eUpdateSource source)
}
comp_node->tag_update(graph, source);
}
- GHASH_FOREACH_END();
}
void IDNode::finalize_build(Depsgraph *graph)
{
/* Finalize build of all components. */
- GHASH_FOREACH_BEGIN (ComponentNode *, comp_node, components) {
+ for (ComponentNode *comp_node : components.values()) {
comp_node->finalize_build(graph);
}
- GHASH_FOREACH_END();
visible_components_mask = get_visible_components_mask();
}
IDComponentsMask IDNode::get_visible_components_mask() const
{
IDComponentsMask result = 0;
- GHASH_FOREACH_BEGIN (ComponentNode *, comp_node, components) {
+ for (ComponentNode *comp_node : components.values()) {
if (comp_node->affects_directly_visible) {
const int component_type_as_int = static_cast<int>(comp_node->type);
BLI_assert(component_type_as_int < 64);
result |= (1ULL << component_type_as_int);
}
}
- GHASH_FOREACH_END();
return result;
}
diff --git a/source/blender/depsgraph/intern/node/deg_node_id.h b/source/blender/depsgraph/intern/node/deg_node_id.h
index 80bb67f182f..c7663b50c6f 100644
--- a/source/blender/depsgraph/intern/node/deg_node_id.h
+++ b/source/blender/depsgraph/intern/node/deg_node_id.h
@@ -23,12 +23,11 @@
#pragma once
+#include "BLI_ghash.h"
#include "BLI_sys_types.h"
#include "DNA_ID.h"
#include "intern/node/deg_node.h"
-struct GHash;
-
namespace DEG {
struct ComponentNode;
@@ -82,7 +81,7 @@ struct IDNode : public Node {
ID *id_cow;
/* Hash to make it faster to look up components. */
- GHash *components;
+ Map<ComponentIDKey, ComponentNode *> components;
/* Additional flags needed for scene evaluation.
* TODO(sergey): Only needed for until really granular updates
@@ -116,3 +115,16 @@ struct IDNode : public Node {
};
} // namespace DEG
+
+namespace BLI {
+
+template<> struct DefaultHash<DEG::IDNode::ComponentIDKey> {
+ uint32_t operator()(const DEG::IDNode::ComponentIDKey &key) const
+ {
+ const int type_as_int = static_cast<int>(key.type);
+ return BLI_ghashutil_combine_hash(BLI_ghashutil_uinthash(type_as_int),
+ BLI_ghashutil_strhash_p(key.name));
+ }
+};
+
+} // namespace BLI
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.cc b/source/blender/depsgraph/intern/node/deg_node_operation.cc
index 78399d5c953..91bd0117f6c 100644
--- a/source/blender/depsgraph/intern/node/deg_node_operation.cc
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.cc
@@ -25,7 +25,6 @@
#include "MEM_guardedalloc.h"
-#include "BLI_ghash.h"
#include "BLI_utildefines.h"
#include "intern/depsgraph.h"
@@ -61,6 +60,8 @@ const char *operationCodeAsString(OperationCode opcode)
/* Scene related. */
case OperationCode::SCENE_EVAL:
return "SCENE_EVAL";
+ case OperationCode::AUDIO_VOLUME:
+ return "AUDIO_VOLUME";
/* Object related. */
case OperationCode::OBJECT_BASE_FLAGS:
return "OBJECT_BASE_FLAGS";
@@ -171,6 +172,8 @@ const char *operationCodeAsString(OperationCode opcode)
return "SHADING";
case OperationCode::MATERIAL_UPDATE:
return "MATERIAL_UPDATE";
+ case OperationCode::LIGHT_UPDATE:
+ return "LIGHT_UPDATE";
case OperationCode::WORLD_UPDATE:
return "WORLD_UPDATE";
/* Movie clip. */
@@ -193,6 +196,8 @@ const char *operationCodeAsString(OperationCode opcode)
/* instancing/duplication. */
case OperationCode::DUPLI:
return "DUPLI";
+ case OperationCode::SIMULATION_EVAL:
+ return "SIMULATION_EVAL";
}
BLI_assert(!"Unhandled operation code, should never happen.");
return "UNKNOWN";
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.h b/source/blender/depsgraph/intern/node/deg_node_operation.h
index bdc0df7f399..6b14e6af02f 100644
--- a/source/blender/depsgraph/intern/node/deg_node_operation.h
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.h
@@ -60,6 +60,7 @@ enum class OperationCode {
/* Scene related. ------------------------------------------------------- */
SCENE_EVAL,
+ AUDIO_VOLUME,
/* Object related. ------------------------------------------------------ */
OBJECT_BASE_FLAGS,
@@ -169,6 +170,7 @@ enum class OperationCode {
/* Shading. ------------------------------------------------------------- */
SHADING,
MATERIAL_UPDATE,
+ LIGHT_UPDATE,
WORLD_UPDATE,
/* Batch caches. -------------------------------------------------------- */
@@ -197,6 +199,9 @@ enum class OperationCode {
/* Duplication/instancing system. --------------------------------------- */
DUPLI,
+
+ /* Simulation. ---------------------------------------------------------- */
+ SIMULATION_EVAL,
};
const char *operationCodeAsString(OperationCode opcode);