17#include <pxr/usd/usdGeom/primvar.h>
18#include <pxr/usd/usdGeom/primvarsAPI.h>
44 if (read_pointcloud != pointcloud) {
65 pxr::VtVec3fArray usd_positions;
66 points_prim_.GetPointsAttr().Get(&usd_positions,
params.motion_sample_time);
68 if (pointcloud->
totpoint != usd_positions.size()) {
74 static_assert(
sizeof(pxr::GfVec3f) ==
sizeof(
float3));
78 pxr::VtFloatArray usd_widths;
79 points_prim_.GetWidthsAttr().Get(&usd_widths,
params.motion_sample_time);
81 if (!usd_widths.empty()) {
85 const pxr::TfToken widths_interp = points_prim_.GetWidthsInterpolation();
86 if (widths_interp == pxr::UsdGeomTokens->constant) {
87 radii.
fill(widths[0] / 2.0f);
90 for (
int i_point = 0; i_point < widths.
size(); i_point++) {
91 radii[i_point] = widths[i_point] / 2.0f;
108 pxr::VtVec3fArray velocities;
109 points_prim_.GetVelocitiesAttr().Get(&velocities, time);
111 if (!velocities.empty()) {
117 velocity.
span.copy_from(usd_data.cast<
float3>());
124 pxr::UsdGeomPrimvarsAPI pv_api(points_prim_);
126 std::vector<pxr::UsdGeomPrimvar> primvars = pv_api.GetPrimvarsWithValues();
127 for (
const pxr::UsdGeomPrimvar &pv : primvars) {
128 const pxr::SdfValueTypeName pv_type = pv.GetTypeName();
129 if (!pv_type.IsArray()) {
135 if (!type.has_value()) {
152 is_animated |= points_prim_.GetPointsAttr().ValueMightBeTimeVarying();
154 is_animated |= points_prim_.GetVelocitiesAttr().ValueMightBeTimeVarying();
156 is_animated |= points_prim_.GetWidthsAttr().ValueMightBeTimeVarying();
158 pxr::UsdGeomPrimvarsAPI pv_api(points_prim_);
159 std::vector<pxr::UsdGeomPrimvar> primvars = pv_api.GetPrimvarsWithValues();
160 for (
const pxr::UsdGeomPrimvar &pv : primvars) {
General operations, lookup, etc. for blender objects.
Object * BKE_object_add_only_object(Main *bmain, int type, const char *name) ATTR_RETURNS_NONNULL
General operations for point clouds.
PointCloud * BKE_pointcloud_add(Main *bmain, const char *name)
void BKE_pointcloud_nomain_to_pointcloud(PointCloud *pointcloud_src, PointCloud *pointcloud_dst)
PointCloud * BKE_pointcloud_new_nomain(int totpoint)
Object is a sort of wrapper for general info.
constexpr void fill(const T &value) const
constexpr void copy_from(Span< T > values) const
Span< NewT > constexpr cast() const
constexpr int64_t size() const
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, AttrType data_type)
void add_cache_modifier()
void read_velocities(PointCloud *pointcloud, const pxr::UsdTimeCode time) const
void create_object(Main *bmain) override
void read_geometry(bke::GeometrySet &geometry_set, USDMeshReadParams params, const char **r_err_str) override
void read_custom_data(PointCloud *pointcloud, const pxr::UsdTimeCode time) const
void read_object_data(Main *bmain, pxr::UsdTimeCode time) override
const USDImportParams & import_params_
USDMeshReadParams create_mesh_read_params(const double motion_sample_time, const int read_flags)
void copy_primvar_to_blender_attribute(const pxr::UsdGeomPrimvar &primvar, const pxr::UsdTimeCode time, const bke::AttrType data_type, const bke::AttrDomain domain, const OffsetIndices< int > face_indices, bke::MutableAttributeAccessor attributes)
std::optional< bke::AttrType > convert_usd_type_to_blender(const pxr::SdfValueTypeName usd_type)
VecBase< float, 3 > float3
GeometryComponent & get_component_for_write(GeometryComponent::Type component_type)
PointCloud * get_pointcloud_for_write()
void replace_pointcloud(PointCloud *pointcloud, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static GeometrySet from_pointcloud(PointCloud *pointcloud, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
MutableVArraySpan< T > span