Depsgraph: use BLI::Map in RootPChanMap

Reviewers: sergey, sybren

Differential Revision: https://developer.blender.org/D7521
This commit is contained in:
Jacques Lucke 2020-04-28 15:56:53 +02:00
parent 6278b48ea1
commit 69e8de434f
3 changed files with 24 additions and 68 deletions

View File

@ -31,99 +31,51 @@
namespace DEG {
static void free_rootpchanmap_valueset(void *val)
{
/* Just need to free the set itself - the names stored are all references. */
GSet *values = (GSet *)val;
BLI_gset_free(values, nullptr);
}
RootPChanMap::RootPChanMap()
{
/* Just create empty map. */
map_ = BLI_ghash_str_new("RootPChanMap");
}
RootPChanMap::~RootPChanMap()
{
/* Free the map, and all the value sets. */
BLI_ghash_free(map_, nullptr, free_rootpchanmap_valueset);
}
/* Debug contents of map */
void RootPChanMap::print_debug()
{
GHashIterator it1;
GSetIterator it2;
printf("Root PChan Map:\n");
GHASH_ITER (it1, map_) {
const char *item = (const char *)BLI_ghashIterator_getKey(&it1);
GSet *values = (GSet *)BLI_ghashIterator_getValue(&it1);
printf(" %s : { ", item);
GSET_ITER (it2, values) {
const char *val = (const char *)BLI_gsetIterator_getKey(&it2);
printf("%s, ", val);
map_.foreach_item([](StringRefNull key, const Set<StringRefNull> &values) {
printf(" %s : { ", key.data());
for (StringRefNull val : values) {
printf("%s, ", val.data());
}
printf("}\n");
}
});
}
/* Add a mapping. */
void RootPChanMap::add_bone(const char *bone, const char *root)
{
if (BLI_ghash_haskey(map_, bone)) {
/* Add new entry, but only add the root if it doesn't already
* exist in there. */
GSet *values = (GSet *)BLI_ghash_lookup(map_, bone);
BLI_gset_add(values, (void *)root);
}
else {
/* Create new set and mapping. */
GSet *values = BLI_gset_new(
BLI_ghashutil_strhash_p, BLI_ghashutil_strcmp, "RootPChanMap Value Set");
BLI_ghash_insert(map_, (void *)bone, (void *)values);
/* Add new entry now. */
BLI_gset_insert(values, (void *)root);
}
map_.lookup_or_add_default(bone).add(root);
}
/* Check if there's a common root bone between two bones. */
bool RootPChanMap::has_common_root(const char *bone1, const char *bone2) const
{
/* Ensure that both are in the map... */
if (BLI_ghash_haskey(map_, bone1) == false) {
const Set<StringRefNull> *bone1_roots = map_.lookup_ptr(bone1);
const Set<StringRefNull> *bone2_roots = map_.lookup_ptr(bone2);
if (bone1_roots == nullptr) {
// fprintf("RootPChanMap: bone1 '%s' not found (%s => %s)\n", bone1, bone1, bone2);
// print_debug();
return false;
}
if (BLI_ghash_haskey(map_, bone2) == false) {
if (bone2_roots == nullptr) {
// fprintf("RootPChanMap: bone2 '%s' not found (%s => %s)\n", bone2, bone1, bone2);
// print_debug();
return false;
}
GSet *bone1_roots = (GSet *)BLI_ghash_lookup(map_, (void *)bone1);
GSet *bone2_roots = (GSet *)BLI_ghash_lookup(map_, (void *)bone2);
GSetIterator it1, it2;
GSET_ITER (it1, bone1_roots) {
GSET_ITER (it2, bone2_roots) {
const char *v1 = (const char *)BLI_gsetIterator_getKey(&it1);
const char *v2 = (const char *)BLI_gsetIterator_getKey(&it2);
if (strcmp(v1, v2) == 0) {
// fprintf("RootPchanMap: %s in common for %s => %s\n", v1, bone1, bone2);
return true;
}
}
}
// fprintf("RootPChanMap: No common root found (%s => %s)\n", bone1, bone2);
return false;
return Set<StringRefNull>::Intersects(*bone1_roots, *bone2_roots);
}
} // namespace DEG

View File

@ -23,7 +23,7 @@
#pragma once
struct GHash;
#include "intern/depsgraph_type.h"
namespace DEG {
@ -42,13 +42,11 @@ struct RootPChanMap {
bool has_common_root(const char *bone1, const char *bone2) const;
protected:
/* The actual map:
* - Keys are "strings" (const char *) - not dynamically allocated.
* - Values are "sets" (const char *) - not dynamically allocated.
*
* We don't use the C++ maps here, as it's more convenient to use
* Blender's GHash and be able to compare by-value instead of by-ref. */
struct GHash *map_;
/**
* The strings are only referenced by this map. Users of RootPChanMap have to make sure that the
* life-time of the strings is long enough.
*/
Map<StringRefNull, Set<StringRefNull>> map_;
};
} // namespace DEG

View File

@ -43,6 +43,8 @@
#include "BLI_map.hh"
#include "BLI_set.hh"
#include "BLI_string_ref.hh"
#include "BLI_vector.hh"
struct Depsgraph;
@ -51,8 +53,12 @@ struct CustomData_MeshMasks;
namespace DEG {
/* Commonly used types. */
using BLI::ArrayRef;
using BLI::Map;
using BLI::Set;
using BLI::StringRef;
using BLI::StringRefNull;
using BLI::Vector;
using std::deque;
using std::map;
using std::pair;