[Bf-blender-cvs] [6a81f686eb1] hair_object: Draw function for hair follicles.
Lukas Tönne
noreply at git.blender.org
Sun Sep 23 10:31:39 CEST 2018
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. @@
More information about the Bf-blender-cvs
mailing list