Commit: 9a5b4be8d5da0cc0421f8c27b743d6eee24b0bca Author: Michael A. Kowalski Date: Wed Nov 11 22:19:47 2020 -0500 Branches: usd-importer-T81257 https://developer.blender.org/rB9a5b4be8d5da0cc0421f8c27b743d6eee24b0bca
WIP: new UsdCameraReader class. Also added logic to instantiate the camera reader when traversing the USD stage. Not all camera parameters are being set yet. =================================================================== M source/blender/io/usd/CMakeLists.txt M source/blender/io/usd/import/usd_prim_iterator.cc A source/blender/io/usd/import/usd_reader_camera.cc A source/blender/io/usd/import/usd_reader_camera.h M source/blender/io/usd/import/usd_reader_mesh.cc M source/blender/io/usd/import/usd_reader_mesh_base.cc M source/blender/io/usd/import/usd_reader_xform.h M source/blender/io/usd/import/usd_reader_xformable.h =================================================================== diff --git a/source/blender/io/usd/CMakeLists.txt b/source/blender/io/usd/CMakeLists.txt index f554c1aaf5e..c965a613bd0 100644 --- a/source/blender/io/usd/CMakeLists.txt +++ b/source/blender/io/usd/CMakeLists.txt @@ -56,6 +56,7 @@ set(SRC import/usd_import_util.cc import/usd_prim_iterator.cc + import/usd_reader_camera.cc import/usd_reader_mesh.cc import/usd_reader_mesh_base.cc import/usd_reader_prim.cc @@ -75,6 +76,7 @@ set(SRC import/usd_importer_context.h import/usd_import_util.h import/usd_prim_iterator.h + import/usd_reader_camera.h import/usd_reader_mesh.h import/usd_reader_mesh_base.h import/usd_reader_prim.h diff --git a/source/blender/io/usd/import/usd_prim_iterator.cc b/source/blender/io/usd/import/usd_prim_iterator.cc index 491103e6135..08daa651465 100644 --- a/source/blender/io/usd/import/usd_prim_iterator.cc +++ b/source/blender/io/usd/import/usd_prim_iterator.cc @@ -21,6 +21,7 @@ #include "usd.h" #include "usd_importer_context.h" +#include "usd_reader_camera.h" #include "usd_reader_mesh.h" #include "usd_reader_xform.h" #include "usd_reader_xformable.h" @@ -30,6 +31,7 @@ #include <pxr/usd/usd/prim.h> #include <pxr/usd/usd/primRange.h> #include <pxr/usd/usd/stage.h> +#include <pxr/usd/usdGeom/camera.h> #include <pxr/usd/usdGeom/mesh.h> #include <pxr/usd/usdGeom/scope.h> #include <pxr/usd/usdGeom/tokens.h> @@ -89,7 +91,10 @@ USDXformableReader *USDPrimIterator::get_object_reader(const pxr::UsdPrim &prim, { USDXformableReader *result = nullptr; - if (prim.IsA<pxr::UsdGeomMesh>()) { + if (prim.IsA<pxr::UsdGeomCamera>()) { + result = new USDCameraReader(prim, context); + } + else if (prim.IsA<pxr::UsdGeomMesh>()) { result = new USDMeshReader(prim, context); } else if (prim.IsA<pxr::UsdGeomXform>()) { @@ -130,15 +135,11 @@ void USDPrimIterator::create_object_readers(const pxr::UsdPrim &prim, return; } - /* If this is an Xform prim, see if we can merge with the child reader. - * We only merge if the child reader hasn't yet been merged - * and if it corresponds to a mesh prim. The list of child types that - * can be merged will be expanded as we support more reader types - * (e.g., for lights, curves, etc.). */ + /* If this is an Xform prim, see if we can merge with the child reader. */ if (prim.IsA<pxr::UsdGeomXform>() && child_readers.size() == 1 && !child_readers.front()->merged_with_parent() && - child_readers.front()->prim().IsA<pxr::UsdGeomMesh>()) { + child_readers.front()->can_merge_with_parent()) { child_readers.front()->set_merged_with_parent(true); /* Don't create a reader for the Xform but, instead, return the child * that we merged. */ diff --git a/source/blender/io/usd/import/usd_reader_camera.cc b/source/blender/io/usd/import/usd_reader_camera.cc new file mode 100644 index 00000000000..4f774bc69ad --- /dev/null +++ b/source/blender/io/usd/import/usd_reader_camera.cc @@ -0,0 +1,87 @@ +/* + * 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_reader_camera.h" + +#include "DNA_camera_types.h" +#include "DNA_object_types.h" + +#include "BKE_camera.h" +#include "BKE_object.h" + +#include <iostream> + +namespace blender::io::usd { + +USDCameraReader::USDCameraReader(const pxr::UsdPrim &prim, const USDImporterContext &context) + : USDXformableReader(prim, context), camera_(prim) +{ +} + +bool USDCameraReader::valid() const +{ + return static_cast<bool>(camera_); +} + +void USDCameraReader::create_object(Main *bmain, double time) +{ + if (!this->valid()) { + return; + } + + /* Determine prim visibility. + * TODO(makowalski): Consider optimizations to avoid this expensive call, + * for example, by determining visibility during stage traversal. */ + pxr::TfToken vis_tok = this->camera_.ComputeVisibility(); + + if (vis_tok == pxr::UsdGeomTokens->invisible) { + return; + } + + std::string obj_name = get_object_name(); + + if (obj_name.empty()) { + /* Sanity check. */ + std::cerr << "Warning: couldn't determine object name for " << this->prim_path() << std::endl; + } + + this->object_ = BKE_object_add_only_object(bmain, OB_CAMERA, obj_name.c_str()); + + std::string cam_name = get_data_name(); + + if (cam_name.empty()) { + /* Sanity check. */ + std::cerr << "Warning: couldn't determine camera name for " << this->prim_path() << std::endl; + } + + Camera *bcam = static_cast<Camera *>(BKE_camera_add(bmain, cam_name.c_str())); + + pxr::GfCamera usd_cam = camera_.GetCamera(time); + + bcam->lens = usd_cam.GetFocalLength(); + + pxr::GfRange1f usd_clip_range = usd_cam.GetClippingRange(); + + bcam->clip_start = usd_clip_range.GetMin(); + bcam->clip_end = usd_clip_range.GetMax(); + + this->object_->data = bcam; +} + +} // namespace blender::io::usd diff --git a/source/blender/io/usd/import/usd_reader_xform.h b/source/blender/io/usd/import/usd_reader_camera.h similarity index 79% copy from source/blender/io/usd/import/usd_reader_xform.h copy to source/blender/io/usd/import/usd_reader_camera.h index 893bd55d56f..194fd5909d3 100644 --- a/source/blender/io/usd/import/usd_reader_xform.h +++ b/source/blender/io/usd/import/usd_reader_camera.h @@ -20,18 +20,18 @@ #include "usd_reader_xformable.h" -#include <pxr/usd/usdGeom/xform.h> +#include <pxr/usd/usdGeom/camera.h> namespace blender::io::usd { -/* Wraps the UsdGeomXform schema. Creates a Blender Empty object. */ +/* Wraps the UsdGeomCamera schema. Creates a Blender Camera object. */ -class USDXformReader : public USDXformableReader { +class USDCameraReader : public USDXformableReader { - pxr::UsdGeomXform xform_; + pxr::UsdGeomCamera camera_; public: - USDXformReader(const pxr::UsdPrim &prim, const USDImporterContext &context); + USDCameraReader(const pxr::UsdPrim &prim, const USDImporterContext &context); bool valid() const override; diff --git a/source/blender/io/usd/import/usd_reader_mesh.cc b/source/blender/io/usd/import/usd_reader_mesh.cc index d2226158ae3..4f97a901c81 100644 --- a/source/blender/io/usd/import/usd_reader_mesh.cc +++ b/source/blender/io/usd/import/usd_reader_mesh.cc @@ -356,7 +356,7 @@ Mesh *USDMeshReader::create_mesh(Main *bmain, double time) return nullptr; } - std::string mesh_name = this->prim_name(); + std::string mesh_name = this->get_data_name(); if (mesh_name.empty()) { /* Sanity check. */ diff --git a/source/blender/io/usd/import/usd_reader_mesh_base.cc b/source/blender/io/usd/import/usd_reader_mesh_base.cc index 409b90096cd..954ffcfc8a5 100644 --- a/source/blender/io/usd/import/usd_reader_mesh_base.cc +++ b/source/blender/io/usd/import/usd_reader_mesh_base.cc @@ -68,7 +68,7 @@ void USDMeshReaderBase::create_object(Main *bmain, double time) return; } - std::string obj_name = merged_with_parent_ ? this->parent_prim_name() : this->prim_name(); + std::string obj_name = get_object_name(); if (obj_name.empty()) { /* Sanity check. */ diff --git a/source/blender/io/usd/import/usd_reader_xform.h b/source/blender/io/usd/import/usd_reader_xform.h index 893bd55d56f..4be0f2d1273 100644 --- a/source/blender/io/usd/import/usd_reader_xform.h +++ b/source/blender/io/usd/import/usd_reader_xform.h @@ -35,6 +35,11 @@ class USDXformReader : public USDXformableReader { bool valid() const override; + bool can_merge_with_parent() const override + { + return false; + } + void create_object(Main *bmain, double time) override; }; diff --git a/source/blender/io/usd/import/usd_reader_xformable.h b/source/blender/io/usd/import/usd_reader_xformable.h index 11ec5b022b8..8e8cecacc0e 100644 --- a/source/blender/io/usd/import/usd_reader_xformable.h +++ b/source/blender/io/usd/import/usd_reader_xformable.h @@ -70,10 +70,25 @@ class USDXformableReader : public USDPrimReader { return merged_with_parent_; } + std::string get_object_name() const + { + return merged_with_parent_ ? this->parent_prim_name() : this->prim_name(); + } + + std::string get_data_name() const + { + return this->prim_name(); + } + virtual bool valid() const = 0; virtual void create_object(Main *bmain, double time) = 0; + virtual bool can_merge_with_parent() const + { + return true; + } + void set_object_transform(const double time); void read_matrix(float r_mat[4][4], const double time, const float scale, bool &is_constant); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs