[Bf-blender-cvs] [9a62bb6ce57] sybren-usd: USD: Changed ExportGraph type to hold HierarchyContext pointers

Sybren A. Stüvel noreply at git.blender.org
Tue Jul 16 18:44:10 CEST 2019


Commit: 9a62bb6ce5723e3ab802d1f6382c5f0909b49a5a
Author: Sybren A. Stüvel
Date:   Tue Jul 16 18:37:21 2019 +0200
Branches: sybren-usd
https://developer.blender.org/rB9a62bb6ce5723e3ab802d1f6382c5f0909b49a5a

USD: Changed ExportGraph type to hold HierarchyContext pointers

This allows us to change the stored HierarchyContext objects in a future
commit.

No functional changes.

===================================================================

M	source/blender/usd/intern/abstract_hierarchy_iterator.cc
M	source/blender/usd/intern/abstract_hierarchy_iterator.h
M	source/blender/usd/intern/usd_hierarchy_iterator.cc
M	source/blender/usd/intern/usd_hierarchy_iterator.h

===================================================================

diff --git a/source/blender/usd/intern/abstract_hierarchy_iterator.cc b/source/blender/usd/intern/abstract_hierarchy_iterator.cc
index 0ab8678d437..2f82399a8bc 100644
--- a/source/blender/usd/intern/abstract_hierarchy_iterator.cc
+++ b/source/blender/usd/intern/abstract_hierarchy_iterator.cc
@@ -20,10 +20,9 @@ extern "C" {
 #include "DEG_depsgraph_query.h"
 }
 
-const HierarchyContext &HierarchyContext::root()
+const HierarchyContext *HierarchyContext::root()
 {
-  static const HierarchyContext root_hierarchy_context = {.object = nullptr};
-  return root_hierarchy_context;
+  return nullptr;
 }
 
 bool HierarchyContext::operator<(const HierarchyContext &other) const
@@ -63,13 +62,13 @@ void AbstractHierarchyIterator::release_writers()
 
 void AbstractHierarchyIterator::iterate()
 {
-  construct_export_graph();
-  prune_export_graph();
+  export_graph_construct();
+  export_graph_prune();
   make_writers(HierarchyContext::root(), nullptr);
-  export_graph.clear();
+  export_graph_clear();
 }
 
-void AbstractHierarchyIterator::construct_export_graph()
+void AbstractHierarchyIterator::export_graph_construct()
 {
   Scene *scene = DEG_get_evaluated_scene(depsgraph);
 
@@ -125,25 +124,25 @@ void AbstractHierarchyIterator::visit_object(Object *object,
                                              Object *export_parent,
                                              bool weak_export)
 {
-  HierarchyContext context;
-  context.object = object;
-  context.export_name = get_object_name(object);
-  context.export_parent = export_parent;
-  context.duplicator = nullptr;
-  context.weak_export = weak_export;
-  context.animation_check_include_parent = false;
-  context.export_path = "";
-  context.parent_writer = nullptr;
-  copy_m4_m4(context.matrix_world, object->obmat);
+  HierarchyContext *context = new HierarchyContext();
+  context->object = object;
+  context->export_name = get_object_name(object);
+  context->export_parent = export_parent;
+  context->duplicator = nullptr;
+  context->weak_export = weak_export;
+  context->animation_check_include_parent = false;
+  context->export_path = "";
+  context->parent_writer = nullptr;
+  copy_m4_m4(context->matrix_world, object->obmat);
 
   export_graph[std::make_pair(export_parent, nullptr)].insert(context);
 
   // std::string export_parent_name = export_parent ? get_object_name(export_parent) : "/";
   // printf("    OB %30s %p (export-parent=%s; world x = %f)\n",
-  //        context.export_name.c_str(),
-  //        context.object,
+  //        context->export_name.c_str(),
+  //        context->object,
   //        export_parent_name.c_str(),
-  //        context.matrix_world[3][0]);
+  //        context->matrix_world[3][0]);
 }
 
 void AbstractHierarchyIterator::visit_dupli_object(DupliObject *dupli_object,
@@ -153,19 +152,19 @@ void AbstractHierarchyIterator::visit_dupli_object(DupliObject *dupli_object,
   ExportGraph::key_type graph_index;
   bool animation_check_include_parent = false;
 
-  HierarchyContext context;
-  context.object = dupli_object->ob;
-  context.duplicator = duplicator;
-  context.weak_export = false;
-  context.export_path = "";
-  context.parent_writer = nullptr;
+  HierarchyContext *context = new HierarchyContext();
+  context->object = dupli_object->ob;
+  context->duplicator = duplicator;
+  context->weak_export = false;
+  context->export_path = "";
+  context->parent_writer = nullptr;
 
   /* If the dupli-object's scene parent is also instanced by this object, use that as the
    * export parent. Otherwise use the dupli-parent as export parent. */
   Object *parent = dupli_object->ob->parent;
   if (parent != nullptr && dupli_set.find(parent) != dupli_set.end()) {
     // The parent object is part of the duplicated collection.
-    context.export_parent = parent;
+    context->export_parent = parent;
     graph_index = std::make_pair(parent, duplicator);
   }
   else {
@@ -173,15 +172,16 @@ void AbstractHierarchyIterator::visit_dupli_object(DupliObject *dupli_object,
      * transform of this dupliobject can be influenced by objects that are not part of its
      * export graph. */
     animation_check_include_parent = true;
-    context.export_parent = duplicator;
+    context->export_parent = duplicator;
     graph_index = std::make_pair(duplicator, nullptr);
   }
 
-  context.animation_check_include_parent = animation_check_include_parent;
-  copy_m4_m4(context.matrix_world, dupli_object->mat);
+  context->animation_check_include_parent = animation_check_include_parent;
+  copy_m4_m4(context->matrix_world, dupli_object->mat);
 
-  std::string export_parent_name = context.export_parent ? get_object_name(context.export_parent) :
-                                                           "/";
+  std::string export_parent_name = context->export_parent ?
+                                       get_object_name(context->export_parent) :
+                                       "/";
 
   // Construct export name for the dupli-instance.
   std::stringstream suffix_stream;
@@ -189,34 +189,38 @@ void AbstractHierarchyIterator::visit_dupli_object(DupliObject *dupli_object,
   for (int i = 0; i < MAX_DUPLI_RECUR && dupli_object->persistent_id[i] != INT_MAX; i++) {
     suffix_stream << "-" << dupli_object->persistent_id[i];
   }
-  context.export_name = make_valid_name(get_object_name(context.object) + suffix_stream.str());
+  context->export_name = make_valid_name(get_object_name(context->object) + suffix_stream.str());
 
   export_graph[graph_index].insert(context);
 
   // printf("    DU %30s %p (export-parent=%s; duplicator = %s; world x = %f)\n",
-  //        context.export_name.c_str(),
-  //        context.object,
+  //        context->export_name.c_str(),
+  //        context->object,
   //        export_parent_name.c_str(),
   //        duplicator->id.name + 2,
-  //        context.matrix_world[3][0]);
+  //        context->matrix_world[3][0]);
 }
 
-static bool prune_the_weak(const HierarchyContext &context,
+static bool prune_the_weak(const HierarchyContext *context,
                            AbstractHierarchyIterator::ExportGraph &modify,
                            const AbstractHierarchyIterator::ExportGraph &iterate)
 {
-  bool all_is_weak = context.weak_export;
-  const auto map_index = std::make_pair(context.object, context.duplicator);
+  bool all_is_weak = context != nullptr && context->weak_export;
+  Object *object = context != nullptr ? context->object : nullptr;
+  Object *duplicator = context != nullptr ? context->duplicator : nullptr;
+
+  const auto map_index = std::make_pair(object, duplicator);
   AbstractHierarchyIterator::ExportGraph::const_iterator child_iterator = iterate.find(map_index);
 
   if (child_iterator != iterate.end()) {
-    for (const HierarchyContext &child_context : child_iterator->second) {
+    for (HierarchyContext *child_context : child_iterator->second) {
       bool child_tree_is_weak = prune_the_weak(child_context, modify, iterate);
       all_is_weak &= child_tree_is_weak;
 
       if (child_tree_is_weak) {
         // This subtree is all weak, so we can remove it from the current object's children.
         modify[map_index].erase(child_context);
+        delete child_context;
       }
     }
   }
@@ -229,41 +233,58 @@ static bool prune_the_weak(const HierarchyContext &context,
   return all_is_weak;
 }
 
-void AbstractHierarchyIterator::prune_export_graph()
+void AbstractHierarchyIterator::export_graph_prune()
 {
   // Take a copy of the map so that we can modify while recursing.
   ExportGraph unpruned_export_graph = export_graph;
   prune_the_weak(HierarchyContext::root(), export_graph, unpruned_export_graph);
 }
 
-void AbstractHierarchyIterator::make_writers(const HierarchyContext &parent_context,
+void AbstractHierarchyIterator::export_graph_clear()
+{
+  for (ExportGraph::iterator::value_type &it : export_graph) {
+    for (HierarchyContext *context : it.second) {
+      delete context;
+    }
+  }
+  export_graph.clear();
+}
+
+AbstractHierarchyIterator::ExportGraph::mapped_type &AbstractHierarchyIterator::graph_children(
+    const HierarchyContext *parent_context)
+{
+  Object *parent_object = parent_context ? parent_context->object : nullptr;
+  Object *parent_duplicator = parent_context ? parent_context->duplicator : nullptr;
+
+  return export_graph[std::make_pair(parent_object, parent_duplicator)];
+}
+
+void AbstractHierarchyIterator::make_writers(const HierarchyContext *parent_context,
                                              AbstractHierarchyWriter *parent_writer)
 {
   AbstractHierarchyWriter *xform_writer = nullptr;
   float parent_matrix_inv_world[4][4];
 
-  if (parent_context.object == nullptr) {
-    unit_m4(parent_matrix_inv_world);
+  if (parent_context) {
+    invert_m4_m4(parent_matrix_inv_world, parent_context->matrix_world);
   }
   else {
-    invert_m4_m4(parent_matrix_inv_world, parent_context.matrix_world);
+    unit_m4(parent_matrix_inv_world);
   }
 
-  ExportGraph::mapped_type &graph_children =
-      export_graph[std::make_pair(parent_context.object, parent_context.duplicator)];
-  for (HierarchyContext context : graph_children) {
-    BLI_assert(!context.export_name.empty());
+  const std::string &parent_export_path = parent_context ? parent_context->export_path : "";
 
-    std::string export_path = path_concatenate(parent_context.export_path, context.export_name);
-    context.parent_writer = parent_writer;
-    context.export_path = export_path;
-    copy_m4_m4(context.parent_matrix_inv_world, parent_matrix_inv_world);
+  for (HierarchyContext *context : graph_children(parent_context)) {
+    std::string export_path = path_concatenate(parent_export_path, context->export_name);
+    context->parent_writer = parent_writer;
+    context->export_path = export_path;
+    copy_m4_m4(context->parent_matrix_inv_world, parent_matrix_inv_world);
 
     // printf("'%s' + '%s' = '%s' (exporting object %s)\n",
-    //        parent_context.export_path.c_str(),
-    //        context.export_name.c_str(),
+    //        parent_export_path.c_str(),
+    //        context->export_name.c_str(),
     //        export_path.c_str(),
-    //        context.object->id.name + 2);
+    //        contex

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list