17#include <pxr/usd/usdGeom/primvar.h>
18#include <pxr/usd/usdGeom/primvarsAPI.h>
25 :
USDGeomReader(prim, import_params, settings), points_prim_(prim)
31 return bool(points_prim_);
61 if (read_point_cloud != point_cloud) {
87 pxr::VtVec3fArray usd_positions;
88 points_prim_.GetPointsAttr().Get(&usd_positions,
params.motion_sample_time);
90 if (point_cloud->
totpoint != usd_positions.size()) {
96 static_assert(
sizeof(pxr::GfVec3f) ==
sizeof(
float3));
98 positions.copy_from(
Span(usd_positions.data(), usd_positions.size()).cast<float3>());
100 pxr::VtFloatArray usd_widths;
101 points_prim_.GetWidthsAttr().Get(&usd_widths,
params.motion_sample_time);
103 if (!usd_widths.empty()) {
108 const pxr::TfToken widths_interp = points_prim_.GetWidthsInterpolation();
109 if (widths_interp == pxr::UsdGeomTokens->constant) {
110 radii.span.fill(usd_widths[0] / 2.0f);
113 for (
int i_point = 0; i_point < usd_widths.size(); i_point++) {
114 radii.span[i_point] = usd_widths[i_point] / 2.0f;
133 pxr::VtVec3fArray velocities;
134 points_prim_.GetVelocitiesAttr().Get(&velocities, motionSampleTime);
136 if (!velocities.empty()) {
142 velocity.
span.copy_from(usd_data.cast<
float3>());
148 const double motionSampleTime)
const
150 pxr::UsdGeomPrimvarsAPI pv_api(points_prim_);
152 std::vector<pxr::UsdGeomPrimvar> primvars = pv_api.GetPrimvarsWithValues();
153 for (
const pxr::UsdGeomPrimvar &pv : primvars) {
154 if (!pv.HasValue()) {
158 const pxr::SdfValueTypeName pv_type = pv.GetTypeName();
163 if (!type.has_value()) {
180 is_animated |= points_prim_.GetPointsAttr().ValueMightBeTimeVarying();
182 is_animated |= points_prim_.GetVelocitiesAttr().ValueMightBeTimeVarying();
184 is_animated |= points_prim_.GetWidthsAttr().ValueMightBeTimeVarying();
186 pxr::UsdGeomPrimvarsAPI pv_api(points_prim_);
187 std::vector<pxr::UsdGeomPrimvar> primvars = pv_api.GetPrimvarsWithValues();
188 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.
void BKE_pointcloud_nomain_to_pointcloud(PointCloud *pointcloud_src, PointCloud *pointcloud_dst)
void * BKE_pointcloud_add(Main *bmain, const char *name)
PointCloud * BKE_pointcloud_new_nomain(int totpoint)
Object is a sort of wrapper for general info.
void add_cache_modifier()
void read_object_data(Main *bmain, double motionSampleTime) override
bool valid() const override
void create_object(Main *bmain, double motionSampleTime) override
void read_geometry(bke::GeometrySet &geometry_set, USDMeshReadParams params, const char **r_err_str) override
void read_custom_data(PointCloud *point_cloud, const double motionSampleTime) const
USDPointsReader(const pxr::UsdPrim &prim, const USDImportParams &import_params, const ImportSettings &settings)
void read_velocities(PointCloud *point_cloud, const double motionSampleTime) const
const USDImportParams & import_params_
USDMeshReadParams create_mesh_read_params(const double motion_sample_time, const int read_flags)
std::optional< eCustomDataType > convert_usd_type_to_blender(const pxr::SdfValueTypeName usd_type)
void copy_primvar_to_blender_attribute(const pxr::UsdGeomPrimvar &primvar, const pxr::UsdTimeCode timecode, const eCustomDataType data_type, const bke::AttrDomain domain, const OffsetIndices< int > face_indices, bke::MutableAttributeAccessor attributes)
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