[Bf-blender-cvs] [4b2b5fe4b8d] master: USD: Added support for exporting metaballs

Sybren A. Stüvel noreply at git.blender.org
Tue Mar 3 15:36:20 CET 2020


Commit: 4b2b5fe4b8d3b97a90691474111894e7ae7b506a
Author: Sybren A. Stüvel
Date:   Tue Mar 3 15:31:45 2020 +0100
Branches: master
https://developer.blender.org/rB4b2b5fe4b8d3b97a90691474111894e7ae7b506a

USD: Added support for exporting metaballs

Metaballs are exported as evaluated polygonal mesh.

USDExporterContext::depsgraph was made non-const to allow calling
`BKE_mesh_new_from_object()`. The alternative was to make the depsgraph
parameter of that function const, but that would be too intrusive as
that would require even more functions to accept a const depsgraph
pointer.

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

M	source/blender/usd/CMakeLists.txt
M	source/blender/usd/intern/usd_exporter_context.h
M	source/blender/usd/intern/usd_hierarchy_iterator.cc
A	source/blender/usd/intern/usd_writer_metaball.cc
A	source/blender/usd/intern/usd_writer_metaball.h

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

diff --git a/source/blender/usd/CMakeLists.txt b/source/blender/usd/CMakeLists.txt
index 0bcc0e6069e..adaf05cd716 100644
--- a/source/blender/usd/CMakeLists.txt
+++ b/source/blender/usd/CMakeLists.txt
@@ -60,6 +60,7 @@ set(SRC
   intern/usd_writer_hair.cc
   intern/usd_writer_light.cc
   intern/usd_writer_mesh.cc
+  intern/usd_writer_metaball.cc
   intern/usd_writer_transform.cc
 
   usd.h
@@ -71,6 +72,7 @@ set(SRC
   intern/usd_writer_hair.h
   intern/usd_writer_light.h
   intern/usd_writer_mesh.h
+  intern/usd_writer_metaball.h
   intern/usd_writer_transform.h
 )
 
diff --git a/source/blender/usd/intern/usd_exporter_context.h b/source/blender/usd/intern/usd_exporter_context.h
index 35ff13b2e91..4ae415b3d34 100644
--- a/source/blender/usd/intern/usd_exporter_context.h
+++ b/source/blender/usd/intern/usd_exporter_context.h
@@ -32,7 +32,7 @@ namespace USD {
 class USDHierarchyIterator;
 
 struct USDExporterContext {
-  const Depsgraph *depsgraph;
+  Depsgraph *depsgraph;
   const pxr::UsdStageRefPtr stage;
   const pxr::SdfPath usd_path;
   const USDHierarchyIterator *hierarchy_iterator;
diff --git a/source/blender/usd/intern/usd_hierarchy_iterator.cc b/source/blender/usd/intern/usd_hierarchy_iterator.cc
index d56de8cff13..fd888f39adc 100644
--- a/source/blender/usd/intern/usd_hierarchy_iterator.cc
+++ b/source/blender/usd/intern/usd_hierarchy_iterator.cc
@@ -24,6 +24,7 @@
 #include "usd_writer_hair.h"
 #include "usd_writer_light.h"
 #include "usd_writer_mesh.h"
+#include "usd_writer_metaball.h"
 #include "usd_writer_transform.h"
 
 #include <string>
@@ -106,12 +107,14 @@ AbstractHierarchyWriter *USDHierarchyIterator::create_data_writer(const Hierarch
     case OB_LAMP:
       data_writer = new USDLightWriter(usd_export_context);
       break;
+    case OB_MBALL:
+      data_writer = new USDMetaballWriter(usd_export_context);
+      break;
 
     case OB_EMPTY:
     case OB_CURVE:
     case OB_SURF:
     case OB_FONT:
-    case OB_MBALL:
     case OB_SPEAKER:
     case OB_LIGHTPROBE:
     case OB_LATTICE:
diff --git a/source/blender/usd/intern/usd_writer_metaball.cc b/source/blender/usd/intern/usd_writer_metaball.cc
new file mode 100644
index 00000000000..25b216d20f3
--- /dev/null
+++ b/source/blender/usd/intern/usd_writer_metaball.cc
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ *
+ * The Original Code is Copyright (C) 2020 Blender Foundation.
+ * All rights reserved.
+ */
+#include "usd_writer_metaball.h"
+#include "usd_hierarchy_iterator.h"
+
+#include <pxr/usd/usdGeom/mesh.h>
+#include <pxr/usd/usdShade/material.h>
+#include <pxr/usd/usdShade/materialBindingAPI.h>
+
+extern "C" {
+#include "BLI_assert.h"
+
+#include "BKE_displist.h"
+#include "BKE_lib_id.h"
+#include "BKE_mball.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meta_types.h"
+}
+
+namespace USD {
+
+USDMetaballWriter::USDMetaballWriter(const USDExporterContext &ctx) : USDGenericMeshWriter(ctx)
+{
+}
+
+bool USDMetaballWriter::is_supported(const HierarchyContext *context) const
+{
+  Scene *scene = DEG_get_input_scene(usd_export_context_.depsgraph);
+  return is_basis_ball(scene, context->object) && USDGenericMeshWriter::is_supported(context);
+}
+
+bool USDMetaballWriter::check_is_animated(const HierarchyContext & /*context*/) const
+{
+  /* We assume that metaballs are always animated, as the current object may
+   * not be animated but another ball in the same group may be. */
+  return true;
+}
+
+Mesh *USDMetaballWriter::get_export_mesh(Object *object_eval, bool &r_needsfree)
+{
+  Mesh *mesh_eval = BKE_object_get_evaluated_mesh(object_eval);
+  if (mesh_eval != nullptr) {
+    /* Mesh_eval only exists when generative modifiers are in use. */
+    r_needsfree = false;
+    return mesh_eval;
+  }
+  r_needsfree = true;
+  return BKE_mesh_new_from_object(usd_export_context_.depsgraph, object_eval, false);
+}
+
+void USDMetaballWriter::free_export_mesh(Mesh *mesh)
+{
+  BKE_id_free(nullptr, mesh);
+}
+
+bool USDMetaballWriter::is_basis_ball(Scene *scene, Object *ob) const
+{
+  Object *basis_ob = BKE_mball_basis_find(scene, ob);
+  return ob == basis_ob;
+}
+
+}  // namespace USD
diff --git a/source/blender/usd/intern/usd_exporter_context.h b/source/blender/usd/intern/usd_writer_metaball.h
similarity index 53%
copy from source/blender/usd/intern/usd_exporter_context.h
copy to source/blender/usd/intern/usd_writer_metaball.h
index 35ff13b2e91..1a86daae2ae 100644
--- a/source/blender/usd/intern/usd_exporter_context.h
+++ b/source/blender/usd/intern/usd_writer_metaball.h
@@ -13,32 +13,30 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
- * The Original Code is Copyright (C) 2019 Blender Foundation.
+ * The Original Code is Copyright (C) 2020 Blender Foundation.
  * All rights reserved.
  */
-#ifndef __USD_EXPORTER_CONTEXT_H__
-#define __USD_EXPORTER_CONTEXT_H__
+#ifndef __USD_WRITER_METABALL_H__
+#define __USD_WRITER_METABALL_H__
 
-#include "usd.h"
-
-#include <pxr/usd/sdf/path.h>
-#include <pxr/usd/usd/common.h>
-
-struct Depsgraph;
-struct Object;
+#include "usd_writer_mesh.h"
 
 namespace USD {
 
-class USDHierarchyIterator;
+class USDMetaballWriter : public USDGenericMeshWriter {
+ public:
+  USDMetaballWriter(const USDExporterContext &ctx);
+
+ protected:
+  virtual Mesh *get_export_mesh(Object *object_eval, bool &r_needsfree) override;
+  virtual void free_export_mesh(Mesh *mesh) override;
+  virtual bool is_supported(const HierarchyContext *context) const override;
+  virtual bool check_is_animated(const HierarchyContext &context) const override;
 
-struct USDExporterContext {
-  const Depsgraph *depsgraph;
-  const pxr::UsdStageRefPtr stage;
-  const pxr::SdfPath usd_path;
-  const USDHierarchyIterator *hierarchy_iterator;
-  const USDExportParams &export_params;
+ private:
+  bool is_basis_ball(Scene *scene, Object *ob) const;
 };
 
 }  // namespace USD
 
-#endif /* __USD_EXPORTER_CONTEXT_H__ */
+#endif /* __USD_WRITER_METABALL_H__ */



More information about the Bf-blender-cvs mailing list