Commit: 6f891e2b87fa44714ce66c7aff1b402603f48ff9 Author: Sergey Sharybin Date: Wed May 9 14:59:29 2018 +0200 Branches: blender2.8 https://developer.blender.org/rB6f891e2b87fa44714ce66c7aff1b402603f48ff9
Draw manager: Implement point selection modes for particle edit mode =================================================================== 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_particles.c M source/blender/draw/modes/particle_mode.c M source/blender/editors/space_view3d/space_view3d.c =================================================================== diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index 95193bebaea..38ec9cff7f4 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -2891,9 +2891,14 @@ Gwn_Batch *DRW_cache_particles_get_edit_strands(struct PTCacheEdit *edit) return DRW_particles_batch_cache_get_edit_strands(edit); } -Gwn_Batch *DRW_cache_particles_get_edit_points(struct PTCacheEdit *edit) +Gwn_Batch *DRW_cache_particles_get_edit_inner_points(struct PTCacheEdit *edit) { - return DRW_particles_batch_cache_get_edit_points(edit); + return DRW_particles_batch_cache_get_edit_inner_points(edit); +} + +Gwn_Batch *DRW_cache_particles_get_edit_tip_points(struct PTCacheEdit *edit) +{ + return DRW_particles_batch_cache_get_edit_tip_points(edit); } Gwn_Batch *DRW_cache_particles_get_prim(int type) diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index e726e25431f..66db405786d 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -170,7 +170,8 @@ struct Gwn_Batch *DRW_cache_lattice_vert_overlay_get(struct Object *ob); struct Gwn_Batch *DRW_cache_particles_get_hair(struct ParticleSystem *psys, struct ModifierData *md); struct Gwn_Batch *DRW_cache_particles_get_dots(struct Object *object, struct ParticleSystem *psys); struct Gwn_Batch *DRW_cache_particles_get_edit_strands(struct PTCacheEdit *edit); -struct Gwn_Batch *DRW_cache_particles_get_edit_points(struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_cache_particles_get_edit_inner_points(struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_cache_particles_get_edit_tip_points(struct PTCacheEdit *edit); struct Gwn_Batch *DRW_cache_particles_get_prim(int type); /* Metaball */ diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h index 84c7825c6f9..4e3c56eb427 100644 --- a/source/blender/draw/intern/draw_cache_impl.h +++ b/source/blender/draw/intern/draw_cache_impl.h @@ -126,6 +126,7 @@ void DRW_mesh_cache_sculpt_coords_ensure(struct Mesh *me); struct Gwn_Batch *DRW_particles_batch_cache_get_hair(struct ParticleSystem *psys, struct ModifierData *md); struct Gwn_Batch *DRW_particles_batch_cache_get_dots(struct Object *object, struct ParticleSystem *psys); struct Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(struct PTCacheEdit *edit); -struct Gwn_Batch *DRW_particles_batch_cache_get_edit_points(struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_particles_batch_cache_get_edit_tip_points(struct PTCacheEdit *edit); #endif /* __DRAW_CACHE_IMPL_H__ */ diff --git a/source/blender/draw/intern/draw_cache_impl_particles.c b/source/blender/draw/intern/draw_cache_impl_particles.c index 065628f3f68..0bf2ea4f26c 100644 --- a/source/blender/draw/intern/draw_cache_impl_particles.c +++ b/source/blender/draw/intern/draw_cache_impl_particles.c @@ -70,9 +70,13 @@ typedef struct ParticleBatchCache { int point_count; /* Control points when in edit mode. */ - Gwn_VertBuf *edit_pos; - Gwn_Batch *edit_points; - int edit_point_count; + Gwn_VertBuf *edit_inner_pos; + Gwn_Batch *edit_inner_points; + int edit_inner_point_count; + + Gwn_VertBuf *edit_tip_pos; + Gwn_Batch *edit_tip_points; + int edit_tip_point_count; /* Settings to determine if cache is invalid. */ bool is_dirty; @@ -153,8 +157,10 @@ static void particle_batch_cache_clear(ParticleSystem *psys) GWN_VERTBUF_DISCARD_SAFE(cache->pos); GWN_INDEXBUF_DISCARD_SAFE(cache->indices); - GWN_BATCH_DISCARD_SAFE(cache->edit_points); - GWN_VERTBUF_DISCARD_SAFE(cache->edit_pos); + GWN_BATCH_DISCARD_SAFE(cache->edit_inner_points); + GWN_VERTBUF_DISCARD_SAFE(cache->edit_inner_pos); + GWN_BATCH_DISCARD_SAFE(cache->edit_tip_points); + GWN_VERTBUF_DISCARD_SAFE(cache->edit_tip_pos); } void DRW_particle_batch_cache_free(ParticleSystem *psys) @@ -600,30 +606,42 @@ Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(PTCacheEdit *edit) return cache->hairs; } -static void ensure_edit_points_count(const PTCacheEdit *edit, - ParticleBatchCache *cache) +static void ensure_edit_inner_points_count(const PTCacheEdit *edit, + ParticleBatchCache *cache) { - if (cache->edit_pos != NULL) { + if (cache->edit_inner_pos != NULL) { return; } - cache->edit_point_count = 0; + cache->edit_inner_point_count = 0; for (int point_index = 0; point_index < edit->totpoint; point_index++) { const PTCacheEditPoint *point = &edit->points[point_index]; - cache->edit_point_count += point->totkey; + BLI_assert(point->totkey >= 1); + cache->edit_inner_point_count += (point->totkey - 1); } } -static void particle_batch_cache_ensure_edit_pos(PTCacheEdit *edit, - ParticleBatchCache *cache) +static void edit_colors_get(PTCacheEdit *edit, + float selected_color[4], + float normal_color[4]) { - if (cache->edit_pos != NULL) { + rgb_uchar_to_float(selected_color, edit->sel_col); + rgb_uchar_to_float(normal_color, edit->nosel_col); + selected_color[3] = 1.0f; + normal_color[3] = 1.0f; +} + +static void particle_batch_cache_ensure_edit_inner_pos( + PTCacheEdit *edit, + ParticleBatchCache *cache) +{ + if (cache->edit_inner_pos != NULL) { return; } static Gwn_VertFormat format = { 0 }; static unsigned pos_id, color_id; - GWN_VERTBUF_DISCARD_SAFE(cache->edit_pos); + GWN_VERTBUF_DISCARD_SAFE(cache->edit_inner_pos); if (format.attrib_ct == 0) { /* initialize vertex format */ @@ -631,43 +649,102 @@ static void particle_batch_cache_ensure_edit_pos(PTCacheEdit *edit, color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT); } - cache->edit_pos = GWN_vertbuf_create_with_format(&format); - GWN_vertbuf_data_alloc(cache->edit_pos, cache->edit_point_count); + cache->edit_inner_pos = GWN_vertbuf_create_with_format(&format); + GWN_vertbuf_data_alloc(cache->edit_inner_pos, cache->edit_inner_point_count); - /* Convert theme colors from uchar[3] to float[4]. */ - float selected_color[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - float normal_color[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - rgb_uchar_to_float(selected_color, edit->sel_col); - rgb_uchar_to_float(normal_color, edit->nosel_col); + float selected_color[4], normal_color[4]; + edit_colors_get(edit, selected_color, normal_color); int global_key_index = 0; for (int point_index = 0; point_index < edit->totpoint; point_index++) { const PTCacheEditPoint *point = &edit->points[point_index]; - for (int key_index = 0; key_index < point->totkey; key_index++) { + for (int key_index = 0; key_index < point->totkey - 1; key_index++) { PTCacheEditKey *key = &point->keys[key_index]; - GWN_vertbuf_attr_set(cache->edit_pos, pos_id, global_key_index, key->world_co); + GWN_vertbuf_attr_set(cache->edit_inner_pos, pos_id, global_key_index, key->world_co); if (key->flag & PEK_SELECT) { - GWN_vertbuf_attr_set(cache->edit_pos, color_id, global_key_index, selected_color); + GWN_vertbuf_attr_set(cache->edit_inner_pos, color_id, global_key_index, selected_color); } else { - GWN_vertbuf_attr_set(cache->edit_pos, color_id, global_key_index, normal_color); + GWN_vertbuf_attr_set(cache->edit_inner_pos, color_id, global_key_index, normal_color); } global_key_index++; } } } -Gwn_Batch *DRW_particles_batch_cache_get_edit_points(PTCacheEdit *edit) +Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(PTCacheEdit *edit) +{ + ParticleSystem *psys = edit->psys; + ParticleBatchCache *cache = particle_batch_cache_get(psys); + if (cache->edit_inner_points != NULL) { + return cache->edit_inner_points; + } + ensure_edit_inner_points_count(edit, cache); + particle_batch_cache_ensure_edit_inner_pos(edit, cache); + cache->edit_inner_points = GWN_batch_create(GWN_PRIM_POINTS, + cache->edit_inner_pos, + NULL); + return cache->edit_inner_points; +} + +static void ensure_edit_tip_points_count(const PTCacheEdit *edit, + ParticleBatchCache *cache) +{ + if (cache->edit_tip_pos != NULL) { + return; + } + cache->edit_tip_point_count = edit->totpoint; +} + +static void particle_batch_cache_ensure_edit_tip_pos( + PTCacheEdit *edit, + ParticleBatchCache *cache) +{ + if (cache->edit_tip_pos != NULL) { + return; + } + + static Gwn_VertFormat format = { 0 }; + static unsigned pos_id, color_id; + + GWN_VERTBUF_DISCARD_SAFE(cache->edit_tip_pos); + + if (format.attrib_ct == 0) { + /* initialize vertex format */ + pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT); + color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT); + } + + cache->edit_tip_pos = GWN_vertbuf_create_with_format(&format); + GWN_vertbuf_data_alloc(cache->edit_tip_pos, cache->edit_tip_point_count); + + float selected_color[4], normal_color[4]; + edit_colors_get(edit, selected_color, normal_color); + + for (int point_index = 0; point_index < edit->totpoint; point_index++) { + const PTCacheEditPoint *point = &edit->points[point_index]; + PTCacheEditKey *key = &point->keys[point->totkey - 1]; + GWN_vertbuf_attr_set(cache->edit_tip_pos, pos_id, point_index, key->world_co); + if (key->flag & PEK_SELECT) { + GWN_vertbuf_attr_set(cache->edit_tip_pos, color_id, point_index, selected_color); + } + else { + GWN_vertbuf_attr_set(cache->edit_tip_pos, color_id, point_index, normal_color); + } + } +} + +Gwn_Batch *DRW_particles_batch_cache_get_edit_tip_points(PTCacheEdit *edit) { ParticleSystem *psys = edit->psys; ParticleBatchCache *cache = particle_batch_cache_get(psys); - if (cache->edit_points != NULL) { - return cache->edit_points; - } - ensure_edit_points_count(edit, cache); - particle_batch_cache_ensure_edit_pos(edit, cache); - cache->edit_points = GWN_batch_create(GWN_PRIM_POINTS, - @@ 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