Blender  V3.3
dupli_parent_finder.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2020 Blender Foundation. All rights reserved. */
3 
4 #include "dupli_parent_finder.hh"
5 
6 #include "BLI_utildefines.h"
7 
8 #include <iostream>
9 
10 namespace blender::io {
11 
13 {
14  dupli_set_.insert(dupli_ob->ob);
15 
16  PersistentID dupli_pid(dupli_ob);
17  pid_to_dupli_[dupli_pid] = dupli_ob;
18  instancer_pid_to_duplis_[dupli_pid.instancer_pid()].insert(dupli_ob);
19 }
20 
21 bool DupliParentFinder::is_duplicated(const Object *object) const
22 {
23  return dupli_set_.find(object) != dupli_set_.end();
24 }
25 
27  const DupliObject *dupli_ob) const
28 {
29  if (dupli_ob->ob->parent != nullptr) {
30  const DupliObject *parent = find_duplicated_parent(dupli_ob);
31  if (parent != nullptr) {
32  return parent;
33  }
34  }
35 
36  return find_instancer(dupli_ob);
37 }
38 
39 const DupliObject *DupliParentFinder::find_duplicated_parent(const DupliObject *dupli_ob) const
40 {
41  const PersistentID dupli_pid(dupli_ob);
42  PersistentID parent_pid = dupli_pid.instancer_pid();
43 
44  const Object *parent_ob = dupli_ob->ob->parent;
45  BLI_assert(parent_ob != nullptr);
46 
47  InstancerPIDToDuplisMap::const_iterator found = instancer_pid_to_duplis_.find(parent_pid);
48  if (found == instancer_pid_to_duplis_.end()) {
49  /* Unexpected, as there should be at least one entry here, for the dupli_ob itself. */
50  return nullptr;
51  }
52 
53  for (const DupliObject *potential_parent_dupli : found->second) {
54  if (potential_parent_dupli->ob != parent_ob) {
55  continue;
56  }
57 
58  PersistentID potential_parent_pid(potential_parent_dupli);
59  if (potential_parent_pid.is_from_same_instancer_as(dupli_pid)) {
60  return potential_parent_dupli;
61  }
62  }
63  return nullptr;
64 }
65 
66 const DupliObject *DupliParentFinder::find_instancer(const DupliObject *dupli_ob) const
67 {
68  PersistentID dupli_pid(dupli_ob);
69  PersistentID parent_pid = dupli_pid.instancer_pid();
70 
71  PIDToDupliMap::const_iterator found = pid_to_dupli_.find(parent_pid);
72  if (found == pid_to_dupli_.end()) {
73  return nullptr;
74  }
75 
76  const DupliObject *instancer_dupli = found->second;
77  return instancer_dupli;
78 }
79 
80 } // namespace blender::io
#define BLI_assert(a)
Definition: BLI_assert.h:46
const DupliObject * find_suitable_export_parent(const DupliObject *dupli_ob) const
void insert(const DupliObject *dupli_ob)
bool is_duplicated(const Object *object) const
PersistentID instancer_pid() const
struct Object * ob
Definition: BKE_duplilist.h:34
struct Object * parent