[Bf-blender-cvs] [dec92e6ba1a] hair_guides hair_guides_grooming: Backport hair drawing improvements and workbench support from the grooming branch.
Lukas Tönne
noreply at git.blender.org
Fri Jun 15 07:49:15 CEST 2018
Commit: dec92e6ba1a1944c642ded967d7f65fc5d8e704a
Author: Lukas Tönne
Date: Fri Jun 15 06:45:51 2018 +0100
Branches: hair_guides hair_guides_grooming
https://developer.blender.org/rBdec92e6ba1a1944c642ded967d7f65fc5d8e704a
Backport hair drawing improvements and workbench support from the grooming branch.
===================================================================
M intern/cycles/blender/blender_mesh.cpp
M source/blender/blenkernel/BKE_hair.h
M source/blender/blenkernel/intern/hair.c
M source/blender/blenkernel/intern/hair_draw.c
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/eevee/eevee_materials.c
D source/blender/draw/engines/eevee/shaders/hair_lib.glsl
M source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
M source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M source/blender/draw/engines/workbench/workbench_deferred.c
M source/blender/draw/engines/workbench/workbench_forward.c
M source/blender/draw/engines/workbench/workbench_materials.c
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/intern/draw_common.h
M source/blender/draw/intern/draw_hair.c
M source/blender/draw/intern/draw_hair_fibers.c
A source/blender/draw/modes/shaders/common_hair_guides_lib.glsl
M source/blender/makesdna/DNA_hair_types.h
M source/blender/makesrna/intern/rna_hair.c
M source/blender/makesrna/intern/rna_modifier.c
===================================================================
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 6fe650f3699..1fd47056c33 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -1203,14 +1203,16 @@ Mesh *BlenderSync::sync_mesh(BL::Depsgraph& b_depsgraph,
create_mesh_volume_attributes(scene, b_ob, mesh, b_scene.frame_current());
}
+ }
- if(view_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
- sync_curves(mesh, b_mesh, b_ob, false);
+ if(view_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
+ sync_curves(mesh, b_mesh, b_ob, false);
- if(can_free_caches) {
- b_ob.cache_release();
- }
+ if(can_free_caches) {
+ b_ob.cache_release();
+ }
+ if(b_mesh) {
/* free derived mesh */
b_data.meshes.remove(b_mesh, false, true, false);
}
diff --git a/source/blender/blenkernel/BKE_hair.h b/source/blender/blenkernel/BKE_hair.h
index cad25348e43..73f8e3d9c12 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -65,7 +65,8 @@ void BKE_hair_guide_curves_begin(struct HairSystem *hsys, int totcurves);
* \param mesh_sample Origin of the guide curve on the scalp mesh.
* \param numverts Number of vertices in this guide curve
*/
-void BKE_hair_set_guide_curve(struct HairSystem *hsys, int index, const struct MeshSample *mesh_sample, int numverts);
+void BKE_hair_set_guide_curve(struct HairSystem *hsys, int index, const struct MeshSample *mesh_sample, int numverts,
+ float taper_length, float taper_thickness);
/* Finalize guide curve update */
void BKE_hair_guide_curves_end(struct HairSystem *hsys);
@@ -130,13 +131,17 @@ void BKE_hair_draw_settings_free(struct HairDrawSettings *draw_settings);
/* Intermediate data for export */
typedef struct HairExportCache
{
+ /* Per guide curve data */
int totguidecurves;
- int totguideverts;
struct HairGuideCurve *guide_curves;
+
+ /* Per guide vertex data */
+ int totguideverts;
struct HairGuideVertex *guide_verts;
float (*guide_tangents)[3]; /* Tangent vectors on guide curves */
float (*guide_normals)[3]; /* Normal vectors on guide curves */
+ /* Per fiber data */
int totfibercurves;
int totfiberverts;
int *fiber_numverts; /* Number of vertices in each fiber */
diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index cca003142da..70ae53b58c8 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -228,13 +228,16 @@ void BKE_hair_guide_curves_begin(HairSystem *hsys, int totcurves)
}
}
-void BKE_hair_set_guide_curve(HairSystem *hsys, int index, const MeshSample *mesh_sample, int numverts)
+void BKE_hair_set_guide_curve(HairSystem *hsys, int index, const MeshSample *mesh_sample, int numverts,
+ float taper_length, float taper_thickness)
{
BLI_assert(index <= hsys->guides.totcurves);
HairGuideCurve *curve = &hsys->guides.curves[index];
memcpy(&curve->mesh_sample, mesh_sample, sizeof(MeshSample));
curve->numverts = numverts;
+ curve->taper_length = taper_length;
+ curve->taper_thickness = taper_thickness;
hsys->flag |= HAIR_SYSTEM_UPDATE_FOLLICLE_BINDING;
BKE_hair_batch_cache_dirty(hsys, BKE_HAIR_BATCH_DIRTY_ALL);
@@ -672,7 +675,7 @@ int BKE_hair_export_cache_update(HairExportCache *cache, const HairSystem *hsys,
const HairGuideCurve *curve_orig = &hsys->guides.curves[i];
HairGuideCurve *curve = &cache->guide_curves[i];
- memcpy(&curve->mesh_sample, &curve_orig->mesh_sample, sizeof(MeshSample));
+ memcpy(curve, curve_orig, sizeof(HairGuideCurve));
curve->numverts = hair_get_strand_subdiv_length(curve_orig->numverts, subdiv);
curve->vertstart = totguideverts;
diff --git a/source/blender/blenkernel/intern/hair_draw.c b/source/blender/blenkernel/intern/hair_draw.c
index 4135c7833c1..18b81b243d2 100644
--- a/source/blender/blenkernel/intern/hair_draw.c
+++ b/source/blender/blenkernel/intern/hair_draw.c
@@ -48,7 +48,13 @@ HairDrawSettings* BKE_hair_draw_settings_new(void)
{
HairDrawSettings *draw_settings = MEM_callocN(sizeof(HairDrawSettings), "hair draw settings");
- draw_settings->follicle_mode = HAIR_DRAW_FOLLICLE_NONE;
+ draw_settings->follicle_mode = HAIR_DRAW_FOLLICLE_POINTS;
+ draw_settings->guide_mode = HAIR_DRAW_GUIDE_CURVES;
+ draw_settings->shape_flag = HAIR_DRAW_CLOSE_TIP;
+ draw_settings->shape = 0.0f;
+ draw_settings->root_radius = 1.0f;
+ draw_settings->tip_radius = 0.0f;
+ draw_settings->radius_scale = 0.01f;
return draw_settings;
}
@@ -78,13 +84,17 @@ typedef struct HairStrandVertexTextureBuffer {
float co[3];
float nor[3];
float tang[3];
- int pad;
+ float len;
} HairStrandVertexTextureBuffer;
BLI_STATIC_ASSERT_ALIGN(HairStrandVertexTextureBuffer, 8)
typedef struct HairStrandMapTextureBuffer {
unsigned int vertex_start;
unsigned int vertex_count;
+
+ /* Shape attributes */
+ float taper_length; /* Distance at which final thickness is reached */
+ float taper_thickness; /* Relative thickness of the strand */
} HairStrandMapTextureBuffer;
BLI_STATIC_ASSERT_ALIGN(HairStrandMapTextureBuffer, 8)
@@ -103,12 +113,21 @@ static void hair_get_strand_buffer(
smap->vertex_start = curve->vertstart;
smap->vertex_count = curve->numverts;
+ smap->taper_length = curve->taper_length;
+ smap->taper_thickness = curve->taper_thickness;
+ float len = 0.0f;
for (int j = 0; j < curve->numverts; ++j)
{
copy_v3_v3(svert[j].co, verts[j].co);
copy_v3_v3(svert[j].tang, tangents[j]);
copy_v3_v3(svert[j].nor, normals[j]);
+
+ if (j > 0)
+ {
+ len += len_v3v3(verts[j-1].co, verts[j].co);
+ }
+ svert[j].len = len;
}
}
}
@@ -183,7 +202,7 @@ void BKE_hair_batch_cache_free(HairSystem* hsys)
/* === Fiber Curve Interpolation === */
/* NOTE: Keep this code in sync with the GLSL version!
- * see hair_lib.glsl
+ * see common_hair_guides_lib.glsl
*/
static void interpolate_parent_curve(
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 6743bea350b..6d2d273e497 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -163,7 +163,6 @@ data_to_c_simple(engines/eevee/shaders/default_world_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/background_vert.glsl SRC)
data_to_c_simple(engines/eevee/shaders/concentric_samples_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/common_uniforms_lib.glsl SRC)
-data_to_c_simple(engines/eevee/shaders/hair_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lamps_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lightprobe_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl SRC)
@@ -243,6 +242,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_world_light_lib.glsl SRC)
data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC)
data_to_c_simple(modes/shaders/common_hair_lib.glsl SRC)
+data_to_c_simple(modes/shaders/common_hair_guides_lib.glsl SRC)
data_to_c_simple(modes/shaders/common_hair_refine_vert.glsl SRC)
data_to_c_simple(modes/shaders/common_view_lib.glsl SRC)
data_to_c_simple(modes/shaders/common_fxaa_lib.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index a511cc3f994..a356c30aece 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -92,6 +92,7 @@ extern char datatoc_bsdf_direct_lib_glsl[];
extern char datatoc_bsdf_sampling_lib_glsl[];
extern char datatoc_common_uniforms_lib_glsl[];
extern char datatoc_common_hair_lib_glsl[];
+extern char datatoc_common_hair_guides_lib_glsl[];
extern char datatoc_common_view_lib_glsl[];
extern char datatoc_irradiance_lib_glsl[];
extern char datatoc_octahedron_lib_glsl[];
@@ -108,7 +109,6 @@ extern char datatoc_volumetric_vert_glsl[];
extern char datatoc_volumetric_geom_glsl[];
extern char datatoc_volumetric_frag_glsl[];
extern char datatoc_volumetric_lib_glsl[];
-extern char datatoc_hair_lib_glsl[];
extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
@@ -591,7 +591,7 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, E
e_data.vert_shader_str = BLI_string_joinN(
datatoc_common_view_lib_glsl,
datatoc_common_hair_lib_glsl,
- datatoc_hair_lib_glsl,
+ datatoc_common_hair_guides_lib_glsl,
datatoc_lit_surface_vert_glsl);
e_data.default_background = DRW_shader_create(
@@ -613,7 +613,7 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, E
char *hair_fiber_vert_str = BLI_string_joinN(
datatoc_common_view_lib_glsl,
datatoc_common_hair_lib_glsl,
- datatoc_hair_lib_glsl,
+ datatoc_common_hair_guides_lib_glsl,
datatoc_prepass_vert_glsl);
e_data.default_prepass_hair_fiber_sh = DRW_shader_create(
@@ -1533,6 +1533,8 @@ static void material_hair(
EEVEE_ViewLayerData *sldata,
Object *ob,
HairSystem *hsys,
+ const HairDrawSettings *draw_set,
+ Material *ma,
struct Mesh *scalp)
{
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
@@ -1543,16 +1545,15 @@ static void material_hair(
float mat[4][4];
copy_m4_m4(mat, ob->obmat);
- Material *ma = give_current_material(ob, hsys->material_index);
if (ma == NULL) {
ma = &defmaterial;
}
{
- /*DRWShadingGroup *shgrp =*/ DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, psl->depth_pass, e_data.default_prepass_hair_fiber_sh);
+ /*DRWShadingGroup *shgrp =*/ DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, draw_set, psl->depth_pass, e_data.default_prepass_hair_fiber_sh);
}
{
- DRWShadingGroup *shgrp = DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, psl->depth_pass_clip, e_data.default_prepass_hair_fiber_clip_sh);
+ DRWShadingGroup *shgrp = DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, draw_set, psl->depth_pass_clip, e_data.defaul
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list