Files
test2/source/blender/io/usd/intern/usd_reader_xform.h
Michael Kowalski 6f4cb9bc56 USD: Skeleton and blend shape import
Added support for UsdSkel animation import.

This addresses #110076.

Added USDSkeletonReader class which imports UsdSkelSkeleton primitives
as armatures.

Extended USDMeshReader to import UsdSkelBlendShape as shape keys.

Extended USDMeshReader to import USD skinning data as as deform groups
and an armature modifier on the mesh object.

Added USDMeshReader::get_local_usd_xform() to override the transform
computation to account for the binding transformation for skinned meshes.

Pull Request: https://projects.blender.org/blender/blender/pulls/110912
2023-08-17 20:11:51 +02:00

72 lines
2.0 KiB
C++

/* SPDX-FileCopyrightText: 2021 Tangent Animation. All rights reserved.
* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* Adapted from the Blender Alembic importer implementation. */
#pragma once
#include "usd.h"
#include "usd_reader_prim.h"
namespace blender::io::usd {
/** A transformation matrix and a boolean indicating
* whether the matrix is constant over time. */
using XformResult = std::tuple<pxr::GfMatrix4f, bool>;
class USDXformReader : public USDPrimReader {
private:
bool use_parent_xform_;
/* Indicates if the created object is the root of a
* transform hierarchy. */
bool is_root_xform_;
public:
USDXformReader(const pxr::UsdPrim &prim,
const USDImportParams &import_params,
const ImportSettings &settings)
: USDPrimReader(prim, import_params, settings),
use_parent_xform_(false),
is_root_xform_(is_root_xform_prim())
{
}
void create_object(Main *bmain, double motionSampleTime) override;
void read_object_data(Main *bmain, double motionSampleTime) override;
void read_matrix(float r_mat[4][4], float time, float scale, bool *r_is_constant);
bool use_parent_xform() const
{
return use_parent_xform_;
}
void set_use_parent_xform(bool flag)
{
use_parent_xform_ = flag;
is_root_xform_ = is_root_xform_prim();
}
bool prim_has_xform_ops() const;
protected:
/* Returns true if the contained USD prim is the root of a transform hierarchy. */
bool is_root_xform_prim() const;
/**
* Return the USD prim's local transformation.
*
* \param time: Time code for evaluating the transform.
*
* \return: Optional tuple with the following elements:
* - The transform matrix.
* - A boolean flag indicating whether the matrix
* is constant over time.
*/
virtual std::optional<XformResult> get_local_usd_xform(float time) const;
};
} // namespace blender::io::usd