[Bf-blender-cvs] [0ac09ed0dae] hair_guides: Merge branch 'blender2.8' into hair_guides
Lukas Tönne
noreply at git.blender.org
Sun May 13 11:20:22 CEST 2018
Commit: 0ac09ed0dae7e57c7eb559905c6b296a7259d067
Author: Lukas Tönne
Date: Sun May 13 10:20:05 2018 +0100
Branches: hair_guides
https://developer.blender.org/rB0ac09ed0dae7e57c7eb559905c6b296a7259d067
Merge branch 'blender2.8' into hair_guides
===================================================================
===================================================================
diff --cc source/blender/blenkernel/CMakeLists.txt
index 2f261a6c95d,d5ce6f2f94d..257aec55bf3
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@@ -146,7 -144,7 +147,8 @@@ set(SR
intern/mesh_mapping.c
intern/mesh_merge.c
intern/mesh_remap.c
+ intern/mesh_runtime.c
+ intern/mesh_sample.c
intern/mesh_tangent.c
intern/mesh_validate.c
intern/modifier.c
diff --cc source/blender/draw/engines/eevee/eevee_materials.c
index c2d860eb624,304baff6672..e35f601f1f2
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@@ -1340,178 -1290,6 +1340,179 @@@ static void material_transparent
}
}
+static void material_particle_hair(
+ EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *sldata,
+ Object *ob,
+ ParticleSystem *psys,
+ ModifierData *md)
+{
+ EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
+ EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ Scene *scene = draw_ctx->scene;
+ GHash *material_hash = stl->g_data->hair_material_hash;
+
+ if (!psys_check_enabled(ob, psys, false)) {
+ return;
+ }
-
+ ParticleSettings *part = psys->part;
- float mat[4][4];
- unit_m4(mat);
-
- bool use_hair = false;
- struct Gwn_Batch *hair_geom = NULL;
- {
- int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
- if (draw_as == PART_DRAW_PATH && (psys->pathcache || psys->childcache)) {
- use_hair = true;
- hair_geom = DRW_cache_particles_get_hair(psys, md);
- }
++ int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
++ if (draw_as != PART_DRAW_PATH || (psys->pathcache == NULL && psys->childcache == NULL)) {
++ return;
+ }
-
- if (use_hair) {
- Material *ma = give_current_material(ob, part->omat);
- if (ma == NULL) {
- ma = &defmaterial;
- }
-
- DRW_shgroup_call_add(stl->g_data->depth_shgrp, hair_geom, mat);
- DRW_shgroup_call_add(stl->g_data->depth_shgrp_clip, hair_geom, mat);
-
- DRWShadingGroup *shgrp = BLI_ghash_lookup(material_hash, (const void *)ma);
- if (!shgrp) {
- float *color_p = &ma->r;
- float *metal_p = &ma->ray_mirror;
- float *spec_p = &ma->spec;
- float *rough_p = &ma->gloss_mir;
-
- if (ma->use_nodes && ma->nodetree) {
- struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma, false, sldata->lamps->shadow_method);
-
- shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass);
- if (shgrp) {
++ struct Gwn_Batch *hair_geom = DRW_cache_particles_get_hair(psys, md);
++ DRWShadingGroup *shgrp = NULL;
++ Material *ma = give_current_material(ob, part->omat);
++
++ if (ma == NULL) {
++ ma = &defmaterial;
++ }
++
++ float *color_p = &ma->r;
++ float *metal_p = &ma->ray_mirror;
++ float *spec_p = &ma->spec;
++ float *rough_p = &ma->gloss_mir;
++
++ DRW_shgroup_call_add(stl->g_data->depth_shgrp, hair_geom, NULL);
++ DRW_shgroup_call_add(stl->g_data->depth_shgrp_clip, hair_geom, NULL);
++
++ shgrp = BLI_ghash_lookup(material_hash, (const void *)ma);
++
++ if (shgrp) {
++ DRW_shgroup_call_add(shgrp, hair_geom, NULL);
++ }
++ else {
++ if (ma->use_nodes && ma->nodetree) {
++ static float half = 0.5f;
++ static float error_col[3] = {1.0f, 0.0f, 1.0f};
++ static float compile_col[3] = {0.5f, 0.5f, 0.5f};
++ struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma, sldata->lamps->shadow_method, false);
++
++ switch (GPU_material_status(gpumat)) {
++ case GPU_MAT_SUCCESS:
++ {
++ shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass);
+ add_standard_uniforms(shgrp, sldata, vedata, NULL, NULL, false, false);
-
- BLI_ghash_insert(material_hash, ma, shgrp);
++ break;
+ }
- else {
- /* Shader failed : pink color */
- static float col[3] = {1.0f, 0.0f, 1.0f};
- static float half = 0.5f;
-
- color_p = col;
++ case GPU_MAT_QUEUED:
++ {
++ sldata->probes->all_materials_updated = false;
++ color_p = compile_col;
+ metal_p = spec_p = rough_p = ½
++ break;
+ }
- }
-
- /* Fallback to default shader */
- if (shgrp == NULL) {
- bool use_ssr = ((stl->effects->enabled_effects & EFFECT_SSR) != 0);
- shgrp = EEVEE_default_shading_group_get(sldata, vedata, true, false, false, use_ssr,
- sldata->lamps->shadow_method);
- DRW_shgroup_uniform_vec3(shgrp, "basecol", color_p, 1);
- DRW_shgroup_uniform_float(shgrp, "metallic", metal_p, 1);
- DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1);
- DRW_shgroup_uniform_float(shgrp, "roughness", rough_p, 1);
-
- BLI_ghash_insert(material_hash, ma, shgrp);
++ case GPU_MAT_FAILED:
++ default:
++ color_p = error_col;
++ metal_p = spec_p = rough_p = ½
++ break;
+ }
+ }
-
- if (shgrp) {
- DRW_shgroup_call_add(shgrp, hair_geom, mat);
++
++ /* Fallback to default shader */
++ if (shgrp == NULL) {
++ bool use_ssr = ((stl->effects->enabled_effects & EFFECT_SSR) != 0);
++ shgrp = EEVEE_default_shading_group_get(sldata, vedata, true, false, false, use_ssr,
++ sldata->lamps->shadow_method);
++ DRW_shgroup_uniform_vec3(shgrp, "basecol", color_p, 1);
++ DRW_shgroup_uniform_float(shgrp, "metallic", metal_p, 1);
++ DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1);
++ DRW_shgroup_uniform_float(shgrp, "roughness", rough_p, 1);
+ }
++
++ DRW_shgroup_call_add(shgrp, hair_geom, NULL);
++ BLI_ghash_insert(material_hash, ma, shgrp);
+ }
+}
+
+static void material_hair(
+ EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *sldata,
+ Object *ob,
+ HairSystem *hsys,
+ DerivedMesh *scalp)
+{
+ EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
+ EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ Scene *scene = draw_ctx->scene;
+ GHash *material_hash = stl->g_data->hair_material_hash;
+ /* TODO */
+ const int subdiv = 0;
+ float mat[4][4];
+ copy_m4_m4(mat, ob->obmat);
+
+ const DRWHairFiberTextureBuffer *fiber_buffer = NULL;
+ struct Gwn_Batch *hair_geom = DRW_cache_hair_get_fibers(hsys, scalp, subdiv, &fiber_buffer);
+
+ if (!hsys->draw_texture_cache) {
+ hsys->draw_texture_cache = DRW_texture_create_2D(fiber_buffer->width, fiber_buffer->height,
+ GPU_RG32F, 0, fiber_buffer->data);
+ }
+ GPUTexture **fiber_texture = (GPUTexture **)(&hsys->draw_texture_cache);
+
+ Material *ma = give_current_material(ob, hsys->material_index);
+ if (ma == NULL) {
+ ma = &defmaterial;
+ }
+
+ DRW_shgroup_call_add(stl->g_data->hair_fibers_depth_shgrp, hair_geom, mat);
+ DRW_hair_shader_uniforms(stl->g_data->hair_fibers_depth_shgrp, scene,
+ fiber_texture, fiber_buffer);
+
+ DRW_shgroup_call_add(stl->g_data->hair_fibers_depth_shgrp_clip, hair_geom, mat);
+ DRW_hair_shader_uniforms(stl->g_data->hair_fibers_depth_shgrp_clip, scene,
+ fiber_texture, fiber_buffer);
+
+ DRWShadingGroup *shgrp = BLI_ghash_lookup(material_hash, (const void *)ma);
+ if (!shgrp) {
+ float *color_p = &ma->r;
+ float *metal_p = &ma->ray_mirror;
+ float *spec_p = &ma->spec;
+ float *rough_p = &ma->gloss_mir;
+
+ if (ma->use_nodes && ma->nodetree) {
+ struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma, sldata->lamps->shadow_method, true);
+
+ shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass);
+ if (shgrp) {
+ add_standard_uniforms(shgrp, sldata, vedata, NULL, NULL, false, false);
+ BLI_ghash_insert(material_hash, ma, shgrp);
+ }
+ else {
+ /* Shader failed : pink color */
+ static float col[3] = {1.0f, 0.0f, 1.0f};
+ static float half = 0.5f;
+
+ color_p = col;
+ metal_p = spec_p = rough_p = ½
+ }
+ }
+
+ /* Fallback to default shader */
+ if (shgrp == NULL) {
+ bool use_ssr = ((stl->effects->enabled_effects & EFFECT_SSR) != 0);
+ shgrp = EEVEE_default_shading_group_get(sldata, vedata, true, true, false, use_ssr,
+ sldata->lamps->shadow_method);
+ DRW_shgroup_uniform_vec3(shgrp, "basecol", color_p, 1);
+ DRW_shgroup_uniform_float(shgrp, "metallic", metal_p, 1);
+ DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1);
+ DRW_shgroup_uniform_float(shgrp, "roughness", rough_p, 1);
+
+ BLI_ghash_insert(material_hash, ma, shgrp);
+ }
+ }
+
+ if (shgrp) {
+ DRW_shgroup_call_add(shgrp, hair_geom, mat);
+
+ DRW_hair_shader_uniforms(shgrp, scene,
+ fiber_texture, fiber_buffer);
+ }
+}
+
void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob, bool *cast_shadow)
{
EEVEE_PassList *psl = vedata->psl;
@@@ -1694,15 -1472,84 +1695,15 @@@
}
if (ob->type == OB_MESH) {
- if (ob != draw_ctx->object_edit) {
+ if (DRW_check_particles_visible_within_active_context(ob)) {
- material_hash = stl->g_data->hair_material_hash;
for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
- if (md->type != eModifierType_ParticleSystem) {
- continue;
- }
- ParticleSystem *psys = ((ParticleSystemModifierData *)md)->psys;
- if (!psys_check_enabled(ob, psys, false)) {
- continue;
- }
- ParticleSettings *part = psys->part;
- int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
- if (draw_as != PART_DRAW_PATH || (psys->pathcache == NULL && psys->childcache == NULL)) {
- continue;
- }
- struct Gwn_Batch *hair_geom = DRW_cache_particles_get_hair(psys, md);
- DRWShadingGroup *shgrp = NULL;
- Material *ma = give_current_material(ob, part->omat);
-
- if (ma == NULL) {
- ma = &defmaterial;
- }
-
- float *color_p = &ma->r;
- float *metal_p = &ma->ray_mirror;
- float *spec_p = &ma->spec;
- float *rough_p = &ma->gloss_mir;
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list