7#include <pxr/base/gf/matrix4d.h>
8#include <pxr/base/gf/matrix4f.h>
9#include <pxr/usd/usdGeom/xform.h>
27 pxr::UsdGeomXform xform;
33 if (existing_prim.IsValid() && existing_prim.IsA<pxr::UsdGeomXform>()) {
34 xform = pxr::UsdGeomXform(existing_prim);
40 return pxr::UsdGeomXformable(xform.GetPrim());
55 if (context.export_parent !=
nullptr) {
64 if (context.is_point_proto || context.is_point_instance) {
68 constexpr float UNIT_M4[4][4] = {
78 CLOG_ERROR(&
LOG,
"USDTransformWriter: couldn't create xformable");
82 float parent_relative_matrix[4][4];
85 float matrix_world[4][4];
86 copy_m4_m4(matrix_world, context.matrix_world);
98 mul_m4_m4m4(matrix_world, mat, context.matrix_world);
104 float scale_mat[4][4];
106 mul_m4_m4m4(matrix_world, scale_mat, matrix_world);
109 mul_m4_m4m4(parent_relative_matrix, context.parent_matrix_inv_world, matrix_world);
112 mul_m4_m4m4(parent_relative_matrix, context.parent_matrix_inv_world, context.matrix_world);
124 if (context.object) {
125 auto prim = xform.GetPrim();
132 if (context.duplicator !=
nullptr) {
145 const pxr::UsdGeomXformable &xf)
156 xformOps_.
append(xf.AddTranslateOp());
157 xformOps_.
append(xf.AddRotateXYZOp());
158 xformOps_.
append(xf.AddScaleOp());
161 xformOps_.
append(xf.AddTranslateOp());
162 xformOps_.
append(xf.AddOrientOp());
163 xformOps_.
append(xf.AddScaleOp());
166 xformOps_.
append(xf.AddTransformOp());
170 xformOps_.
append(xf.AddTransformOp());
182 if (xformOps_.
size() == 1) {
183 pxr::GfMatrix4d mat_val(parent_relative_matrix);
186 else if (xformOps_.
size() == 3) {
201 pxr::GfVec3d loc_val(loc);
204 pxr::GfVec3f rot_val(
rot);
207 pxr::GfVec3f scale_val(scale);
211 pxr::GfVec3d loc_val(loc);
214 pxr::GfQuatf quat_val(quat[0], quat[1], quat[2], quat[3]);
217 pxr::GfVec3f scale_val(scale);
General operations, lookup, etc. for blender objects.
bool BKE_object_moves_in_time(const Object *object, bool recurse_parent)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mat4_decompose(float loc[3], float quat[4], float size[3], const float wmat[4][4])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
void scale_m4_fl(float R[4][4], float scale)
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void transpose_m3(float R[3][3])
bool compare_m4m4(const float mat1[4][4], const float mat2[4][4], float limit)
void quat_to_eul(float eul[3], const float quat[4])
bool mat3_from_axis_conversion(int src_forward, int src_up, int dst_forward, int dst_up, float r_mat[3][3])
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
void append(const T &value)
static bool check_has_physics(const HierarchyContext &context)
virtual bool mark_as_instance(const HierarchyContext &context, const pxr::UsdPrim &prim)
pxr::UsdTimeCode get_export_time_code() const
pxr::UsdUtilsSparseValueWriter usd_value_writer_
void write_id_properties(const pxr::UsdPrim &prim, const ID &id, pxr::UsdTimeCode=pxr::UsdTimeCode::Default()) const
const USDExporterContext usd_export_context_
double get_meters_per_unit(const USDExportParams ¶ms)
char root_prim_path[1024]
eUSDXformOpMode xform_op_mode
enum eIOAxis forward_axis
eUSDSceneUnits convert_scene_units
const USDExportParams & export_params
const pxr::SdfPath usd_path
const pxr::UsdStageRefPtr stage