diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_persistent_data_handle.hh | 132 | ||||
-rw-r--r-- | source/blender/blenkernel/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/simulation.cc | 9 |
5 files changed, 144 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 1d01436c7e4..4c55488ecd5 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1343,6 +1343,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define FN_NODE_FLOAT_COMPARE 1202 #define FN_NODE_GROUP_INSTANCE_ID 1203 #define FN_NODE_COMBINE_STRINGS 1204 +#define FN_NODE_OBJECT_TRANSFORMS 1205 /** \} */ diff --git a/source/blender/blenkernel/BKE_persistent_data_handle.hh b/source/blender/blenkernel/BKE_persistent_data_handle.hh new file mode 100644 index 00000000000..721132560e3 --- /dev/null +++ b/source/blender/blenkernel/BKE_persistent_data_handle.hh @@ -0,0 +1,132 @@ +/* + * 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. + */ + +#ifndef __BKE_PERSISTENT_DATA_HANDLE_H__ +#define __BKE_PERSISTENT_DATA_HANDLE_H__ + +/** \file + * \ingroup bke + * + * A PersistentDataHandle is a weak reference to some data in a Blender file. The handle itself is + * just a number. A PersistentDataHandleMap is used to convert between handles and the actual data. + */ + +#include "BLI_map.hh" + +#include "DNA_ID.h" + +struct Object; + +namespace blender::bke { + +class PersistentDataHandleMap; + +class PersistentDataHandle { + private: + /* Negative values indicate that the handle is "empty". */ + int32_t handle_; + + friend PersistentDataHandleMap; + + protected: + PersistentDataHandle(int handle) : handle_(handle) + { + } + + public: + PersistentDataHandle() : handle_(-1) + { + } + + friend bool operator==(const PersistentDataHandle &a, const PersistentDataHandle &b) + { + return a.handle_ == b.handle_; + } + + friend bool operator!=(const PersistentDataHandle &a, const PersistentDataHandle &b) + { + return !(a == b); + } + + friend std::ostream &operator<<(std::ostream &stream, const PersistentDataHandle &a) + { + stream << a.handle_; + return stream; + } + + uint64_t hash() const + { + return (uint64_t)handle_; + } +}; + +class PersistentIDHandle : public PersistentDataHandle { + friend PersistentDataHandleMap; + using PersistentDataHandle::PersistentDataHandle; +}; + +class PersistentObjectHandle : public PersistentIDHandle { + friend PersistentDataHandleMap; + using PersistentIDHandle::PersistentIDHandle; +}; + +class PersistentDataHandleMap { + private: + Map<int32_t, const ID *> id_by_handle_; + Map<const ID *, int32_t> handle_by_id_; + + public: + void add(int32_t handle, const ID &id) + { + BLI_assert(handle >= 0); + handle_by_id_.add(&id, handle); + id_by_handle_.add(handle, &id); + } + + PersistentIDHandle lookup(const ID *id) const + { + const int handle = handle_by_id_.lookup_default(id, -1); + return PersistentIDHandle(handle); + } + + PersistentObjectHandle lookup(const Object *object) const + { + const int handle = handle_by_id_.lookup_default((const ID *)object, -1); + return PersistentObjectHandle(handle); + } + + const ID *lookup(const PersistentIDHandle &handle) const + { + const ID *id = id_by_handle_.lookup_default(handle.handle_, nullptr); + return id; + } + + const Object *lookup(const PersistentObjectHandle &handle) const + { + const ID *id = this->lookup((const PersistentIDHandle &)handle); + if (id == nullptr) { + return nullptr; + } + if (GS(id->name) != ID_OB) { + return nullptr; + } + return (const Object *)id; + } +}; + +} // namespace blender::bke + +#endif /* __BKE_PERSISTENT_DATA_HANDLE_H__ */ diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 800fa7d18ee..d702da55ea8 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -363,6 +363,7 @@ set(SRC BKE_packedFile.h BKE_paint.h BKE_particle.h + BKE_persistent_data_handle.hh BKE_pbvh.h BKE_pointcache.h BKE_pointcloud.h diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 52f0d259058..20d65e52b09 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -4345,6 +4345,7 @@ static void registerFunctionNodes(void) register_node_type_fn_switch(); register_node_type_fn_group_instance_id(); register_node_type_fn_combine_strings(); + register_node_type_fn_object_transforms(); } void init_nodesystem(void) diff --git a/source/blender/blenkernel/intern/simulation.cc b/source/blender/blenkernel/intern/simulation.cc index 1ac987d130d..1f11869e21c 100644 --- a/source/blender/blenkernel/intern/simulation.cc +++ b/source/blender/blenkernel/intern/simulation.cc @@ -89,6 +89,9 @@ static void simulation_copy_data(Main *bmain, ID *id_dst, const ID *id_src, cons } BLI_listbase_clear(&simulation_dst->states); + + BLI_duplicatelist(&simulation_dst->persistent_data_handles, + &simulation_src->persistent_data_handles); } static void free_simulation_state_head(SimulationState *state) @@ -169,6 +172,8 @@ static void simulation_free_data(ID *id) } BKE_simulation_state_remove_all(simulation); + + BLI_freelistN(&simulation->persistent_data_handles); } static void simulation_foreach_id(ID *id, LibraryForeachIDData *data) @@ -178,6 +183,10 @@ static void simulation_foreach_id(ID *id, LibraryForeachIDData *data) /* nodetree **are owned by IDs**, treat them as mere sub-data and not real ID! */ BKE_library_foreach_ID_embedded(data, (ID **)&simulation->nodetree); } + LISTBASE_FOREACH ( + PersistentDataHandleItem *, handle_item, &simulation->persistent_data_handles) { + BKE_LIB_FOREACHID_PROCESS_ID(data, handle_item->id, IDWALK_CB_USER); + } } IDTypeInfo IDType_ID_SIM = { |