Commit: be72ad615a68c48d27ad615d5de0f30fc93778f5
Author: Lukas Tönne
Date:   Wed Mar 25 15:08:02 2015 +0100
Branches: gooseberry
https://developer.blender.org/rBbe72ad615a68c48d27ad615d5de0f30fc93778f5

Simplified data structure and reading code for strands in Alembic
caches.

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

M       source/blender/blenkernel/BKE_strands.h
M       source/blender/blenkernel/intern/strands.c
M       source/blender/pointcache/alembic/abc_particles.cpp

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

diff --git a/source/blender/blenkernel/BKE_strands.h 
b/source/blender/blenkernel/BKE_strands.h
index 950df1c..22e9c4b 100644
--- a/source/blender/blenkernel/BKE_strands.h
+++ b/source/blender/blenkernel/BKE_strands.h
@@ -21,28 +21,20 @@
 
 #include "BLI_utildefines.h"
 
-#define STRANDS_BLOCK_SIZE                          (1 << 14) /* 16384 */
-#define STRANDS_INDEX_TO_BLOCK(i)                   ((i) >> 14)
-#define STRANDS_INDEX_TO_BLOCK_OFFSET(i)            ((i) - 
STRANDS_INDEX_TO_BLOCK((i)))
-#define STRANDS_BLOCK_TO_INDEX(block, offset)       ((block) * 
STRANDS_BLOCK_SIZE + (offset))
-
-typedef struct StrandsVertexBlock {
-       float co[STRANDS_BLOCK_SIZE][3];
-       float vel[STRANDS_BLOCK_SIZE][3];
-       float rot[STRANDS_BLOCK_SIZE][4];
-       float col[STRANDS_BLOCK_SIZE][3];
-       float time[STRANDS_BLOCK_SIZE];
-} StrandsVertexBlock;
-
-typedef struct StrandsBlock {
-       int numverts[STRANDS_BLOCK_SIZE];
-       int parent[STRANDS_BLOCK_SIZE];
-} StrandsBlock;
+typedef struct StrandsVertex {
+       float co[3];
+       float time;
+       float weight;
+} StrandsVertex;
+
+typedef struct StrandsCurve {
+       int numverts;
+} StrandsCurve;
 
 typedef struct Strands {
-       StrandsBlock *strands;
-       StrandsVertexBlock *verts;
-       int totstrands, totverts;
+       StrandsCurve *curves;
+       StrandsVertex *verts;
+       int totcurves, totverts;
 } Strands;
 
 struct Strands *BKE_strands_new(int strands, int verts);
@@ -50,83 +42,55 @@ void BKE_strands_free(struct Strands *strands);
 
 /* ------------------------------------------------------------------------- */
 
-#if 0
-typedef struct StrandsIterator {
-       int totstrands; /* total number of strands to loop over */
-       int strand_index, strand_block; /* index of current strand and index in 
the block */
-       int vertex_start, vertex_block_next;
-       
-       int *numverts, *parent;
-} StrandsIterator;
+typedef struct StrandIterator {
+       int index, tot;
+       StrandsCurve *curve;
+       StrandsVertex *verts;
+} StrandIterator;
 
-BLI_INLINE void BKE_strands_iter_init(StrandsIterator *iter, Strands *strands)
+BLI_INLINE void BKE_strand_iter_init(StrandIterator *iter, Strands *strands)
 {
-       iter->strand_index = 0;
-       iter->strand_block = 0;
-       iter->totstrands = strands->totstrands;
-       
-       iter->vertex_start = 0;
-       iter->vertex_block_next = 0;
-       
-       iter->numverts = strands->strands->numverts;
-       iter->parent = strands->strands->parent;
+       iter->tot = strands->totcurves;
+       iter->index = 0;
+       iter->curve = strands->curves;
 }
 
-BLI_INLINE bool BKE_strands_iter_valid(StrandsIterator *iter)
+BLI_INLINE bool BKE_strand_iter_valid(StrandIterator *iter)
 {
-       return (iter->strand_index < iter->totstrands);
+       return iter->index < iter->tot;
 }
 
-BLI_INLINE void BKE_strand_iter_next(StrandsIterator *iter)
+BLI_INLINE void BKE_strand_iter_next(StrandIterator *iter)
 {
-       int numverts = *iter->numverts;
-       
-       ++iter->strand_index;
-       ++iter->strand_block;
-       if (iter->strand_block > STRANDS_BLOCK_SIZE)
-               iter->strand_block -= STRANDS_BLOCK_SIZE;
+       const int numverts = iter->curve->numverts;
        
-       iter->vertex_start += numverts;
-       iter->vertex_block_next += numverts;
-       if (iter->vertex_block_next > STRANDS_BLOCK_SIZE)
-               iter->vertex_block_next = 0;
+       ++iter->index;
+       ++iter->curve;
+       iter->verts += numverts;
 }
-#endif
 
 
-#if 0
-typedef struct StrandsIterator {
-       int strand_index, vertex_index;
-       int strand_block, vertex_block;
-       int totstrands, totverts;
-       float *co[3], *vel[3], *rot[4], *col[3], *time;
-} StrandsIterator;
+typedef struct StrandVertexIterator {
+       int index, tot;
+       StrandsVertex *vertex;
+} StrandVertexIterator;
 
-BLI_INLINE void BKE_strands_iter_init(StrandsIterator *iter, Strands *strands)
+BLI_INLINE void BKE_strand_vertex_iter_init(StrandVertexIterator *iter, 
StrandIterator *strand_iter)
 {
-       iter->strand_index = 0;
-       iter->strand_block = 0;
-       iter->totstrands = strands->totstrands;
-       iter->totverts = strands->totverts;
-       iter->vertex_index = 0;
-       iter->vertex_block = 0;
-       iter->co = strands->verts->co;
-       iter->vel = strands->verts->vel;
-       iter->rot = strands->verts->rot;
-       iter->col = strands->verts->col;
-       iter->time = strands->verts->time;
+       iter->tot = strand_iter->curve->numverts;
+       iter->index = 0;
+       iter->vertex = strand_iter->verts;
 }
 
-BLI_INLINE bool BKE_strands_iter_valid(StrandsIterator *iter)
+BLI_INLINE bool BKE_strand_vertex_iter_valid(StrandVertexIterator *iter)
 {
-       return (iter->strand_index < iter->totstrands) && (iter->vertex_index < 
iter->totverts);
+       return iter->index < iter->tot;
 }
 
-BLI_INLINE void BKE_strand_iter_next(StrandsIterator *iter)
+BLI_INLINE void BKE_strand_vertex_iter_next(StrandVertexIterator *iter)
 {
-       ++iter->vertex_index;
-       ++iter->vertex_block;
+       ++iter->vertex;
+       ++iter->index;
 }
-#endif
 
 #endif  /* __BKE_STRANDS_H__ */
diff --git a/source/blender/blenkernel/intern/strands.c 
b/source/blender/blenkernel/intern/strands.c
index 7fcfc88..8130382 100644
--- a/source/blender/blenkernel/intern/strands.c
+++ b/source/blender/blenkernel/intern/strands.c
@@ -20,18 +20,15 @@
 
 #include "BKE_strands.h"
 
-Strands *BKE_strands_new(int strands, int verts)
+Strands *BKE_strands_new(int curves, int verts)
 {
-       int num_strand_blocks = STRANDS_INDEX_TO_BLOCK(strands);
-       int num_vertex_blocks = STRANDS_INDEX_TO_BLOCK(verts);
-       
        Strands *s = MEM_mallocN(sizeof(Strands), "strands");
        
-       s->totstrands = strands;
-       s->strands = MEM_mallocN(sizeof(StrandsBlock) * num_strand_blocks, 
"strand strands");
+       s->totcurves = curves;
+       s->curves = MEM_mallocN(sizeof(StrandsCurve) * curves, "strand curves");
        
        s->totverts = verts;
-       s->verts = MEM_mallocN(sizeof(StrandsVertexBlock) * num_vertex_blocks, 
"strand vertices");
+       s->verts = MEM_mallocN(sizeof(StrandsVertex) * verts, "strand 
vertices");
        
        return s;
 }
@@ -39,8 +36,8 @@ Strands *BKE_strands_new(int strands, int verts)
 void BKE_strands_free(Strands *strands)
 {
        if (strands) {
-               if (strands->strands)
-                       MEM_freeN(strands->strands);
+               if (strands->curves)
+                       MEM_freeN(strands->curves);
                if (strands->verts)
                        MEM_freeN(strands->verts);
                MEM_freeN(strands);
diff --git a/source/blender/pointcache/alembic/abc_particles.cpp 
b/source/blender/pointcache/alembic/abc_particles.cpp
index 41e1f0b..43f7e19 100644
--- a/source/blender/pointcache/alembic/abc_particles.cpp
+++ b/source/blender/pointcache/alembic/abc_particles.cpp
@@ -261,17 +261,37 @@ PTCReadSampleResult AbcStrandsReader::read_sample(float 
frame)
        ICurvesSchema::Sample sample;
        schema.get(sample, ss);
        
-       P3fArraySamplePtr positions = sample.getPositions();
-       Int32ArraySamplePtr nvertices = sample.getCurvesNumVertices();
+       P3fArraySamplePtr sample_co = sample.getPositions();
+       Int32ArraySamplePtr sample_numvert = sample.getCurvesNumVertices();
        IFloatGeomParam::Sample sample_time = 
m_param_times.getExpandedValue(ss);
        IFloatGeomParam::Sample sample_weight = 
m_param_weights.getExpandedValue(ss);
        
-       if (!positions || !nvertices)
+       if (!sample_co || !sample_numvert)
                return PTC_READ_SAMPLE_INVALID;
        
-       m_strands = BKE_strands_new(nvertices->size(), positions->size());
-//     paths_apply_sample_nvertices(*m_pathcache, *m_totpath, nvertices);
-//     paths_apply_sample_data(*m_pathcache, *m_totpath, positions, 
sample_vel.getVals(), sample_rot.getVals(), sample_col.getVals(), 
sample_time.getVals());
+       m_strands = BKE_strands_new(sample_numvert->size(), sample_co->size());
+       
+       const int32_t *numvert = sample_numvert->get();
+       for (int i = 0; i < sample_numvert->size(); ++i) {
+               StrandsCurve *scurve = &m_strands->curves[i];
+               scurve->numverts = *numvert;
+               
+               ++numvert;
+       }
+       
+       const V3f *co = sample_co->get();
+       const float32_t *time = sample_time.getVals()->get();
+       const float32_t *weight = sample_weight.getVals()->get();
+       for (int i = 0; i < sample_co->size(); ++i) {
+               StrandsVertex *svert = &m_strands->verts[i];
+               copy_v3_v3(svert->co, co->getValue());
+               svert->time = *time;
+               svert->weight = *weight;
+               
+               ++co;
+               ++time;
+               ++weight;
+       }
        
        return PTC_READ_SAMPLE_EXACT;
 }

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

Reply via email to