Commit: 8c6ca4499e674ec1cde21213ff2f03cffcc62692
Author: Lukas Tönne
Date:   Fri Nov 7 12:07:16 2014 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB8c6ca4499e674ec1cde21213ff2f03cffcc62692

Added a custom mesh attribute for polygon "smooth" flags on meshes.

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

M       source/blender/pointcache/intern/mesh.cpp
M       source/blender/pointcache/intern/mesh.h

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

diff --git a/source/blender/pointcache/intern/mesh.cpp 
b/source/blender/pointcache/intern/mesh.cpp
index 2781de6..8d1cd9b 100644
--- a/source/blender/pointcache/intern/mesh.cpp
+++ b/source/blender/pointcache/intern/mesh.cpp
@@ -46,6 +46,11 @@ PointCacheWriter::PointCacheWriter(Scene *scene, Object *ob, 
PointCacheModifierD
        
        OObject root = m_archive.getTop();
        m_mesh = OPolyMesh(root, m_pcmd->modifier.name, fs);
+       
+       OPolyMeshSchema &schema = m_mesh.getSchema();
+       OCompoundProperty geom_props = schema.getArbGeomParams();
+       
+       m_param_smooth = OBoolGeomParam(geom_props, "smooth", false, 
kUniformScope, 1, 0);
 }
 
 PointCacheWriter::~PointCacheWriter()
@@ -74,6 +79,12 @@ void PointCacheWriter::write_sample()
        indices.reserve(totloop);
        std::vector<int> counts;
        counts.reserve(totpoly);
+       std::vector<bool_t> smooth;
+       smooth.reserve(totpoly);
+       
+       // TODO decide how to handle vertex/face normals, in caching vs. export 
...
+//     std::vector<V2f> uvs;
+//     OV2fGeomParam::Sample uvs(V2fArraySample(uvs), kFacevaryingScope );
        
        for (i = 0, mv = mverts; i < totvert; ++i, ++mv) {
                float *co = mv->co;
@@ -84,6 +95,7 @@ void PointCacheWriter::write_sample()
        }
        for (i = 0, mp = mpolys; i < totpoly; ++i, ++mp) {
                counts.push_back(mp->totloop);
+               smooth.push_back((bool)(mp->flag & ME_SMOOTH));
        }
        
        OPolyMeshSchema::Sample sample = OPolyMeshSchema::Sample(
@@ -91,8 +103,12 @@ void PointCacheWriter::write_sample()
                    Int32ArraySample(indices),
                    Int32ArraySample(counts)
                    );
-
        schema.set(sample);
+       
+       OBoolGeomParam::Sample sample_smooth;
+       sample_smooth.setVals(BoolArraySample(smooth));
+       sample_smooth.setScope(kUniformScope);
+       m_param_smooth.set(sample_smooth);
 }
 
 
@@ -122,6 +138,7 @@ PTCReadSampleResult PointCacheReader::read_sample(float 
frame)
                return PTC_READ_SAMPLE_INVALID;
        
        IPolyMeshSchema &schema = m_mesh.getSchema();
+       ICompoundProperty geom_props = schema.getArbGeomParams();
 //     TimeSamplingPtr ts = schema.getTimeSampling();
        if (!schema.valid() || schema.getPositionsProperty().getNumSamples() == 
0)
                return PTC_READ_SAMPLE_INVALID;
@@ -143,6 +160,14 @@ PTCReadSampleResult PointCacheReader::read_sample(float 
frame)
        int totloops = indices->size();
        int totpolys = counts->size();
        
+       IBoolGeomParam param_smooth(geom_props, "smooth", 0);
+       BoolArraySamplePtr smooth;
+       if (param_smooth) {
+               IBoolGeomParam::Sample sample_smooth;
+               param_smooth.getExpanded(sample_smooth, ss);
+               smooth = sample_smooth.getVals();
+       }
+       
        m_result = CDDM_new(totverts, 0, 0, totloops, totpolys);
        MVert *mv, *mverts = m_result->getVertArray(m_result);
        MLoop *ml, *mloops = m_result->getLoopArray(m_result);
@@ -168,6 +193,18 @@ PTCReadSampleResult PointCacheReader::read_sample(float 
frame)
                
                loopstart += mp->totloop;
        }
+       if (smooth) {
+               const bool_t *smooth_data = smooth->get();
+               bool changed = false;
+               for (i = 0, mp = mpolys; i < totpolys; ++i, ++mp) {
+                       if (smooth_data[i]) {
+                               mp->flag |= ME_SMOOTH;
+                               changed = true;
+                       }
+               }
+               if (changed)
+                       m_result->dirty = (DMDirtyFlag)((int)m_result->dirty | 
DM_DIRTY_NORMALS);
+       }
        
        CDDM_calc_edges(m_result);
        DM_ensure_normals(m_result);
diff --git a/source/blender/pointcache/intern/mesh.h 
b/source/blender/pointcache/intern/mesh.h
index 52fa32a..97038d4 100644
--- a/source/blender/pointcache/intern/mesh.h
+++ b/source/blender/pointcache/intern/mesh.h
@@ -44,6 +44,7 @@ private:
        PointCacheModifierData *m_pcmd;
        
        AbcGeom::OPolyMesh m_mesh;
+       AbcGeom::OBoolGeomParam m_param_smooth;
 };
 
 class PointCacheReader : public Reader {

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

Reply via email to