23 using Alembic::AbcGeom::FloatArraySamplePtr;
24 using Alembic::AbcGeom::kWrapExisting;
25 using Alembic::AbcGeom::MetaData;
26 using Alembic::AbcGeom::P3fArraySamplePtr;
28 using Alembic::AbcGeom::ICompoundProperty;
29 using Alembic::AbcGeom::INuPatch;
30 using Alembic::AbcGeom::INuPatchSchema;
31 using Alembic::AbcGeom::IObject;
44 if (m_schemas.empty()) {
48 std::vector<std::pair<INuPatchSchema, IObject>>::const_iterator it;
49 for (it = m_schemas.begin(); it != m_schemas.end(); ++it) {
50 const INuPatchSchema &schema = it->first;
52 if (!schema.valid()) {
61 const Alembic::AbcCoreAbstract::v12::ObjectHeader &alembic_header,
63 const char **err_str)
const
65 if (!Alembic::AbcGeom::INuPatch::matches(alembic_header)) {
67 "Object type mismatch, Alembic object path pointed to NURBS when importing, but not any "
73 *err_str =
"Object type mismatch, Alembic object path points to NURBS.";
80 static bool set_knots(
const FloatArraySamplePtr &knots,
float *&nu_knots)
82 if (!knots || knots->size() < 2) {
87 const size_t num_knots = knots->size() - 2;
88 nu_knots =
static_cast<float *
>(
MEM_callocN(num_knots *
sizeof(
float),
"abc_setsplineknotsu"));
90 for (
size_t i = 0; i < num_knots; i++) {
91 nu_knots[i] = (*knots)[i + 1];
102 std::vector<std::pair<INuPatchSchema, IObject>>::iterator it;
104 for (it = m_schemas.begin(); it != m_schemas.end(); ++it) {
111 const INuPatchSchema &schema = it->first;
112 INuPatchSchema::Sample smp;
114 smp = schema.getValue(sample_sel);
116 catch (Alembic::Util::Exception &ex) {
117 printf(
"Alembic: error reading nurbs sample for '%s/%s' at time %f: %s\n",
119 schema.getName().c_str(),
120 sample_sel.getRequestedTime(),
125 nu->
orderu = smp.getUOrder() - 1;
126 nu->
orderv = smp.getVOrder() - 1;
127 nu->
pntsu = smp.getNumU();
128 nu->
pntsv = smp.getNumV();
132 const P3fArraySamplePtr
positions = smp.getPositions();
133 const FloatArraySamplePtr weights = smp.getPositionWeights();
135 const size_t num_points =
positions->size();
140 float posw_in = 1.0f;
142 for (
int i = 0; i < num_points; i++, bp++) {
143 const Imath::V3f &pos_in = (*positions)[i];
146 posw_in = (*weights)[i];
150 bp->
vec[3] = posw_in;
168 ICompoundProperty user_props = schema.getUserProperties();
193 void AbcNurbsReader::getNurbsPatches(
const IObject &obj)
199 const int num_children = obj.getNumChildren();
201 if (num_children == 0) {
202 INuPatch abc_nurb(obj, kWrapExisting);
203 INuPatchSchema schem = abc_nurb.getSchema();
204 m_schemas.emplace_back(schem, obj);
208 for (
int i = 0; i < num_children; i++) {
210 IObject child(obj, obj.getChildHeader(i).getName());
216 if (!child.valid()) {
220 const MetaData &md = child.getMetaData();
222 if (INuPatch::matches(md) && ok) {
223 INuPatch abc_nurb(child, kWrapExisting);
224 INuPatchSchema schem = abc_nurb.getSchema();
225 m_schemas.emplace_back(schem, child);
228 getNurbsPatches(child);
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)
ListBase * BKE_curve_nurbs_get(struct Curve *cu)
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)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
bool accepts_object_type(const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header, const Object *const ob, const char **err_str) const override
void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) override
AbcNurbsReader(const Alembic::Abc::IObject &object, ImportSettings &settings)
bool valid() const override
std::string m_object_name
Alembic::Abc::IObject m_iobject
void *(* MEM_callocN)(size_t len, const char *str)
bool begins_with(const TContainer &input, const TContainer &match)
void get_min_max_time(const Alembic::AbcGeom::IObject &object, const Schema &schema, chrono_t &min, chrono_t &max)
BLI_INLINE void copy_zup_from_yup(float zup[3], const float yup[3])
bool has_property(const Alembic::Abc::ICompoundProperty &prop, const std::string &name)
static bool set_knots(const FloatArraySamplePtr &knots, float *&nu_knots)
MutableSpan< float3 > positions