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