Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jbakker>2020-05-14 13:42:52 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2020-05-14 13:43:14 +0300
commit80fffba132c58c0c4187b2905f7700f4597aa5c2 (patch)
tree3b543e62e9b466bc57246a31eadb74808fb9740f
parenta88316b4a6e93bdda210ec050928fd2e2eee0d5e (diff)
Fix T76729: Particle Hair Get Occluded by Overlays
When using an external render engine Blender will still draw an OpenGL depth buffer for the overlay engine to work correctly. Particle systems were ignored, what lead to occluded hair and other artifacts. Reviewed By: Clément Foucault Differential Revision: https://developer.blender.org/D7730
m---------release/datafiles/locale0
m---------release/scripts/addons0
-rw-r--r--source/blender/draw/engines/external/external_engine.c20
3 files changed, 20 insertions, 0 deletions
diff --git a/release/datafiles/locale b/release/datafiles/locale
-Subproject 80f390fd0e20d7e2aadf07c43a45717e810fa10
+Subproject 1d9b8b2ffa67a8832073acf316150b2dfaa2db0
diff --git a/release/scripts/addons b/release/scripts/addons
-Subproject 44c17b01168ea180d7ea865e9ec1ef6e93097b3
+Subproject 590710871b7b2e1f7f50bb622f1409b794ad38c
diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c
index ee4bd58ab80..7dddbd07623 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -25,10 +25,12 @@
#include "DRW_render.h"
+#include "DNA_modifier_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "ED_screen.h"
@@ -166,6 +168,24 @@ static void external_cache_populate(void *vedata, Object *ob)
return;
}
+ if (ob->type == OB_MESH && ob->modifiers.first != NULL) {
+ LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
+ if (md->type != eModifierType_ParticleSystem) {
+ continue;
+ }
+ ParticleSystem *psys = ((ParticleSystemModifierData *)md)->psys;
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
+ continue;
+ }
+ ParticleSettings *part = psys->part;
+ const int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
+
+ if (draw_as == PART_DRAW_PATH) {
+ struct GPUBatch *hairs = DRW_cache_particles_get_hair(ob, psys, NULL);
+ DRW_shgroup_call(stl->g_data->depth_shgrp, hairs, NULL);
+ }
+ }
+ }
struct GPUBatch *geom = DRW_cache_object_surface_get(ob);
if (geom) {
/* Depth Prepass */