[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