Commit: 6a81f686eb110eb513fc3d2a74ed3c3bfe8c4449
Author: Lukas Tönne
Date:   Sun Sep 23 09:31:10 2018 +0100
Branches: hair_object
https://developer.blender.org/rB6a81f686eb110eb513fc3d2a74ed3c3bfe8c4449

Draw function for hair follicles.

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

M       source/blender/draw/intern/draw_cache.c
M       source/blender/draw/intern/draw_cache.h
M       source/blender/draw/intern/draw_cache_impl.h
M       source/blender/draw/intern/draw_cache_impl_hair.c
M       source/blender/draw/modes/edit_hair_mode.c
M       source/blender/editors/hair/edithair_test.c

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

diff --git a/source/blender/draw/intern/draw_cache.c 
b/source/blender/draw/intern/draw_cache.c
index c39ec47101a..2d831c6e6d7 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -3370,19 +3370,19 @@ GPUBatch *DRW_cache_particles_get_prim(int type)
 
 /** \name Hair */
 
-GPUBatch *DRW_cache_hair_get_fibers(struct Object *ob, struct HairSystem 
*hsys, const struct HairExportCache *hair_export)
+GPUBatch *DRW_cache_hair_get_edit_follicle_points(struct Object *ob, struct 
HairSystem *hsys)
 {
-       return DRW_hair_batch_cache_get_fibers(ob, hsys, hair_export);
+       return DRW_hair_batch_cache_get_edit_follicle_points(ob, hsys);
 }
 
-GPUBatch *DRW_cache_hair_get_follicle_points(struct Object *ob, struct 
HairSystem *hsys)
+GPUBatch *DRW_cache_hair_get_edit_follicle_normals(struct Object *ob, struct 
HairSystem *hsys)
 {
-       return DRW_hair_batch_cache_get_follicle_points(ob, hsys);
+       return DRW_hair_batch_cache_get_edit_follicle_normals(ob, hsys);
 }
 
-GPUBatch *DRW_cache_hair_get_verts(struct Object *ob, struct HairSystem *hsys)
+GPUBatch *DRW_cache_hair_get_edit_follicle_axes(struct Object *ob, struct 
HairSystem *hsys)
 {
-       return DRW_hair_batch_cache_get_verts(ob, hsys);
+       return DRW_hair_batch_cache_get_edit_follicle_axes(ob, hsys);
 }
 
 GPUBatch *DRW_cache_hair_get_edit_strands(struct Object *ob, struct HairSystem 
*hsys)
diff --git a/source/blender/draw/intern/draw_cache.h 
b/source/blender/draw/intern/draw_cache.h
index d57fd2528a5..510f4bb5fb1 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -196,9 +196,9 @@ struct GPUBatch *DRW_cache_particles_get_edit_tip_points(
 struct GPUBatch *DRW_cache_particles_get_prim(int type);
 
 /* Hair */
-struct GPUBatch *DRW_cache_hair_get_fibers(struct Object *ob, struct 
HairSystem *hsys, const struct HairExportCache *hair_export);
-struct GPUBatch *DRW_cache_hair_get_follicle_points(struct Object *ob, struct 
HairSystem *hsys);
-struct GPUBatch *DRW_cache_hair_get_verts(struct Object *ob, struct HairSystem 
*hsys);
+struct GPUBatch *DRW_cache_hair_get_edit_follicle_points(struct Object *ob, 
struct HairSystem *hsys);
+struct GPUBatch *DRW_cache_hair_get_edit_follicle_normals(struct Object *ob, 
struct HairSystem *hsys);
+struct GPUBatch *DRW_cache_hair_get_edit_follicle_axes(struct Object *ob, 
struct HairSystem *hsys);
 struct GPUBatch *DRW_cache_hair_get_edit_strands(struct Object *ob, struct 
HairSystem *hsys);
 
 /* Metaball */
diff --git a/source/blender/draw/intern/draw_cache_impl.h 
b/source/blender/draw/intern/draw_cache_impl.h
index b0f01244f52..035d06b7ebd 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -152,9 +152,9 @@ struct GPUBatch 
*DRW_particles_batch_cache_get_edit_tip_points(
         struct Object *object, struct ParticleSystem *psys, struct PTCacheEdit 
*edit);
 
 /* Hair */
-struct GPUBatch *DRW_hair_batch_cache_get_fibers(struct Object *ob, struct 
HairSystem *hsys, const struct HairExportCache *hair_export);
-struct GPUBatch *DRW_hair_batch_cache_get_follicle_points(struct Object *ob, 
struct HairSystem *hsys);
-struct GPUBatch *DRW_hair_batch_cache_get_verts(struct Object *ob, struct 
HairSystem *hsys);
+struct GPUBatch *DRW_hair_batch_cache_get_edit_follicle_points(struct Object 
*ob, struct HairSystem *hsys);
+struct GPUBatch *DRW_hair_batch_cache_get_edit_follicle_normals(struct Object 
*ob, struct HairSystem *hsys);
+struct GPUBatch *DRW_hair_batch_cache_get_edit_follicle_axes(struct Object 
*ob, struct HairSystem *hsys);
 struct GPUBatch *DRW_hair_batch_cache_get_edit_strands(struct Object *ob, 
struct HairSystem *hsys);
 
 #endif /* __DRAW_CACHE_IMPL_H__ */
diff --git a/source/blender/draw/intern/draw_cache_impl_hair.c 
b/source/blender/draw/intern/draw_cache_impl_hair.c
index 5718f14106c..2673cc354f5 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -67,6 +67,10 @@ typedef struct HairBatchCache {
        /* Control points when in edit mode. */
        ParticleHairCache edit_hair;
 
+       GPUVertBuf *edit_follicle_pos;
+       GPUBatch *edit_follicle_points;
+       int edit_follicle_point_len;
+
        bool is_dirty;
        bool is_editmode;
 } HairBatchCache;
@@ -143,6 +147,9 @@ static void hair_batch_cache_clear(HairSystem *hsys)
        if (cache) {
                particle_batch_cache_clear_hair(&cache->hair);
                particle_batch_cache_clear_hair(&cache->edit_hair);
+
+               GPU_BATCH_DISCARD_SAFE(cache->edit_follicle_points);
+               GPU_VERTBUF_DISCARD_SAFE(cache->edit_follicle_pos);
        }
 }
 
@@ -734,21 +741,86 @@ static void hair_batch_cache_ensure_pos_and_seg(
        hair_cache->indices = GPU_indexbuf_build(&elb);
 }
 
-GPUBatch *DRW_hair_batch_cache_get_fibers(Object *ob, HairSystem *hsys, const 
HairExportCache *hair_export)
+static void ensure_edit_follicle_points_count(
+        const HairPattern *pattern,
+        HairBatchCache *cache)
 {
-       // TODO
-       UNUSED_VARS(ob, hsys, hair_export);
-       return NULL;
+       if (cache->edit_follicle_pos != NULL) {
+               return;
+       }
+       cache->edit_follicle_point_len = pattern->num_follicles;
+}
+
+static void hair_batch_cache_ensure_edit_follicle_pos(
+        const HairPattern *pattern,
+        const Mesh *scalp,
+        HairBatchCache *cache)
+{
+       if (cache->edit_follicle_pos != NULL) {
+               return;
+       }
+
+       static GPUVertFormat format = { 0 };
+       static uint pos_id, data_id;
+
+       GPU_VERTBUF_DISCARD_SAFE(cache->edit_follicle_pos);
+
+       if (format.attr_len == 0) {
+               /* initialize vertex format */
+               pos_id = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 
3, GPU_FETCH_FLOAT);
+               data_id = GPU_vertformat_attr_add(&format, "data", GPU_COMP_U8, 
1, GPU_FETCH_INT);
+       }
+
+       cache->edit_follicle_pos = GPU_vertbuf_create_with_format(&format);
+       GPU_vertbuf_data_alloc(cache->edit_follicle_pos, 
cache->edit_follicle_point_len);
+
+       const HairFollicle *follicle;
+       HairIterator iter;
+       int point_index;
+       BKE_HAIR_ITER_FOLLICLES_INDEX(follicle, &iter, pattern, point_index) {
+               float loc[3], nor[3], tang[3];
+               BKE_mesh_sample_eval(scalp, &follicle->mesh_sample, loc, nor, 
tang);
+
+               GPU_vertbuf_attr_set(cache->edit_follicle_pos, pos_id, 
point_index, loc);
+
+               unsigned char flag = 0;
+               GPU_vertbuf_attr_set(cache->edit_follicle_pos, data_id, 
point_index, &flag);
+       }
+}
+
+GPUBatch *DRW_hair_batch_cache_get_edit_follicle_points(Object *ob, HairSystem 
*hsys)
+{
+       HairBatchCache *cache = hair_batch_cache_get(hsys);
+       if (cache->edit_follicle_points != NULL) {
+               return cache->edit_follicle_points;
+       }
+
+       Mesh *scalp = BKE_hair_get_scalp(DRW_context_state_get()->depsgraph, 
ob, hsys);
+       const HairPattern *pattern;
+       if (hsys->edithair) {
+               pattern = hsys->edithair->pattern;
+       }
+       else {
+               pattern = hsys->pattern;
+       }
+
+       ensure_edit_follicle_points_count(pattern, cache);
+       hair_batch_cache_ensure_edit_follicle_pos(pattern, scalp, cache);
+       cache->edit_follicle_points = GPU_batch_create(
+               GPU_PRIM_POINTS,
+               cache->edit_follicle_pos,
+               NULL);
+       return cache->edit_follicle_points;
 }
 
-GPUBatch *DRW_hair_batch_cache_get_follicle_points(Object *ob, HairSystem 
*hsys)
+GPUBatch *DRW_hair_batch_cache_get_edit_follicle_normals(Object *ob, 
HairSystem *hsys)
 {
        // TODO
        UNUSED_VARS(ob, hsys);
        return NULL;
 }
 
-GPUBatch *DRW_hair_batch_cache_get_verts(Object *ob, HairSystem *hsys)
+GPUBatch *DRW_hair_batch_cache_get_edit_follicle_axes(Object *ob, HairSystem 
*hsys)
 {
        // TODO
        UNUSED_VARS(ob, hsys);
diff --git a/source/blender/draw/modes/edit_hair_mode.c 
b/source/blender/draw/modes/edit_hair_mode.c
index b20ca7a10d4..690756dbc4d 100644
--- a/source/blender/draw/modes/edit_hair_mode.c
+++ b/source/blender/draw/modes/edit_hair_mode.c
@@ -54,6 +54,7 @@ extern char datatoc_edit_hair_overlay_frag_glsl[];
 extern char datatoc_gpu_shader_3D_vert_glsl[];
 extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
 extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[];
+extern char datatoc_gpu_shader_flat_color_frag_glsl[];
 
 /* *********** LISTS *********** */
 /* All lists are per viewport specific datas.
@@ -67,7 +68,8 @@ typedef struct EDIT_HAIR_PassList {
         * EDIT_GROOM_cache_init().
         * Only contains (DRWPass *) */
        struct DRWPass *wire_pass;
-       struct DRWPass *vert_pass;
+       struct DRWPass *overlay_vert_pass;
+       struct DRWPass *overlay_edge_pass;
 } EDIT_HAIR_PassList;
 
 typedef struct EDIT_HAIR_FramebufferList {
@@ -113,6 +115,7 @@ static struct {
        GPUShader *wire_sh;
 
        GPUShader *overlay_vert_sh;
+       GPUShader *overlay_edge_sh;
 
 } e_data = {NULL}; /* Engine data */
 
@@ -120,7 +123,8 @@ typedef struct EDIT_HAIR_PrivateData {
        /* This keeps the references of the shading groups for
         * easy access in EDIT_GROOM_cache_populate() */
        DRWShadingGroup *wire_shgrp;
-       DRWShadingGroup *vert_shgrp;
+       DRWShadingGroup *overlay_verts_shgrp;
+       DRWShadingGroup *overlay_edges_shgrp;
 } EDIT_HAIR_PrivateData; /* Transient data */
 
 /* *********** FUNCTIONS *********** */
@@ -161,6 +165,13 @@ static void EDIT_HAIR_engine_init(void *vedata)
                        datatoc_edit_hair_overlay_frag_glsl,
                        datatoc_common_globals_lib_glsl, NULL);
        }
+
+       if (!e_data.overlay_edge_sh) {
+               e_data.overlay_edge_sh = DRW_shader_create_with_lib(
+                       datatoc_edit_hair_overlay_loosevert_vert_glsl, NULL,
+                       datatoc_edit_hair_overlay_frag_glsl,
+                       datatoc_common_globals_lib_glsl, NULL);
+       }
 }
 
 /* Here init all passes and shading groups
@@ -181,12 +192,18 @@ static void EDIT_HAIR_cache_init(void *vedata)
                        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | 
DRW_STATE_DEPTH_LESS | DRW_STATE_WIRE);
                stl->g_data->wire_shgrp = DRW_shgroup_create(e_data.wire_sh, 
psl->wire_pass);
 
-               psl->vert_pass = DRW_pass_create(
-                       "Hair Verts",
+               psl->overlay_vert_pass = DRW_pass_create(
+                       "Hair Overlay Verts",
                        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | 
DRW_STATE_POINT);
-               stl->g_data->vert_shgrp = 
DRW_shgroup_create(e_data.overlay_vert_sh, psl->vert_pass);
+               stl->g_data->overlay_verts_shgrp = 
DRW_shgroup_create(e_data.overlay_vert_sh, psl->overlay_vert_pass);
+
+               psl->overlay_edge_pass = DRW_pass_create(
+                       "Hair Overlay Edges",
+                       DRW_STATE_WRIT

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to