Fix #122625: List of XForm ops needs to be stored at class level

The code review request to move the vector of xform ops from class to
function-local scope broke animation export. Moved xform ops vector back
into the class, and only create new xform ops on first xform write.

Co-authored-by: kiki <charles@skeletalstudios.com>
Pull Request: https://projects.blender.org/blender/blender/pulls/122665
This commit is contained in:
Charles Wardlaw
2024-06-03 19:56:17 +02:00
committed by Jesse Yurkovich
parent a0360be760
commit 5e6760d554
2 changed files with 33 additions and 30 deletions

View File

@@ -130,41 +130,41 @@ void USDTransformWriter::set_xform_ops(float xf_matrix[4][4], pxr::UsdGeomXforma
}
eUSDXformOpMode xfOpMode = usd_export_context_.export_params.xform_op_mode;
blender::Vector<pxr::UsdGeomXformOp> xformOps;
switch (xfOpMode) {
case USD_XFORM_OP_TRS:
xformOps.append(xf.AddTranslateOp());
xformOps.append(xf.AddRotateXYZOp());
xformOps.append(xf.AddScaleOp());
break;
case USD_XFORM_OP_TOS:
xformOps.append(xf.AddTranslateOp());
xformOps.append(xf.AddOrientOp());
xformOps.append(xf.AddScaleOp());
break;
case USD_XFORM_OP_MAT:
xformOps.append(xf.AddTransformOp());
break;
default:
CLOG_WARN(&LOG, "Unknown XformOp type");
xformOps.append(xf.AddTransformOp());
break;
if (xformOps_.size() == 0) {
switch (xfOpMode) {
case USD_XFORM_OP_TRS:
xformOps_.append(xf.AddTranslateOp());
xformOps_.append(xf.AddRotateXYZOp());
xformOps_.append(xf.AddScaleOp());
break;
case USD_XFORM_OP_TOS:
xformOps_.append(xf.AddTranslateOp());
xformOps_.append(xf.AddOrientOp());
xformOps_.append(xf.AddScaleOp());
break;
case USD_XFORM_OP_MAT:
xformOps_.append(xf.AddTransformOp());
break;
default:
CLOG_WARN(&LOG, "Unknown XformOp type");
xformOps_.append(xf.AddTransformOp());
break;
}
}
if (xformOps.is_empty()) {
if (xformOps_.is_empty()) {
/* Shouldn't happen. */
return;
}
pxr::UsdTimeCode time_code = get_export_time_code();
if (xformOps.size() == 1) {
if (xformOps_.size() == 1) {
pxr::GfMatrix4d mat_val(xf_matrix);
usd_value_writer_.SetAttribute(xformOps[0].GetAttr(), mat_val, time_code);
usd_value_writer_.SetAttribute(xformOps_[0].GetAttr(), mat_val, time_code);
}
else if (xformOps.size() == 3) {
else if (xformOps_.size() == 3) {
float loc[3];
float quat[4];
@@ -180,23 +180,23 @@ void USDTransformWriter::set_xform_ops(float xf_matrix[4][4], pxr::UsdGeomXforma
rot[2] *= 180.0 / M_PI;
pxr::GfVec3d loc_val(loc);
usd_value_writer_.SetAttribute(xformOps[0].GetAttr(), loc_val, time_code);
usd_value_writer_.SetAttribute(xformOps_[0].GetAttr(), loc_val, time_code);
pxr::GfVec3f rot_val(rot);
usd_value_writer_.SetAttribute(xformOps[1].GetAttr(), rot_val, time_code);
usd_value_writer_.SetAttribute(xformOps_[1].GetAttr(), rot_val, time_code);
pxr::GfVec3f scale_val(scale);
usd_value_writer_.SetAttribute(xformOps[2].GetAttr(), scale_val, time_code);
usd_value_writer_.SetAttribute(xformOps_[2].GetAttr(), scale_val, time_code);
}
else if (xfOpMode == USD_XFORM_OP_TOS) {
pxr::GfVec3d loc_val(loc);
usd_value_writer_.SetAttribute(xformOps[0].GetAttr(), loc_val, time_code);
usd_value_writer_.SetAttribute(xformOps_[0].GetAttr(), loc_val, time_code);
pxr::GfQuatf quat_val(quat[0], quat[1], quat[2], quat[3]);
usd_value_writer_.SetAttribute(xformOps[1].GetAttr(), quat_val, time_code);
usd_value_writer_.SetAttribute(xformOps_[1].GetAttr(), quat_val, time_code);
pxr::GfVec3f scale_val(scale);
usd_value_writer_.SetAttribute(xformOps[2].GetAttr(), scale_val, time_code);
usd_value_writer_.SetAttribute(xformOps_[2].GetAttr(), scale_val, time_code);
}
}
}

View File

@@ -10,6 +10,9 @@
namespace blender::io::usd {
class USDTransformWriter : public USDAbstractWriter {
private:
blender::Vector<pxr::UsdGeomXformOp> xformOps_;
public:
USDTransformWriter(const USDExporterContext &ctx);