Commit: 9644035713578ddf0a1357c802397bd44c3e393c
Author: Kévin Dietrich
Date:   Tue May 31 02:28:12 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB9644035713578ddf0a1357c802397bd44c3e393c

Initial support for streaming meshes with a varying number of
vertices.

This is achieved by making use of a new modifier since the mesh cache
modifier cannot modifiy the number of vertices in a mesh. This modifier
also brings support to read file sequences.

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

M       release/scripts/startup/bl_ui/properties_data_modifier.py
M       source/blender/alembic/ABC_alembic.h
M       source/blender/alembic/intern/abc_hair.cc
M       source/blender/alembic/intern/abc_mesh.cc
M       source/blender/alembic/intern/abc_mesh.h
M       source/blender/alembic/intern/alembic_capi.cc
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/RNA_access.h
M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/CMakeLists.txt
M       source/blender/modifiers/MOD_modifiertypes.h
A       source/blender/modifiers/intern/MOD_meshsequencecache.c
M       source/blender/modifiers/intern/MOD_util.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py 
b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 7e1965d..870658a 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -222,6 +222,10 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         row = split.row()
         row.prop(md, "flip_axis")
 
+    def MESH_SEQUENCE_CACHE(self, layout, ob, md):
+        layout.prop(md, "filepath")
+        layout.prop(md, "abc_object_path")
+
     def CAST(self, layout, ob, md):
         split = layout.split(percentage=0.25)
 
diff --git a/source/blender/alembic/ABC_alembic.h 
b/source/blender/alembic/ABC_alembic.h
index daef9e2..31065c0 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -28,6 +28,7 @@ extern "C" {
 #endif
 
 struct bContext;
+struct DerivedMesh;
 struct Object;
 struct Scene;
 
@@ -62,6 +63,8 @@ int ABC_check_subobject_valid(const char *filepath, const 
char *object_path);
 
 void ABC_get_transform(struct Object *ob, const char *filepath, const char 
*object_path, float r_mat[4][4], float time);
 
+struct DerivedMesh *ABC_read_mesh(const char *filepath, const char 
*object_path, const float path);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/alembic/intern/abc_hair.cc 
b/source/blender/alembic/intern/abc_hair.cc
index dd62c1f..565a6aa 100644
--- a/source/blender/alembic/intern/abc_hair.cc
+++ b/source/blender/alembic/intern/abc_hair.cc
@@ -35,11 +35,13 @@ extern "C" {
 
 #include "BLI_listbase.h"
 #include "BLI_math_geom.h"
+#include "BLI_string.h"
 
 #include "BKE_curve.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_object.h"
 #include "BKE_particle.h"
+#include "BKE_modifier.h"
 
 #include "ED_curve.h"
 }
@@ -307,9 +309,10 @@ bool AbcHairReader::valid() const
        return m_curves_schema.valid();
 }
 
+
 void AbcHairReader::readObjectData(Main *bmain, Scene *scene, float time)
 {
-       Curve *cu = BKE_curve_add(bmain, "abc_hair", OB_CURVE);
+       Curve *cu = BKE_curve_add(bmain, m_data_name.c_str(), OB_CURVE);
        cu->flag |= CU_DEFORM_FILL | CU_PATH | CU_3D;
 
        const ISampleSelector sample_sel(time);
@@ -359,4 +362,18 @@ void AbcHairReader::readObjectData(Main *bmain, Scene 
*scene, float time)
 
        cu->actnu = hvertices->size() - 1;
        cu->actvert = CU_ACT_NONE;
+
+       if (true) {
+               ModifierData *md = 
modifier_new(eModifierType_MeshSequenceCache);
+               BLI_addtail(&m_object->modifiers, md);
+
+               MeshSeqCacheModifierData *mcmd = 
reinterpret_cast<MeshSeqCacheModifierData *>(md);
+//             mcmd->type = MOD_MESHCACHE_TYPE_ABC;
+//             mcmd->time_mode = MOD_MESHCACHE_TIME_SECONDS;
+//             mcmd->forward_axis = OB_POSZ;
+//             mcmd->up_axis = OB_NEGY;
+
+               BLI_strncpy(mcmd->filepath, 
m_iobject.getArchive().getName().c_str(), 1024);
+               BLI_strncpy(mcmd->abc_object_path, 
m_iobject.getFullName().c_str(), 1024);
+       }
 }
diff --git a/source/blender/alembic/intern/abc_mesh.cc 
b/source/blender/alembic/intern/abc_mesh.cc
index b4b7b85..0ee40a5 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -1131,7 +1131,7 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene 
*scene, float time)
                const ISubDSchema::Sample sample = 
m_subd_schema.getValue(sample_sel);
 
                readVertexDataSample(mesh, sample.getPositions());
-               readPolyDataSample(mesh, sample.getFaceIndices(), 
sample.getFaceCounts(), poly_start);
+               readPolyDataSample(mesh, sample.getFaceIndices(), 
sample.getFaceCounts());
        }
        else {
                is_constant = m_schema.isConstant();
@@ -1139,7 +1139,7 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene 
*scene, float time)
                const IPolyMeshSchema::Sample sample = 
m_schema.getValue(sample_sel);
 
                readVertexDataSample(mesh, sample.getPositions());
-               readPolyDataSample(mesh, sample.getFaceIndices(), 
sample.getFaceCounts(), poly_start);
+               readPolyDataSample(mesh, sample.getFaceIndices(), 
sample.getFaceCounts());
        }
 
        BKE_mesh_validate(mesh, false, false);
@@ -1156,48 +1156,33 @@ void AbcMeshReader::readObjectData(Main *bmain, Scene 
*scene, float time)
 
        /* Add a default mesh cache modifier */
 
-       if (!is_constant) {
-               ModifierData *md = modifier_new(eModifierType_MeshCache);
+       if (true || !is_constant) {
+               ModifierData *md = 
modifier_new(eModifierType_MeshSequenceCache);
                BLI_addtail(&m_object->modifiers, md);
 
-               MeshCacheModifierData *mcmd = 
reinterpret_cast<MeshCacheModifierData *>(md);
-               mcmd->type = MOD_MESHCACHE_TYPE_ABC;
-               mcmd->time_mode = MOD_MESHCACHE_TIME_SECONDS;
-               mcmd->forward_axis = OB_POSZ;
-               mcmd->up_axis = OB_NEGY;
+               MeshSeqCacheModifierData *mcmd = 
reinterpret_cast<MeshSeqCacheModifierData *>(md);
+//             mcmd->type = MOD_MESHCACHE_TYPE_ABC;
+//             mcmd->time_mode = MOD_MESHCACHE_TIME_SECONDS;
+//             mcmd->forward_axis = OB_POSZ;
+//             mcmd->up_axis = OB_NEGY;
 
                BLI_strncpy(mcmd->filepath, 
m_iobject.getArchive().getName().c_str(), 1024);
-               BLI_strncpy(mcmd->sub_object, m_iobject.getFullName().c_str(), 
1024);
+               BLI_strncpy(mcmd->abc_object_path, 
m_iobject.getFullName().c_str(), 1024);
        }
 }
 
 void AbcMeshReader::readVertexDataSample(Mesh *mesh, const P3fArraySamplePtr 
&positions)
 {
-       const size_t vertex_count = positions->size();
-       const size_t vertex_start = mesh->totvert;
-
-       utils::mesh_add_verts(mesh, vertex_count);
-
-       for (int i = 0, j = vertex_start; i < vertex_count; ++i, ++j) {
-               MVert &mvert = mesh->mvert[j];
-               Imath::V3f pos_in = (*positions)[i];
-
-               /* Convert Y-up to Z-up. */
-               mvert.co[0] = pos_in[0];
-               mvert.co[1] = -pos_in[2];
-               mvert.co[2] = pos_in[1];
-               mvert.bweight = 0;
-       }
+       utils::mesh_add_verts(mesh, positions->size());
+       read_mverts(mesh->mvert, positions);
 }
 
 void AbcMeshReader::readPolyDataSample(Mesh *mesh,
                                        const Int32ArraySamplePtr &face_indices,
-                                       const Int32ArraySamplePtr &face_counts,
-                                       const size_t poly_start)
+                                       const Int32ArraySamplePtr &face_counts)
 {
        const size_t num_poly = face_counts->size();
        const size_t num_loops = face_indices->size();
-       const size_t loop_pos = mesh->totloop;
 
        utils::mesh_add_mpolygons(mesh, num_poly);
        utils::mesh_add_mloops(mesh, num_loops);
@@ -1211,29 +1196,8 @@ void AbcMeshReader::readPolyDataSample(Mesh *mesh,
                uvsamp_vals = uvsamp.getVals();
        }
 
-       int j = poly_start;
-       int loopcount = loop_pos;
-       for (int i = 0; i < num_poly; ++i, ++j) {
-               int face_size = (*face_counts)[i];
-               MPoly &poly = mesh->mpoly[j];
-
-               poly.loopstart = loopcount;
-               poly.totloop = face_size;
-
-               /* TODO: reverse */
-               int rev_loop = loopcount;
-               for (int f = face_size; f-- ;) {
-                       MLoop &loop     = mesh->mloop[rev_loop + f];
-                       MLoopUV &loopuv = mesh->mloopuv[rev_loop + f];
-
-                       if (uvsamp_vals) {
-                               loopuv.uv[0] = (*uvsamp_vals)[loopcount][0];
-                               loopuv.uv[1] = (*uvsamp_vals)[loopcount][1];
-                       }
-
-                       loop.v = (*face_indices)[loopcount++];
-               }
-       }
+       read_mpolys(mesh->mpoly, mesh->mloop, mesh->mloopuv,
+                   face_indices, face_counts, uvsamp_vals);
 }
 
 void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh *mesh, size_t 
poly_start,
@@ -1292,6 +1256,51 @@ void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh 
*mesh, size_t poly_star
        utils::assign_materials(bmain, m_object, mat_map);
 }
 
+/* ********************************************************** */
+
+void read_mverts(MVert *mverts, const Alembic::AbcGeom::P3fArraySamplePtr 
&positions)
+{
+       for (int i = 0; i < positions->size(); ++i) {
+               MVert &mvert = mverts[i];
+               Imath::V3f pos_in = (*positions)[i];
+
+               /* Convert Y-up to Z-up. */
+               mvert.co[0] = pos_in[0];
+               mvert.co[1] = -pos_in[2];
+               mvert.co[2] = pos_in[1];
+               mvert.bweight = 0;
+       }
+}
+
+void read_mpolys(MPoly *mpolys, MLoop *mloops, MLoopUV *mloopuvs,
+                 const Alembic::AbcGeom::Int32ArraySamplePtr &face_indices,
+                 const Alembic::AbcGeom::Int32ArraySamplePtr &face_counts,
+                 const Alembic::AbcGeom::V2fArraySamplePtr &uvs)
+{
+       int loopcount = 0;
+       for (int i = 0; i < face_counts->size(); ++i) {
+               int face_size = (*face_counts)[i];
+               MPoly &poly = mpolys[i];
+
+               poly.loopstart = loopcount;
+               poly.totloop = face_size;
+
+               /* TODO: reverse */
+               int rev_loop = loopcount;
+               for (int f = face_size; f-- ;) {
+                       MLoop &loop     = mloops[rev_loop + f];
+
+                       if (mloopuvs && uvs) {
+                               MLoopUV &loopuv = mloopuvs[rev_loop + f];
+                               loopuv.uv[0] = (*uvs)[loopcount][0];
+                               loopuv.uv[1] = (*uvs)[loopcount][1];
+                       }
+
+                       loop.v = (*face_indices)[loopcount++];
+               }
+       }
+}
+
 /* ***************************** AbcEmptyReader ***************************** 
*/
 
 AbcEmptyReader::AbcEmptyReader(const Alembic::Abc::IObject &object, 
ImportSettings &settings)
diff --git a/source/blender/alembic/intern/abc_mesh.h 
b/source/blender/alembic/intern/abc_mesh.h
index ef72ee1..0d51fe5 100644
--- a/source/blender/alembic/intern/abc_mesh.h
+++ b/source/blender/alembic/intern/abc_mesh.h
@@ -121,13 +121,27 @@ private:
 
        void readPolyDataSample(Mesh *mesh,
                                const Alembic::AbcGeom::Int32ArraySamplePtr 
&face_indices,
-                            const Alembic::AbcGeom::Int32ArraySamplePtr 
&face_counts,
-                            const size_t poly_start);
+                            const Alembic::AbcGeom::Int32ArraySamplePtr 
&face_counts);
 
        void readVertexDataSample(Mesh *mesh,
                                  const Alembic::AbcGeom::P3fArraySamplePtr 
&positions);
 };
 
+/* *********************************** */
+
+struct MLoop;
+struct MLoopUV;
+struct MPoly;
+struct MVert;
+
+void read_mverts(MVert *mverts, const Alembic::AbcGeom::P3fArraySamplePtr 
&positions);
+void read_mpolys(MPoly *mpolys, MLoop *mloops, MLoopUV *mloopuvs,
+                 const Alembic::AbcGeom::Int32ArraySamplePtr &face_indices,
+                 const Alembic::AbcGeom::Int32ArraySamplePtr &face_counts,
+                 const Alembic::AbcGeom::V2fArraySamplePtr &uvs = 
Alembic::AbcGeom::V2fArraySamplePtr());
+
+/* *********************************** */
+
 class AbcEmptyReader : public AbcObjectReader {
        Alembic::AbcGeom::IXformSchema m_schem

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to