[Bf-blender-cvs] [91f6635] alembic_pointcache: Improved edge attribute caching.
Lukas Tönne
noreply at git.blender.org
Mon Mar 9 17:42:56 CET 2015
Commit: 91f6635e098f9d0963b32accfbb8090ed35eca0a
Author: Lukas Tönne
Date: Mon Mar 9 17:42:01 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB91f6635e098f9d0963b32accfbb8090ed35eca0a
Improved edge attribute caching.
Now edges should be fully restored from cache, fixing edge display.
===================================================================
M source/blender/pointcache/alembic/abc_mesh.cpp
M source/blender/pointcache/alembic/abc_mesh.h
===================================================================
diff --git a/source/blender/pointcache/alembic/abc_mesh.cpp b/source/blender/pointcache/alembic/abc_mesh.cpp
index b9bf123..f017c48 100644
--- a/source/blender/pointcache/alembic/abc_mesh.cpp
+++ b/source/blender/pointcache/alembic/abc_mesh.cpp
@@ -67,7 +67,10 @@ void AbcDerivedMeshWriter::open_archive(WriterArchive *archive)
OCompoundProperty user_props = schema.getUserProperties();
m_param_smooth = OBoolGeomParam(geom_props, "smooth", false, kUniformScope, 1, 0);
- m_prop_edges = OInt32ArrayProperty(user_props, "edges", 0);
+ m_prop_edge_verts = OUInt32ArrayProperty(user_props, "edge_verts", 0);
+ m_prop_edge_flag = OInt16ArrayProperty(user_props, "edge_flag", 0);
+ m_prop_edge_crease = OCharArrayProperty(user_props, "edge_crease", 0);
+ m_prop_edge_bweight = OCharArrayProperty(user_props, "edge_bweight", 0);
m_prop_edges_index = OInt32ArrayProperty(user_props, "edges_index", 0);
m_param_poly_normals = ON3fGeomParam(geom_props, "poly_normals", false, kUniformScope, 1, 0);
m_param_vertex_normals = ON3fGeomParam(geom_props, "vertex_normals", false, kVertexScope, 1, 0);
@@ -98,6 +101,34 @@ static void ensure_normal_data(DerivedMesh *dm)
}
#endif
+void AbcDerivedMeshWriter::write_sample_edges(DerivedMesh *dm)
+{
+ MEdge *me, *medges = dm->getEdgeArray(dm);
+ int i, totedge = dm->getNumEdges(dm);
+
+ std::vector<uint32_t> data_edge_verts;
+ std::vector<int16_t> data_edge_flag;
+ std::vector<int8_t> data_edge_crease;
+ std::vector<int8_t> data_edge_bweight;
+ data_edge_verts.reserve(totedge * 2);
+ data_edge_flag.reserve(totedge);
+ data_edge_crease.reserve(totedge);
+ data_edge_bweight.reserve(totedge);
+
+ for (i = 0, me = medges; i < totedge; ++i, ++me) {
+ data_edge_verts.push_back(me->v1);
+ data_edge_verts.push_back(me->v2);
+ data_edge_flag.push_back(me->flag);
+ data_edge_crease.push_back(me->crease);
+ data_edge_bweight.push_back(me->bweight);
+ }
+
+ m_prop_edge_verts.set(UInt32ArraySample(data_edge_verts));
+ m_prop_edge_flag.set(Int16ArraySample(data_edge_flag));
+ m_prop_edge_crease.set(CharArraySample(data_edge_crease));
+ m_prop_edge_bweight.set(CharArraySample(data_edge_bweight));
+}
+
static P3fArraySample create_sample_positions(DerivedMesh *dm, std::vector<V3f> &data)
{
MVert *mv, *mverts = dm->getVertArray(dm);
@@ -154,20 +185,6 @@ static OBoolGeomParam::Sample create_sample_poly_smooth(DerivedMesh *dm, std::ve
return sample;
}
-static OInt32ArrayProperty::sample_type create_sample_edge_vertices(DerivedMesh *dm, std::vector<int> &data)
-{
- MEdge *me, *medges = dm->getEdgeArray(dm);
- int i, totedge = dm->getNumEdges(dm);
-
- data.reserve(totedge * 2);
- for (i = 0, me = medges; i < totedge; ++i, ++me) {
- data.push_back(me->v1);
- data.push_back(me->v2);
- }
-
- return OInt32ArrayProperty::sample_type(data);
-}
-
static OInt32ArrayProperty::sample_type create_sample_edge_indices(DerivedMesh *dm, std::vector<int> &data)
{
MLoop *ml, *mloops = dm->getLoopArray(dm);
@@ -257,7 +274,6 @@ void AbcDerivedMeshWriter::write_sample()
std::vector<int> indices_buffer;
std::vector<int> counts_buffer;
std::vector<bool_t> smooth_buffer;
- std::vector<int> edges_buffer;
std::vector<int> edges_index_buffer;
std::vector<N3f> loop_normals_buffer;
std::vector<N3f> poly_normals_buffer;
@@ -273,7 +289,6 @@ void AbcDerivedMeshWriter::write_sample()
Int32ArraySample indices = create_sample_vertex_indices(output_dm, indices_buffer);
Int32ArraySample counts = create_sample_loop_counts(output_dm, counts_buffer);
OBoolGeomParam::Sample smooth = create_sample_poly_smooth(output_dm, smooth_buffer);
- OInt32ArrayProperty::sample_type edges = create_sample_edge_vertices(output_dm, edges_buffer);
OInt32ArrayProperty::sample_type edges_index = create_sample_edge_indices(output_dm, edges_index_buffer);
N3fArraySample lnormals = create_sample_loop_normals(output_dm, loop_normals_buffer);
N3fArraySample pnormals = create_sample_poly_normals(output_dm, poly_normals_buffer);
@@ -288,6 +303,8 @@ void AbcDerivedMeshWriter::write_sample()
);
schema.set(sample);
+ write_sample_edges(output_dm);
+
if (pnormals.valid())
m_param_poly_normals.set(ON3fGeomParam::Sample(pnormals, kUniformScope));
if (vnormals.valid())
@@ -295,7 +312,6 @@ void AbcDerivedMeshWriter::write_sample()
m_param_smooth.set(smooth);
- m_prop_edges.set(edges);
m_prop_edges_index.set(edges_index);
CustomData *vdata = output_dm->getVertDataLayout(output_dm);
@@ -339,12 +355,52 @@ void AbcDerivedMeshReader::open_archive(ReaderArchive *archive)
m_param_poly_normals = IN3fGeomParam(geom_props, "poly_normals", 0);
m_param_vertex_normals = IN3fGeomParam(geom_props, "vertex_normals", 0);
m_param_smooth = IBoolGeomParam(geom_props, "smooth", 0);
- m_prop_edges = IInt32ArrayProperty(user_props, "edges", 0);
+ m_prop_edge_verts = IUInt32ArrayProperty(user_props, "edge_verts", 0);
+ m_prop_edge_flag = IInt16ArrayProperty(user_props, "edge_flag", 0);
+ m_prop_edge_crease = ICharArrayProperty(user_props, "edge_crease", 0);
+ m_prop_edge_bweight = ICharArrayProperty(user_props, "edge_bweight", 0);
m_prop_edges_index = IInt32ArrayProperty(user_props, "edges_index", 0);
}
}
}
+PTCReadSampleResult AbcDerivedMeshReader::read_sample_edges(const ISampleSelector &ss, DerivedMesh *dm, UInt32ArraySamplePtr sample_edge_verts)
+{
+ Int16ArraySamplePtr sample_edge_flag = m_prop_edge_flag.getValue(ss);
+ CharArraySamplePtr sample_edge_crease = m_prop_edge_crease.getValue(ss);
+ CharArraySamplePtr sample_edge_bweight = m_prop_edge_bweight.getValue(ss);
+
+ int totedge = dm->getNumEdges(dm);
+ if (sample_edge_verts->size() != totedge * 2 ||
+ sample_edge_flag->size() != totedge ||
+ sample_edge_crease->size() != totedge ||
+ sample_edge_bweight->size() != totedge)
+ return PTC_READ_SAMPLE_INVALID;
+
+ const uint32_t *data_edge_verts = sample_edge_verts->get();
+ const int16_t *data_edge_flag = sample_edge_flag->get();
+ const int8_t *data_edge_crease = sample_edge_crease->get();
+ const int8_t *data_edge_bweight = sample_edge_bweight->get();
+
+ MEdge *me = dm->getEdgeArray(dm);
+ for (int i = 0; i < totedge; ++i) {
+ me->v1 = data_edge_verts[0];
+ me->v2 = data_edge_verts[1];
+ me->flag = *data_edge_flag;
+ me->crease = *data_edge_crease;
+ me->bweight = *data_edge_bweight;
+
+ ++me;
+ data_edge_verts += 2;
+ ++data_edge_flag;
+ ++data_edge_crease;
+ ++data_edge_bweight;
+ }
+
+ return PTC_READ_SAMPLE_EXACT;
+}
+
+
static void apply_sample_positions(DerivedMesh *dm, P3fArraySamplePtr sample)
{
MVert *mv, *mverts = dm->getVertArray(dm);
@@ -455,20 +511,6 @@ static void apply_sample_poly_smooth(DerivedMesh *dm, BoolArraySamplePtr sample)
}
}
-static void apply_sample_edge_vertices(DerivedMesh *dm, Int32ArraySamplePtr sample)
-{
- MEdge *me, *medges = dm->getEdgeArray(dm);
- int i, totedge = dm->getNumEdges(dm);
-
- BLI_assert(sample->size() == totedge * 2);
-
- const int32_t *data = sample->get();
- for (i = 0, me = medges; i < totedge; ++i, ++me) {
- me->v1 = data[(i << 1)];
- me->v2 = data[(i << 1) + 1];
- }
-}
-
static void apply_sample_edge_indices(DerivedMesh *dm, Int32ArraySamplePtr sample)
{
MLoop *ml, *mloops = dm->getLoopArray(dm);
@@ -541,22 +583,21 @@ PTCReadSampleResult AbcDerivedMeshReader::read_sample(float frame)
}
bool has_edges = false;
- Int32ArraySamplePtr edges, edges_index;
- if (m_prop_edges && m_prop_edges.getNumSamples() > 0
- && m_prop_edges_index && m_prop_edges_index.getNumSamples() > 0) {
- m_prop_edges.get(edges, ss);
+ UInt32ArraySamplePtr edge_verts = m_prop_edge_verts.getValue(ss);
+ Int32ArraySamplePtr edges_index;
+ if (m_prop_edges_index && m_prop_edges_index.getNumSamples() > 0) {
m_prop_edges_index.get(edges_index, ss);
- BLI_assert(edges->size() % 2 == 0); /* 2 vertex indices per edge */
- has_edges = edges->valid() && edges_index->valid();
+ has_edges = edges_index->valid();
}
+ has_edges |= m_prop_edge_verts.getNumSamples() > 0;
PROFILE_END(time_get_sample);
PROFILE_START;
int totverts = positions->size();
int totloops = indices->size();
int totpolys = counts->size();
- int totedges = has_edges ? edges->size() >> 1 : 0;
+ int totedges = has_edges ? edge_verts->size() >> 1 : 0;
m_result = CDDM_new(totverts, totedges, 0, totloops, totpolys);
apply_sample_positions(m_result, positions);
@@ -574,7 +615,7 @@ PTCReadSampleResult AbcDerivedMeshReader::read_sample(float frame)
m_result->dirty = (DMDirtyFlag)((int)m_result->dirty | DM_DIRTY_NORMALS);
}
if (has_edges) {
- apply_sample_edge_vertices(m_result, edges);
+ read_sample_edges(ss, m_result, edge_verts);
apply_sample_edge_indices(m_result, edges_index);
}
if (smooth)
diff --git a/source/blender/pointcache/alembic/abc_mesh.h b/source/blender/pointcache/alembic/abc_mesh.h
index dba5c02..f62dfb2 100644
--- a/source/blender/pointcache/alembic/abc_mesh.h
+++ b/source/blender/pointcache/alembic/abc_mesh.h
@@ -50,10 +50,19 @@ public:
void write_sample();
+protected:
+ void write_sample_edges(DerivedMesh *dm);
+
private:
AbcGeom::OPolyMesh m_mesh;
AbcGeom::OBoolGeomParam m_param_smooth;
- AbcGeom::OInt32ArrayProperty m_prop_edges;
+
+ /* MEdge attributes */
+ AbcGeom::OUInt32ArrayProperty m_prop_edge_verts;
+ AbcGeom::OInt16ArrayProperty m_prop_edge_flag;
+ AbcGeom::OCharArrayProperty m_prop_edge_crease;
+ AbcGeom::OCharArrayProperty m_prop_edge_bweight;
+
AbcGeom::OInt32ArrayProperty m_prop_edges_index;
AbcGeom::ON3fGeomParam m_param_vertex_normals;
AbcGeom::ON3fGeomParam m_param_poly_normals;
@@ -72,10 +81,19 @@ public:
PTCReadSampleResult read_sample(float frame);
+protected:
+ PTCReadSampleResult read_sample_edges(const Abc::ISampleSelector &ss, DerivedMesh *dm, Abc::UInt32ArraySamplePtr sample_edge_verts);
+
private:
AbcGeom::IPolyMesh m_mesh;
AbcGeom::IBoolGeomParam m_param_smooth;
- AbcGeom::IInt32ArrayProperty m_prop_edges;
+
+ /* MEdge attributes */
+ AbcGeom::IUInt32ArrayProperty m_prop_edge_verts;
+ AbcGeom::IInt16ArrayProperty m_prop_edge_flag;
+ AbcGeom::ICharArrayProperty m_prop_edge_crease;
+ AbcGeom::ICharArrayProperty m_prop_edge_bweight;
+
Abc
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list