18 #include <pxr/base/vt/array.h>
19 #include <pxr/base/vt/types.h>
20 #include <pxr/base/vt/value.h>
22 #include <pxr/usd/usdGeom/basisCurves.h>
23 #include <pxr/usd/usdGeom/curves.h>
44 if (
curve_prim_.GetPointsAttr().ValueMightBeTimeVarying()) {
59 pxr::UsdAttribute widthsAttr =
curve_prim_.GetWidthsAttr();
60 pxr::UsdAttribute vertexAttr =
curve_prim_.GetCurveVertexCountsAttr();
61 pxr::UsdAttribute pointsAttr =
curve_prim_.GetPointsAttr();
63 pxr::VtIntArray usdCounts;
65 vertexAttr.Get(&usdCounts, motionSampleTime);
66 int num_subcurves = usdCounts.size();
68 pxr::VtVec3fArray usdPoints;
69 pointsAttr.Get(&usdPoints, motionSampleTime);
71 pxr::VtFloatArray usdWidths;
72 widthsAttr.Get(&usdWidths, motionSampleTime);
74 pxr::UsdAttribute basisAttr =
curve_prim_.GetBasisAttr();
76 basisAttr.Get(&basis, motionSampleTime);
78 pxr::UsdAttribute typeAttr =
curve_prim_.GetTypeAttr();
80 typeAttr.Get(&
type, motionSampleTime);
82 pxr::UsdAttribute wrapAttr =
curve_prim_.GetWrapAttr();
84 wrapAttr.Get(&
wrap, motionSampleTime);
86 pxr::VtVec3fArray usdNormals;
87 curve_prim_.GetNormalsAttr().Get(&usdNormals, motionSampleTime);
91 if (!usdNormals.empty()) {
101 for (
size_t i = 0; i < num_subcurves; i++) {
102 const int num_verts = usdCounts[i];
105 if (basis == pxr::UsdGeomTokens->bspline) {
109 else if (basis == pxr::UsdGeomTokens->bezier) {
113 else if (basis.IsEmpty()) {
119 nu->
pntsu = num_verts;
122 if (
type == pxr::UsdGeomTokens->cubic) {
125 else if (
type == pxr::UsdGeomTokens->linear) {
129 if (
wrap == pxr::UsdGeomTokens->periodic) {
132 else if (
wrap == pxr::UsdGeomTokens->pinned) {
141 for (
int j = 0; j < nu->
pntsu; j++, bp++, idx++) {
142 bp->
vec[0] = (
float)usdPoints[idx][0];
143 bp->
vec[1] = (
float)usdPoints[idx][1];
144 bp->
vec[2] = (
float)usdPoints[idx][2];
150 if (idx < usdWidths.size()) {
151 radius = usdWidths[idx];
165 const double motionSampleTime,
170 return existing_mesh;
173 pxr::UsdAttribute widthsAttr =
curve_prim_.GetWidthsAttr();
174 pxr::UsdAttribute vertexAttr =
curve_prim_.GetCurveVertexCountsAttr();
175 pxr::UsdAttribute pointsAttr =
curve_prim_.GetPointsAttr();
177 pxr::VtIntArray usdCounts;
179 vertexAttr.Get(&usdCounts, motionSampleTime);
180 int num_subcurves = usdCounts.size();
182 pxr::VtVec3fArray usdPoints;
183 pointsAttr.Get(&usdPoints, motionSampleTime);
190 bool same_topology = curve_count == num_subcurves;
194 for (curve_idx = 0; nurbs; nurbs = nurbs->
next, curve_idx++) {
195 const int num_in_usd = usdCounts[curve_idx];
196 const int num_in_blender = nurbs->
pntsu;
198 if (num_in_usd != num_in_blender) {
199 same_topology =
false;
205 if (!same_topology) {
211 for (curve_idx = 0; nurbs; nurbs = nurbs->
next, curve_idx++) {
212 const int totpoint = usdCounts[curve_idx];
217 for (
int i = 0; i < totpoint; i++,
point++, vertex_idx++) {
218 point->vec[0] = usdPoints[vertex_idx][0];
219 point->vec[1] = usdPoints[vertex_idx][1];
220 point->vec[2] = usdPoints[vertex_idx][2];
223 else if (nurbs->
bezt) {
226 for (
int i = 0; i < totpoint; i++, bezier++, vertex_idx++) {
227 bezier->
vec[1][0] = usdPoints[vertex_idx][0];
228 bezier->
vec[1][1] = usdPoints[vertex_idx][1];
229 bezier->
vec[1][2] = usdPoints[vertex_idx][2];
typedef float(TangentPoint)[2]
void BKE_nurb_knot_calc_v(struct Nurb *nu)
struct Curve * BKE_curve_add(struct Main *bmain, const char *name, int type)
void BKE_nurb_knot_calc_u(struct Nurb *nu)
void BKE_nurbList_free(struct ListBase *lb)
ListBase * BKE_curve_nurbs_get(struct Curve *cu)
struct Mesh * BKE_mesh_new_nomain_from_curve(const struct Object *ob)
General operations, lookup, etc. for blender objects.
struct Object * BKE_object_add_only_object(struct Main *bmain, int type, const char *name) ATTR_RETURNS_NONNULL
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Object is a sort of wrapper for general info.
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a point
Mesh * read_mesh(struct Mesh *existing_mesh, double motionSampleTime, int read_flag, const char **err_str) override
void read_curve_sample(Curve *cu, double motionSampleTime)
pxr::UsdGeomBasisCurves curve_prim_
void read_object_data(Main *bmain, double motionSampleTime) override
void create_object(Main *bmain, double motionSampleTime) override
void add_cache_modifier()
void *(* MEM_callocN)(size_t len, const char *str)
static struct PartialUpdateUser * wrap(PartialUpdateUserImpl *user)