Commit: 23a12096305d6328dd4ba0c01962f3586ab04e5c
Author: Lukas Tönne
Date:   Sun Aug 24 13:54:33 2014 +0200
Branches: hair_system
https://developer.blender.org/rB23a12096305d6328dd4ba0c01962f3586ab04e5c

Distinguish nominal and allocated size of hair volume attributes.

This allows keeping extra memory around for later use instead of freeing
every time the attribute needs to be resized (compare to std::vector).

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

M       source/blender/hair/intern/HAIR_volume.h

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

diff --git a/source/blender/hair/intern/HAIR_volume.h 
b/source/blender/hair/intern/HAIR_volume.h
index ec3fd71..525beba 100644
--- a/source/blender/hair/intern/HAIR_volume.h
+++ b/source/blender/hair/intern/HAIR_volume.h
@@ -40,6 +40,7 @@ struct VolumeAttribute {
        VolumeAttribute()
        {
                m_data = NULL;
+               m_alloc_size = 0;
                m_size = 0;
        }
        
@@ -60,26 +61,44 @@ struct VolumeAttribute {
        
        void resize(int size)
        {
-               free();
-               alloc(size);
+               if (size > m_alloc_size) {
+                       free();
+                       alloc(size);
+               }
+               else {
+                       m_size = size;
+               }
+       }
+       
+       void shrink_to_fit()
+       {
+               if (m_size < m_alloc_size) {
+                       free();
+                       alloc(m_size);
+               }
        }
        
 protected:
        void alloc(int size)
        {
-               m_data = (T*)MEM_mallocN(sizeof(T) * size, "Hair Volume 
Attribute");
+               m_data = size > 0 ? (T*)MEM_mallocN(sizeof(T) * size, "Hair 
Volume Attribute") : NULL;
+               m_alloc_size = size;
                m_size = size;
        }
        
        void free()
        {
-               if (m_data)
+               if (m_data) {
                        MEM_freeN(m_data);
+                       m_data = NULL;
+               }
+               m_alloc_size = 0;
+               m_size = 0;
        }
        
 private:
        T *m_data;
-       int m_size;
+       int m_size, m_alloc_size;
 };
 
 typedef VolumeAttribute<float> VolumeAttributeFloat;

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

Reply via email to