[Bf-blender-cvs] [644052a] alembic_basic_io: Initial support to export curves.

Kévin Dietrich noreply at git.blender.org
Thu Jun 23 21:18:25 CEST 2016


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;




More information about the Bf-blender-cvs mailing list