Commit: 644052a38e10ede8756392b30a4204043a21238f
Author: Kévin Dietrich
Date:   Thu Jun 23 18:00:13 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB644052a38e10ede8756392b30a4204043a21238f

Initial support to export curves.

===================================================================

M       source/blender/alembic/intern/abc_exporter.cc
M       source/blender/alembic/intern/abc_hair.cc
M       source/blender/alembic/intern/abc_hair.h

===================================================================

diff --git a/source/blender/alembic/intern/abc_exporter.cc 
b/source/blender/alembic/intern/abc_exporter.cc
index efe1c01..201cb2e 100644
--- a/source/blender/alembic/intern/abc_exporter.cc
+++ b/source/blender/alembic/intern/abc_exporter.cc
@@ -85,6 +85,7 @@ static bool object_is_shape(Object *ob)
 
                        return true;
                        break;
+               case OB_CURVE:
                case OB_SURF:
                case OB_CAMERA:
                        return true;
@@ -498,6 +499,17 @@ void AbcExporter::createShapeWriter(Object *ob, Object 
*dupliObParent)
                        m_shapes.push_back(new AbcNurbsWriter(m_scene, ob, 
xform, m_shape_sampling_index, m_settings));
                        break;
                }
+               case OB_CURVE:
+               {
+                       Curve *cu = static_cast<Curve *>(ob->data);
+
+                       if (!cu) {
+                               return;
+                       }
+
+                       m_shapes.push_back(new AbcCurveWriter(m_scene, ob, 
xform, m_shape_sampling_index, m_settings));
+                       break;
+               }
                case OB_CAMERA:
                {
                        Camera *cam = static_cast<Camera *>(ob->data);
diff --git a/source/blender/alembic/intern/abc_hair.cc 
b/source/blender/alembic/intern/abc_hair.cc
index eeb29f7..f5053d6 100644
--- a/source/blender/alembic/intern/abc_hair.cc
+++ b/source/blender/alembic/intern/abc_hair.cc
@@ -299,6 +299,90 @@ void AbcHairWriter::write_hair_child_sample(DerivedMesh 
*dm,
 
 /* ************************************************************************** 
*/
 
+AbcCurveWriter::AbcCurveWriter(Scene *scene,
+                               Object *ob,
+                               AbcTransformWriter *parent,
+                               uint32_t time_sampling,
+                               ExportSettings &settings)
+    : AbcObjectWriter(scene, ob, time_sampling, settings, parent)
+{
+       OCurves curves(parent->alembicXform(), m_name, m_time_sampling);
+       m_schema = curves.getSchema();
+}
+
+void AbcCurveWriter::do_write()
+{
+       Curve *curve = static_cast<Curve *>(m_object->data);
+
+       std::vector<Imath::V3f> verts;
+       std::vector<int32_t> vert_counts;
+       std::vector<float> widths;
+       Imath::V3f temp_vert;
+
+       Alembic::AbcGeom::BasisType curve_basis;
+       Alembic::AbcGeom::CurveType curve_type;
+       Alembic::AbcGeom::CurvePeriodicity periodicity;
+
+       Nurb *nurbs = static_cast<Nurb *>(curve->nurb.first);
+       for (; nurbs; nurbs = nurbs->next) {
+               if ((nurbs->flagu & CU_NURB_ENDPOINT) != 0) {
+                       periodicity = Alembic::AbcGeom::kNonPeriodic;
+               }
+               else if ((nurbs->flagu & CU_NURB_CYCLIC) != 0) {
+                       periodicity = Alembic::AbcGeom::kPeriodic;
+               }
+
+               if (nurbs->bp) {
+                       curve_basis = Alembic::AbcGeom::kNoBasis;
+                       curve_type = Alembic::AbcGeom::kLinear;
+
+                       const int totpoint = nurbs->pntsu * nurbs->pntsv;
+                       vert_counts.push_back(totpoint);
+
+                       const BPoint *point = nurbs->bp;
+
+                       for (int i = 0; i < totpoint; ++i, ++point) {
+                               copy_zup_yup(temp_vert.getValue(), point->vec);
+                               verts.push_back(temp_vert);
+                               widths.push_back(point->radius);
+                       }
+               }
+               else if (nurbs->bezt) {
+                       curve_basis = Alembic::AbcGeom::kBezierBasis;
+                       curve_type = Alembic::AbcGeom::kCubic;
+
+                       const int totpoint = nurbs->pntsu;
+                       vert_counts.push_back(totpoint);
+
+                       const BezTriple *bezier = nurbs->bezt;
+
+                       /* TODO: how does Alembic store info about handles, if 
applicable? */
+                       for (int i = 0; i < totpoint; ++i, ++bezier) {
+                               copy_zup_yup(temp_vert.getValue(), 
bezier->vec[1]);
+                               verts.push_back(temp_vert);
+                       }
+               }
+       }
+
+       Alembic::Abc::P3fArraySample pos(verts);
+       m_sample = OCurvesSchema::Sample(pos, vert_counts);
+       m_sample.setBasis(curve_basis);
+       m_sample.setType(curve_type);
+       m_sample.setWrap(periodicity);
+
+       if (!widths.empty()) {
+               Alembic::AbcGeom::OFloatGeomParam::Sample width_sample;
+               width_sample.setVals(widths);
+
+               m_sample.setWidths(width_sample);
+       }
+
+       m_sample.setSelfBounds(bounds());
+       m_schema.set(m_sample);
+}
+
+/* ************************************************************************** 
*/
+
 AbcCurveReader::AbcCurveReader(const Alembic::Abc::IObject &object, 
ImportSettings &settings)
     : AbcObjectReader(object, settings)
 {
@@ -358,7 +442,7 @@ void AbcCurveReader::readObjectData(Main *bmain, Scene 
*scene, float time)
                BLI_addtail(&cu->nurb, nu);
        }
 
-       cu->actnu = hvertices->size() - 1;
+       cu->actnu = hvertices->size();
        cu->actvert = CU_ACT_NONE;
 
        if (m_settings->is_sequence || !m_curves_schema.isConstant()) {
diff --git a/source/blender/alembic/intern/abc_hair.h 
b/source/blender/alembic/intern/abc_hair.h
index 8fb0ee5..5b160d9 100644
--- a/source/blender/alembic/intern/abc_hair.h
+++ b/source/blender/alembic/intern/abc_hair.h
@@ -64,6 +64,22 @@ private:
 
 /* ************************************************************************** 
*/
 
+class AbcCurveWriter : public AbcObjectWriter {
+       Alembic::AbcGeom::OCurvesSchema m_schema;
+       Alembic::AbcGeom::OCurvesSchema::Sample m_sample;
+
+public:
+       AbcCurveWriter(Scene *scene,
+                      Object *ob,
+                      AbcTransformWriter *parent,
+                      uint32_t time_sampling,
+                      ExportSettings &settings);
+
+       void do_write();
+};
+
+/* ************************************************************************** 
*/
+
 class AbcCurveReader : public AbcObjectReader {
        Alembic::AbcGeom::ICurvesSchema m_curves_schema;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to