Commit: f1df9e80938b8c11afc23a2c07c35d3df58ed18a
Author: Lukas Tönne
Date:   Sat Nov 10 14:11:40 2018 +0000
Branches: hair_object
https://developer.blender.org/rBf1df9e80938b8c11afc23a2c07c35d3df58ed18a

Add customdata for hair follicles.

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

M       source/blender/blenkernel/BKE_hair.h
M       source/blender/blenkernel/intern/hair.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/writefile.c
M       source/blender/editors/hair/edithair.c
M       source/blender/makesdna/DNA_hair_types.h

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

diff --git a/source/blender/blenkernel/BKE_hair.h 
b/source/blender/blenkernel/BKE_hair.h
index cf4f44e53bd..065a5f4d151 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -64,8 +64,9 @@ bool BKE_hair_minmax(struct HairSystem *hsys, float min[3], 
float max[3]);
 void BKE_hair_boundbox_calc(struct HairSystem *hsys);
 struct BoundBox *BKE_hair_boundbox_get(struct Object *ob);
 
+struct HairPattern *BKE_hair_pattern_new(void);
 void BKE_hair_pattern_free(struct HairPattern *pattern);
-struct HairPattern *BKE_hair_pattern_copy(const struct HairPattern 
*src_pattern);
+struct HairPattern *BKE_hair_pattern_copy(const struct HairPattern 
*src_pattern, int flag);
 
 /* Does not free the data pointer itself! */
 void BKE_hair_curve_data_free(struct HairCurveData *data);
diff --git a/source/blender/blenkernel/intern/hair.c 
b/source/blender/blenkernel/intern/hair.c
index 58e628cce7e..3cec48ca403 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -42,13 +42,13 @@
 #include "BLI_string_utf8.h"
 #include "BLI_string_utils.h"
 
-#include "DNA_hair_types.h"
 #include "DNA_mesh_types.h"
+#include "DNA_hair_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_object_types.h"
 
 #include "BKE_animsys.h"
-#include "DEG_depsgraph_query.h"
+#include "BKE_customdata.h"
 #include "BKE_global.h"
 #include "BKE_hair.h"
 #include "BKE_hair_iterators.h"
@@ -58,6 +58,8 @@
 #include "BKE_mesh_sample.h"
 #include "BKE_object.h"
 
+#include "DEG_depsgraph_query.h"
+
 #include "BLT_translation.h"
 
 void BKE_hair_init(HairSystem *hsys)
@@ -66,7 +68,7 @@ void BKE_hair_init(HairSystem *hsys)
 
        hsys->bb = BKE_boundbox_alloc_unit();
 
-       hsys->pattern = MEM_callocN(sizeof(HairPattern), "hair pattern");
+       hsys->pattern = BKE_hair_pattern_new();
        hsys->draw_settings = BKE_hair_draw_settings_new();
 }
 
@@ -79,19 +81,31 @@ void *BKE_hair_add(Main *bmain, const char *name)
        return hsys;
 }
 
+HairPattern *BKE_hair_pattern_new(void)
+{
+       HairPattern *pattern = MEM_callocN(sizeof(HairPattern), "hair pattern");
+       CustomData_reset(&pattern->fdata);
+       return pattern;
+}
+
 void BKE_hair_pattern_free(HairPattern *pattern)
 {
        if (pattern) {
                MEM_SAFE_FREE(pattern->follicles);
+               CustomData_free(&pattern->fdata, pattern->num_follicles);
                MEM_freeN(pattern);
        }
 }
 
-HairPattern *BKE_hair_pattern_copy(const HairPattern *src_pattern)
+HairPattern *BKE_hair_pattern_copy(const HairPattern *src_pattern, int flag)
 {
        HairPattern *dst_pattern = MEM_dupallocN(src_pattern);
        if (src_pattern) {
                dst_pattern->follicles = MEM_dupallocN(src_pattern->follicles);
+
+               CustomDataMask mask = CD_MASK_EVERYTHING;
+               const eCDAllocType alloc_type = (flag & 
LIB_ID_COPY_CD_REFERENCE) ? CD_REFERENCE : CD_DUPLICATE;
+               CustomData_copy(&src_pattern->fdata, &dst_pattern->fdata, mask, 
alloc_type, dst_pattern->num_follicles);
        }
        return dst_pattern;
 }
@@ -151,13 +165,13 @@ void BKE_hair_free(HairSystem *hsys)
  *
  * \param flag  Copying options (see BKE_library.h's LIB_ID_COPY_... flags for 
more).
  */
-void BKE_hair_copy_data(Main *UNUSED(bmain), HairSystem *hsys_dst, const 
HairSystem *hsys_src, const int UNUSED(flag))
+void BKE_hair_copy_data(Main *UNUSED(bmain), HairSystem *hsys_dst, const 
HairSystem *hsys_src, const int flag)
 {
        hsys_dst->bb = MEM_dupallocN(hsys_src->bb);
 
        hsys_dst->edithair = NULL;
 
-       hsys_dst->pattern = BKE_hair_pattern_copy(hsys_src->pattern);
+       hsys_dst->pattern = BKE_hair_pattern_copy(hsys_src->pattern, flag);
        BKE_hair_curve_data_copy(&hsys_dst->curve_data, &hsys_src->curve_data);
 
        hsys_dst->mat = MEM_dupallocN(hsys_src->mat);
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 736900d29da..3f397a6d10b 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -8418,6 +8418,7 @@ static void direct_link_hair(FileData *fd, HairSystem* 
hsys)
        if ( hsys->pattern )
        {
                hsys->pattern->follicles = newdataadr(fd, 
hsys->pattern->follicles);
+               direct_link_customdata(fd, &hsys->pattern->fdata, 
hsys->pattern->num_follicles);
        }
 
        hsys->curve_data.curves = newdataadr(fd, hsys->curve_data.curves);
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index f2f6a593761..cccdde99606 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1618,31 +1618,6 @@ static void write_fmaps(WriteData *wd, ListBase *fbase)
        }
 }
 
-static void write_hair(WriteData *wd, HairSystem *hsys)
-{
-       writestruct(wd, ID_HA, HairSystem, 1, hsys);
-       write_iddata(wd, &hsys->id);
-       if (hsys->adt) {
-               write_animdata(wd, hsys->adt);
-       }
-
-       if ( hsys->pattern )
-       {
-               writestruct(wd, DATA, HairPattern, 1, hsys->pattern);
-               writestruct(wd, DATA, HairFollicle, 
hsys->pattern->num_follicles, hsys->pattern->follicles);
-       }
-       
-       writestruct(wd, DATA, HairFiberCurve, hsys->curve_data.totcurves, 
hsys->curve_data.curves);
-       writestruct(wd, DATA, HairFiberVertex, hsys->curve_data.totverts, 
hsys->curve_data.verts);
-
-       if (hsys->draw_settings)
-       {
-               writestruct(wd, DATA, HairDrawSettings, 1, hsys->draw_settings);
-       }
-
-       writedata(wd, DATA, sizeof(void *) * hsys->totcol, hsys->mat);
-}
-
 static void write_modifiers(WriteData *wd, ListBase *modbase)
 {
        ModifierData *md;
@@ -2241,6 +2216,48 @@ static void write_mesh(WriteData *wd, Mesh *mesh)
        }
 }
 
+static void write_hair(WriteData *wd, HairSystem *hsys)
+{
+       writestruct(wd, ID_HA, HairSystem, 1, hsys);
+       write_iddata(wd, &hsys->id);
+       if (hsys->adt) {
+               write_animdata(wd, hsys->adt);
+       }
+
+       if ( hsys->pattern )
+       {
+               CustomDataLayer *flayers = NULL, 
flayers_buff[CD_TEMP_CHUNK_SIZE];
+
+               /* write a copy of the hair pattern, don't modify in place 
because it is
+                * not thread safe for threaded renders that are reading this */
+               HairPattern cpattern = *hsys->pattern;
+
+               /**
+                * Those calls:
+                *   - Reduce pattern->xdata.totlayer to number of layers to 
write.
+                *   - Fill xlayers with those layers to be written.
+                * Note that pattern->xdata is from now on invalid for Blender, 
but this is why the whole mesh is
+                * a temp local copy!
+                */
+               CustomData_file_write_prepare(&cpattern.fdata, &flayers, 
flayers_buff, ARRAY_SIZE(flayers_buff));
+
+               writestruct_at_address(wd, DATA, HairPattern, 1, hsys->pattern, 
&cpattern);
+               writestruct(wd, DATA, HairFollicle, cpattern.num_follicles, 
cpattern.follicles);
+
+               write_customdata(wd, &hsys->id, cpattern.num_follicles, 
&cpattern.fdata, flayers, -1, 0);
+       }
+
+       writestruct(wd, DATA, HairFiberCurve, hsys->curve_data.totcurves, 
hsys->curve_data.curves);
+       writestruct(wd, DATA, HairFiberVertex, hsys->curve_data.totverts, 
hsys->curve_data.verts);
+
+       if (hsys->draw_settings)
+       {
+               writestruct(wd, DATA, HairDrawSettings, 1, hsys->draw_settings);
+       }
+
+       writedata(wd, DATA, sizeof(void *) * hsys->totcol, hsys->mat);
+}
+
 static void write_lattice(WriteData *wd, Lattice *lt)
 {
        if (lt->id.us > 0 || wd->use_memfile) {
diff --git a/source/blender/editors/hair/edithair.c 
b/source/blender/editors/hair/edithair.c
index aedb9b871fc..69482f6bbd2 100644
--- a/source/blender/editors/hair/edithair.c
+++ b/source/blender/editors/hair/edithair.c
@@ -76,7 +76,7 @@ void ED_hair_edithair_make(Object *obedit)
 
        hsys->edithair = MEM_callocN(sizeof(EditHair), "edithair");
 
-       hsys->edithair->pattern = BKE_hair_pattern_copy(hsys->pattern);
+       hsys->edithair->pattern = BKE_hair_pattern_copy(hsys->pattern, 0);
        BKE_hair_curve_data_copy(&hsys->edithair->curve_data, 
&hsys->curve_data);
 }
 
@@ -86,7 +86,7 @@ void ED_hair_edithair_load(Object *obedit)
        
        BKE_hair_pattern_free(hsys->pattern);
        BKE_hair_curve_data_free(&hsys->curve_data);
-       hsys->pattern = BKE_hair_pattern_copy(hsys->edithair->pattern);
+       hsys->pattern = BKE_hair_pattern_copy(hsys->edithair->pattern, 0);
        BKE_hair_curve_data_copy(&hsys->curve_data, 
&hsys->edithair->curve_data);
 }
 
diff --git a/source/blender/makesdna/DNA_hair_types.h 
b/source/blender/makesdna/DNA_hair_types.h
index 1cc17f6b843..d5472f019f3 100644
--- a/source/blender/makesdna/DNA_hair_types.h
+++ b/source/blender/makesdna/DNA_hair_types.h
@@ -32,6 +32,7 @@
 #include "DNA_listBase.h"
 #include "DNA_ID.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_customdata_types.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -54,6 +55,9 @@ typedef struct HairPattern {
        struct HairFollicle *follicles;
        int num_follicles;
        int pad;
+
+       /* Per follicle custom data */
+       struct CustomData fdata;
 } HairPattern;
 
 typedef struct HairFiberCurve {

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

Reply via email to