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:
committed by
Jesse Yurkovich
parent
a0360be760
commit
5e6760d554
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
namespace blender::io::usd {
|
||||
|
||||
class USDTransformWriter : public USDAbstractWriter {
|
||||
private:
|
||||
blender::Vector<pxr::UsdGeomXformOp> xformOps_;
|
||||
|
||||
public:
|
||||
USDTransformWriter(const USDExporterContext &ctx);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user