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:
authorMichael A. Kowalski <makowalski@nvidia.com>2020-11-14 01:48:54 +0300
committerMichael A. Kowalski <makowalski@nvidia.com>2020-11-14 01:48:54 +0300
commit46276c711033bc1c270ed36e296cc61a7166bd9d (patch)
treead017ce734183c76977c0a77bfba5980508b9c7f
parentb0ec5c72e626935ca562c1fa900d608bb59a08d4 (diff)
USDReaderCamera implementation.
Finished first pass of camera import. Added support for orthographic cameras. Adjusting camera rotation when converting from y-up to z-up. USDXformableReader::read_matrix() is now virtual.
-rw-r--r--source/blender/io/usd/import/usd_reader_camera.cc21
-rw-r--r--source/blender/io/usd/import/usd_reader_camera.h2
-rw-r--r--source/blender/io/usd/import/usd_reader_xformable.cc9
-rw-r--r--source/blender/io/usd/import/usd_reader_xformable.h2
4 files changed, 26 insertions, 8 deletions
diff --git a/source/blender/io/usd/import/usd_reader_camera.cc b/source/blender/io/usd/import/usd_reader_camera.cc
index 092021137e7..6ad2b55dcb0 100644
--- a/source/blender/io/usd/import/usd_reader_camera.cc
+++ b/source/blender/io/usd/import/usd_reader_camera.cc
@@ -25,6 +25,10 @@
#include "BKE_camera.h"
#include "BKE_object.h"
+#include "BLI_math_base.h"
+#include "BLI_math_matrix.h"
+#include "BLI_math_rotation.h"
+
#include <iostream>
namespace blender::io::usd {
@@ -84,6 +88,8 @@ void USDCameraReader::create_object(Main *bmain, double time)
const float v_film_offset = usd_cam.GetVerticalApertureOffset();
const float film_aspect = apperture_x / apperture_y;
+ bcam->type = usd_cam.GetProjection() == pxr::GfCamera::Perspective ? CAM_PERSP : CAM_ORTHO;
+
bcam->lens = usd_cam.GetFocalLength();
bcam->sensor_x = apperture_x;
@@ -102,4 +108,19 @@ void USDCameraReader::create_object(Main *bmain, double time)
this->object_->data = bcam;
}
+void USDCameraReader::read_matrix(float r_mat[4][4] /* local matrix */,
+ const double time,
+ const float scale) const
+{
+ USDXformableReader::read_matrix(r_mat, time, scale);
+
+ /* Conveting from y-up to z-up requires adjusting
+ * the camera rotation. */
+ if (this->context_.stage_up_axis == pxr::UsdGeomTokens->y) {
+ float camera_rotation[4][4];
+ axis_angle_to_mat4_single(camera_rotation, 'X', M_PI_2);
+ mul_m4_m4m4(r_mat, r_mat, camera_rotation);
+ }
+}
+
} // namespace blender::io::usd
diff --git a/source/blender/io/usd/import/usd_reader_camera.h b/source/blender/io/usd/import/usd_reader_camera.h
index 194fd5909d3..26614f86d28 100644
--- a/source/blender/io/usd/import/usd_reader_camera.h
+++ b/source/blender/io/usd/import/usd_reader_camera.h
@@ -36,6 +36,8 @@ class USDCameraReader : public USDXformableReader {
bool valid() const override;
void create_object(Main *bmain, double time) override;
+
+ void read_matrix(float r_mat[4][4], const double time, const float scale) const override;
};
} // namespace blender::io::usd
diff --git a/source/blender/io/usd/import/usd_reader_xformable.cc b/source/blender/io/usd/import/usd_reader_xformable.cc
index af5cb3558e3..f39abf802d4 100644
--- a/source/blender/io/usd/import/usd_reader_xformable.cc
+++ b/source/blender/io/usd/import/usd_reader_xformable.cc
@@ -57,10 +57,9 @@ void USDXformableReader::set_object_transform(const double time)
return;
}
- bool is_constant = false;
float transform_from_usd[4][4];
- this->read_matrix(transform_from_usd, time, this->context_.import_params.scale, is_constant);
+ this->read_matrix(transform_from_usd, time, this->context_.import_params.scale);
/* Apply the matrix to the object. */
BKE_object_apply_mat4(object_, transform_from_usd, true, false);
@@ -71,19 +70,15 @@ void USDXformableReader::set_object_transform(const double time)
void USDXformableReader::read_matrix(float r_mat[4][4] /* local matrix */,
const double time,
- const float scale,
- bool &is_constant)
+ const float scale) const
{
pxr::UsdGeomXformable xformable(prim_);
if (!xformable) {
unit_m4(r_mat);
- is_constant = true;
return;
}
- /* TODO(makowalski): Check for constant transform. */
-
pxr::GfMatrix4d usd_local_xf;
bool reset_xform_stack;
xformable.GetLocalTransformation(&usd_local_xf, &reset_xform_stack, time);
diff --git a/source/blender/io/usd/import/usd_reader_xformable.h b/source/blender/io/usd/import/usd_reader_xformable.h
index 8e8cecacc0e..3f3503dcfda 100644
--- a/source/blender/io/usd/import/usd_reader_xformable.h
+++ b/source/blender/io/usd/import/usd_reader_xformable.h
@@ -91,7 +91,7 @@ class USDXformableReader : public USDPrimReader {
void set_object_transform(const double time);
- void read_matrix(float r_mat[4][4], const double time, const float scale, bool &is_constant);
+ virtual void read_matrix(float r_mat[4][4], const double time, const float scale) const;
};
} /* namespace blender::io::usd */