[Bf-blender-cvs] [ca75516] alembic_basic_io: Add a points/particles reader.

Kévin Dietrich noreply at git.blender.org
Wed Jun 1 17:28:27 CEST 2016


Commit: ca755167830b99c23e7f474ac3f9c36eb158761c
Author: Kévin Dietrich
Date:   Wed Jun 1 17:15:57 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBca755167830b99c23e7f474ac3f9c36eb158761c

Add a points/particles reader.

Similarly to the hair being written as curves, this does not create a
particle system, but rather reads the points as Mesh which only has
vertices.

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

M	source/blender/alembic/intern/abc_mesh.cc
M	source/blender/alembic/intern/abc_mesh.h
M	source/blender/alembic/intern/abc_points.cc
M	source/blender/alembic/intern/abc_points.h
M	source/blender/alembic/intern/alembic_capi.cc

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

diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index 95c6816..8092aff 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -961,7 +961,7 @@ void AbcMeshWriter::getGeoGroups(
 /* Some helpers for mesh generation */
 namespace utils {
 
-static void mesh_add_verts(Mesh *mesh, size_t len)
+void mesh_add_verts(Mesh *mesh, size_t len)
 {
 	if (len == 0) {
 		return;
diff --git a/source/blender/alembic/intern/abc_mesh.h b/source/blender/alembic/intern/abc_mesh.h
index 0d51fe5..3588a30 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -140,6 +140,12 @@ void read_mpolys(MPoly *mpolys, MLoop *mloops, MLoopUV *mloopuvs,
                  const Alembic::AbcGeom::Int32ArraySamplePtr &face_counts,
                  const Alembic::AbcGeom::V2fArraySamplePtr &uvs = Alembic::AbcGeom::V2fArraySamplePtr());
 
+namespace utils {
+
+void mesh_add_verts(struct Mesh *mesh, size_t len);
+
+}
+
 /* *********************************** */
 
 class AbcEmptyReader : public AbcObjectReader {
diff --git a/source/blender/alembic/intern/abc_points.cc b/source/blender/alembic/intern/abc_points.cc
index b47fcb6..14381bd 100644
--- a/source/blender/alembic/intern/abc_points.cc
+++ b/source/blender/alembic/intern/abc_points.cc
@@ -26,10 +26,15 @@
 
 #include <Alembic/Abc/All.h>
 
+#include "abc_mesh.h"
 #include "abc_transform.h"
 
 extern "C" {
+#include "DNA_mesh_types.h"
+
 #include "BKE_lattice.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
 #include "BKE_particle.h"
 #include "BKE_scene.h"
 
@@ -37,10 +42,18 @@ extern "C" {
 }
 
 using Alembic::AbcGeom::kVertexScope;
+using Alembic::AbcGeom::kWrapExisting;
+using Alembic::AbcGeom::P3fArraySamplePtr;
+
+using Alembic::AbcGeom::IPoints;
+using Alembic::AbcGeom::IPointsSchema;
+using Alembic::AbcGeom::ISampleSelector;
 
 using Alembic::AbcGeom::OPoints;
 using Alembic::AbcGeom::OPointsSchema;
 
+/* ****************************************** */
+
 AbcPointsWriter::AbcPointsWriter(Scene *scene,
                                  Object *ob,
 	                             AbcTransformWriter *parent,
@@ -118,3 +131,39 @@ void AbcPointsWriter::do_write()
 
 	m_schema.set(m_sample);
 }
+
+/* ****************************************** */
+
+AbcPointsReader::AbcPointsReader(const Alembic::Abc::IObject &object, ImportSettings &settings)
+    : AbcObjectReader(object, settings)
+{
+	IPoints ipoints(m_iobject, kWrapExisting);
+	m_schema = ipoints.getSchema();
+}
+
+bool AbcPointsReader::valid() const
+{
+	return m_schema.valid();
+}
+
+void AbcPointsReader::readObjectData(Main *bmain, Scene *scene, float time)
+{
+	Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str());
+
+	const ISampleSelector sample_sel(time);
+	m_sample = m_schema.getValue(sample_sel);
+
+	const P3fArraySamplePtr &positions = m_sample.getPositions();
+
+	utils::mesh_add_verts(mesh, positions->size());
+	read_mverts(mesh->mvert, positions);
+
+	BKE_mesh_validate(mesh, false, false);
+
+	m_object = BKE_object_add(bmain, scene, OB_MESH, m_object_name.c_str());
+	m_object->data = mesh;
+
+	if (m_settings->is_sequence || !m_schema.isConstant()) {
+		addDefaultModifier();
+	}
+}
diff --git a/source/blender/alembic/intern/abc_points.h b/source/blender/alembic/intern/abc_points.h
index ad8a49f..de1adec 100644
--- a/source/blender/alembic/intern/abc_points.h
+++ b/source/blender/alembic/intern/abc_points.h
@@ -24,10 +24,13 @@
 
 #pragma once
 
+#include "abc_object.h"
 #include "abc_shape.h"
 
 class ParticleSystem;
 
+/* ****************************************** */
+
 class AbcPointsWriter : public AbcShapeWriter {
 	Alembic::AbcGeom::OPointsSchema m_schema;
 	Alembic::AbcGeom::OPointsSchema::Sample m_sample;
@@ -43,3 +46,17 @@ public:
 
 	void do_write();
 };
+
+/* ****************************************** */
+
+class AbcPointsReader : public AbcObjectReader {
+	Alembic::AbcGeom::IPointsSchema m_schema;
+	Alembic::AbcGeom::IPointsSchema::Sample m_sample;
+
+public:
+	AbcPointsReader(const Alembic::Abc::IObject &object, ImportSettings &settings);
+
+	bool valid() const;
+
+	void readObjectData(Main *bmain, Scene *scene, float time);
+};
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 5ad7f68..ce55d72 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -31,6 +31,7 @@
 #include "abc_hair.h"
 #include "abc_mesh.h"
 #include "abc_nurbs.h"
+#include "abc_points.h"
 #include "abc_util.h"
 
 extern "C" {
@@ -372,7 +373,7 @@ static void visit_object(const IObject &object,
 			reader = new AbcCameraReader(child, settings);
 		}
 		else if (IPoints::matches(md)) {
-			/* Pass for now. */
+			reader = new AbcPointsReader(child, settings);
 		}
 		else if (IMaterial::matches(md)) {
 			/* Pass for now. */




More information about the Bf-blender-cvs mailing list