Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSybren A. Stüvel <sybren@blender.org>2020-03-03 17:31:45 +0300
committerSybren A. Stüvel <sybren@blender.org>2020-03-03 17:34:58 +0300
commit4b2b5fe4b8d3b97a90691474111894e7ae7b506a (patch)
tree15405d717330634545bd1e02a9db49b8c24631aa /source/blender/usd
parent453be9cc8a5ec47d0255f0c0817f450c935ebad9 (diff)
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.
Diffstat (limited to 'source/blender/usd')
-rw-r--r--source/blender/usd/CMakeLists.txt2
-rw-r--r--source/blender/usd/intern/usd_exporter_context.h2
-rw-r--r--source/blender/usd/intern/usd_hierarchy_iterator.cc5
-rw-r--r--source/blender/usd/intern/usd_writer_metaball.cc81
-rw-r--r--source/blender/usd/intern/usd_writer_metaball.h42
5 files changed, 130 insertions, 2 deletions
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_writer_metaball.h b/source/blender/usd/intern/usd_writer_metaball.h
new file mode 100644
index 00000000000..1a86daae2ae
--- /dev/null
+++ b/source/blender/usd/intern/usd_writer_metaball.h
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+#ifndef __USD_WRITER_METABALL_H__
+#define __USD_WRITER_METABALL_H__
+
+#include "usd_writer_mesh.h"
+
+namespace USD {
+
+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;
+
+ private:
+ bool is_basis_ball(Scene *scene, Object *ob) const;
+};
+
+} // namespace USD
+
+#endif /* __USD_WRITER_METABALL_H__ */