22#include <pxr/base/vt/types.h>
24#include <pxr/usd/usdGeom/curves.h>
26static bool set_knots(
const pxr::VtDoubleArray &knots,
float *&nu_knots)
33 const size_t num_knots = knots.size();
36 for (
size_t i = 0;
i < num_knots;
i++) {
37 nu_knots[
i] = float(knots[
i]);
62 if (
curve_prim_.GetPointsAttr().ValueMightBeTimeVarying()) {
71 pxr::UsdAttribute widthsAttr =
curve_prim_.GetWidthsAttr();
72 pxr::UsdAttribute vertexAttr =
curve_prim_.GetCurveVertexCountsAttr();
73 pxr::UsdAttribute pointsAttr =
curve_prim_.GetPointsAttr();
75 pxr::VtIntArray usdCounts;
76 vertexAttr.Get(&usdCounts, motionSampleTime);
78 pxr::VtVec3fArray usdPoints;
79 pointsAttr.Get(&usdPoints, motionSampleTime);
81 pxr::VtFloatArray usdWidths;
82 widthsAttr.Get(&usdWidths, motionSampleTime);
84 pxr::VtIntArray orders;
85 curve_prim_.GetOrderAttr().Get(&orders, motionSampleTime);
87 pxr::VtDoubleArray knots;
88 curve_prim_.GetKnotsAttr().Get(&knots, motionSampleTime);
90 pxr::VtVec3fArray usdNormals;
91 curve_prim_.GetNormalsAttr().Get(&usdNormals, motionSampleTime);
95 if (!usdNormals.empty()) {
105 for (
size_t i = 0;
i < usdCounts.size();
i++) {
106 const int num_verts = usdCounts[
i];
115 nu->
pntsu = num_verts;
118 if (
i < orders.size()) {
128 if (knots.size() > 3) {
129 if ((knots[0] == knots[1]) && (knots[knots.size()] == knots[knots.size() - 1])) {
143 for (
int j = 0; j < nu->
pntsu; j++, bp++, idx++) {
144 bp->
vec[0] = usdPoints[idx][0];
145 bp->
vec[1] = usdPoints[idx][1];
146 bp->
vec[2] = usdPoints[idx][2];
152 if (idx < usdWidths.size()) {
153 radius = usdWidths[idx] / 2.0f;
169 const char **r_err_str)
172 Mesh *new_mesh = read_mesh(
nullptr,
params, r_err_str);
176Mesh *USDNurbsReader::read_mesh(
Mesh * ,
180 pxr::UsdGeomCurves curve_prim(
prim_);
182 pxr::UsdAttribute widthsAttr = curve_prim.GetWidthsAttr();
183 pxr::UsdAttribute vertexAttr = curve_prim.GetCurveVertexCountsAttr();
184 pxr::UsdAttribute pointsAttr = curve_prim.GetPointsAttr();
186 pxr::VtIntArray usdCounts;
188 vertexAttr.Get(&usdCounts,
params.motion_sample_time);
189 int num_subcurves = usdCounts.size();
191 pxr::VtVec3fArray usdPoints;
192 pointsAttr.Get(&usdPoints,
params.motion_sample_time);
199 bool same_topology = curve_count == num_subcurves;
203 for (curve_idx = 0; nurbs; nurbs = nurbs->
next, curve_idx++) {
204 const int num_in_usd = usdCounts[curve_idx];
205 const int num_in_blender = nurbs->
pntsu;
207 if (num_in_usd != num_in_blender) {
208 same_topology =
false;
214 if (!same_topology) {
220 for (curve_idx = 0; nurbs; nurbs = nurbs->
next, curve_idx++) {
221 const int totpoint = usdCounts[curve_idx];
226 for (
int i = 0;
i < totpoint;
i++, point++, vertex_idx++) {
227 point->vec[0] = usdPoints[vertex_idx][0];
228 point->vec[1] = usdPoints[vertex_idx][1];
229 point->vec[2] = usdPoints[vertex_idx][2];
232 else if (nurbs->
bezt) {
235 for (
int i = 0;
i < totpoint;
i++, bezier++, vertex_idx++) {
236 bezier->vec[1][0] = usdPoints[vertex_idx][0];
237 bezier->vec[1][1] = usdPoints[vertex_idx][1];
238 bezier->vec[1][2] = usdPoints[vertex_idx][2];
ListBase * BKE_curve_nurbs_get(Curve *cu)
void BKE_nurb_knot_calc_u(Nurb *nu)
void BKE_nurbList_free(ListBase *lb)
Curve * BKE_curve_add(Main *bmain, const char *name, int type)
Mesh * BKE_mesh_new_nomain_from_curve(const Object *ob)
General operations, lookup, etc. for blender objects.
Object * BKE_object_add_only_object(Main *bmain, int type, const char *name) ATTR_RETURNS_NONNULL
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
struct BezTriple BezTriple
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
void add_cache_modifier()
void read_geometry(bke::GeometrySet &geometry_set, USDMeshReadParams params, const char **r_err_str) override
void read_object_data(Main *bmain, double motionSampleTime) override
pxr::UsdGeomNurbsCurves curve_prim_
void read_curve_sample(Curve *cu, double motionSampleTime)
void create_object(Main *bmain) override
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void replace_mesh(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static bool set_knots(const pxr::VtDoubleArray &knots, float *&nu_knots)