[Bf-blender-cvs] [42bf732dccb] usd-importer-T81257-merge: USD Import: Convert to Z Up option.

makowalski noreply at git.blender.org
Sun Mar 7 21:17:52 CET 2021


Commit: 42bf732dccbd62ba50e04ebf2695b7f6932c58c8
Author: makowalski
Date:   Sun Mar 7 15:08:11 2021 -0500
Branches: usd-importer-T81257-merge
https://developer.blender.org/rB42bf732dccbd62ba50e04ebf2695b7f6932c58c8

USD Import: Convert to Z Up option.

Added a Convert to Z Up import option and logic to rotate
imported root objects 90 degrees about the X-axis if this
option is checked and the USD stage up-axis is Y.

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

M	source/blender/editors/io/io_usd.c
M	source/blender/io/usd/intern/usd_capi.cc
M	source/blender/io/usd/intern/usd_reader_xform.cc
M	source/blender/io/usd/usd.h

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

diff --git a/source/blender/editors/io/io_usd.c b/source/blender/editors/io/io_usd.c
index d5f379c8381..c9ec4e2016b 100644
--- a/source/blender/editors/io/io_usd.c
+++ b/source/blender/editors/io/io_usd.c
@@ -316,6 +316,8 @@ static int wm_usd_import_exec(bContext *C, wmOperator *op)
   const bool import_usd_preview = RNA_boolean_get(op->ptr, "import_usd_preview");
   const bool set_material_blend = RNA_boolean_get(op->ptr, "set_material_blend");
 
+  const bool convert_to_z_up = RNA_boolean_get(op->ptr, "convert_to_z_up");
+
   int offset = 0;
   int sequence_len = 1;
 
@@ -360,6 +362,7 @@ static int wm_usd_import_exec(bContext *C, wmOperator *op)
       use_instancing,
       import_usd_preview,
       set_material_blend,
+      convert_to_z_up,
   };
 
   bool ok = USD_import(C, filename, &params, as_background_job);
@@ -420,6 +423,9 @@ static void wm_usd_import_draw(bContext *UNUSED(C), wmOperator *op)
   row = uiLayoutRow(box, false);
   uiItemR(row, ptr, "create_collection", 0, NULL, ICON_NONE);
 
+  row = uiLayoutRow(box, false);
+  uiItemR(row, ptr, "convert_to_z_up", 0, NULL, ICON_NONE);
+
   // row = uiLayoutRow(box, false);
   // uiItemR(row, ptr, "prim_path_mask", 0, NULL, ICON_NONE);
 
@@ -615,6 +621,13 @@ void WM_OT_usd_import(struct wmOperatorType *ot)
                   "When checked and if the Import Usd Preview option is enabled, "
                   "the material blend method will automatically be set based on the "
                   "shader's opacity and opacityThreshold inputs");
+
+  RNA_def_boolean(ot->srna,
+    "convert_to_z_up",
+    false,
+    "Convert to Z Up",
+    "When checked and if the USD stage up-axis is Y, apply a rotation "
+    "to the imported objects to convert their orientation to Z up ");
 }
 
 #endif /* WITH_USD */
diff --git a/source/blender/io/usd/intern/usd_capi.cc b/source/blender/io/usd/intern/usd_capi.cc
index 7f8775c570b..702104bb2ea 100644
--- a/source/blender/io/usd/intern/usd_capi.cc
+++ b/source/blender/io/usd/intern/usd_capi.cc
@@ -65,6 +65,7 @@
 #include "BLI_fileops.h"
 #include "BLI_listbase.h"
 #include "BLI_math_matrix.h"
+#include "BLI_math_rotation.h"
 #include "BLI_path_util.h"
 #include "BLI_string.h"
 
@@ -238,6 +239,26 @@ static void create_proto_collections(Main *bmain,
   }
 }
 
+// Update the given import settings with the global rotation matrix to orient
+// imported objects with Z-up, if necessary
+static void set_global_rotation(pxr::UsdStageRefPtr stage, ImportSettings &r_settings)
+{
+  if (!stage || pxr::UsdGeomGetStageUpAxis(stage) == pxr::UsdGeomTokens->z) {
+    // Nothing to do.
+    return;
+  }
+
+  r_settings.do_convert_mat = true;
+
+  // Rotate 90 degrees about the X-axis.
+  float rmat[3][3];
+  float axis[3] = { 1.0f, 0.0f, 0.0f };
+  axis_angle_normalized_to_mat3(rmat, axis, M_PI/2.0f);
+
+  unit_m4(r_settings.conversion_mat);
+  copy_m4_m3(r_settings.conversion_mat, rmat);
+}
+
 /* ********************** Export file ********************** */
 
 struct ExportJobData {
@@ -550,6 +571,10 @@ static void import_startjob(void *customdata, short *stop, short *do_update, flo
     return;
   }
 
+  if (data->params.convert_to_z_up) {
+    set_global_rotation(archive->stage(), data->settings);
+  }
+
   // Set up the stage for animated data.
   if (data->params.set_frame_range) {
     // archive->stage()->SetTimeCodesPerSecond(FPS);
diff --git a/source/blender/io/usd/intern/usd_reader_xform.cc b/source/blender/io/usd/intern/usd_reader_xform.cc
index 9a7f5c73503..d167cf1a052 100644
--- a/source/blender/io/usd/intern/usd_reader_xform.cc
+++ b/source/blender/io/usd/intern/usd_reader_xform.cc
@@ -122,11 +122,19 @@ void USDXformReader::read_matrix(float r_mat[4][4] /* local matrix */,
     mul_m4_m4m4(r_mat, r_mat, t_mat);
   }
 
-  /* Apply scaling only to root objects, parenting will propagate it. */
-  if (scale != 1.0 && is_root_xform_object()) {
-    float scale_mat[4][4];
-    scale_m4_fl(scale_mat, scale);
-    mul_m4_m4m4(r_mat, scale_mat, r_mat);
+  /* Apply global scaling and rotation only to root objects, parenting
+   * will propagate it. */
+  if ((scale != 1.0 || m_settings->do_convert_mat) && is_root_xform_object()) {
+
+    if (scale != 1.0f) {
+      float scale_mat[4][4];
+      scale_m4_fl(scale_mat, scale);
+      mul_m4_m4m4(r_mat, scale_mat, r_mat);
+    }
+
+    if (m_settings->do_convert_mat) {
+      mul_m4_m4m4(r_mat, m_settings->conversion_mat, r_mat);
+    }
   }
 }
 
diff --git a/source/blender/io/usd/usd.h b/source/blender/io/usd/usd.h
index 533749c6a8e..3e41f9653cd 100644
--- a/source/blender/io/usd/usd.h
+++ b/source/blender/io/usd/usd.h
@@ -70,6 +70,7 @@ struct USDImportParams {
   bool use_instancing;
   bool import_usd_preview;
   bool set_material_blend;
+  bool convert_to_z_up;
 };
 
 /* The USD_export takes a as_background_job parameter, and returns a boolean.



More information about the Bf-blender-cvs mailing list