[Bf-blender-cvs] [a098d02718c] blender2.8: Eevee: Transparency: Add object center Z sorting.
Clément Foucault
noreply at git.blender.org
Tue Jul 11 12:46:11 CEST 2017
Commit: a098d02718c64ed34838914bac19aebba76c5e4e
Author: Clément Foucault
Date: Mon Jul 10 14:45:19 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBa098d02718c64ed34838914bac19aebba76c5e4e
Eevee: Transparency: Add object center Z sorting.
Better algo should take bounding box center, but it's not referenced yet in the draw call and cannot be tweaked by user.
===================================================================
M source/blender/draw/engines/eevee/eevee_engine.c
M source/blender/draw/intern/DRW_render.h
M source/blender/draw/intern/draw_manager.c
===================================================================
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index c8f85d3ae87..dd45d87b6e1 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -161,6 +161,7 @@ static void EEVEE_draw_scene(void *vedata)
EEVEE_effects_do_volumetrics(sldata, vedata);
/* Transparent */
+ DRW_pass_sort_shgroup_z(psl->transparent_pass);
DRW_draw_pass(psl->transparent_pass);
/* Post Process */
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index eeebfd93f40..51145b15237 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -319,6 +319,7 @@ void DRW_shgroup_uniform_mat4(DRWShadingGroup *shgroup, const char *name, const
/* Passes */
DRWPass *DRW_pass_create(const char *name, DRWState state);
void DRW_pass_foreach_shgroup(DRWPass *pass, void (*callback)(void *userData, DRWShadingGroup *shgrp), void *userData);
+void DRW_pass_sort_shgroup_z(DRWPass *pass);
/* Viewport */
typedef enum {
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 049aac349af..ef000a4f791 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1263,6 +1263,44 @@ void DRW_pass_foreach_shgroup(DRWPass *pass, void (*callback)(void *userData, DR
}
}
+typedef struct ZSortData {
+ float *axis;
+ float *origin;
+} ZSortData;
+
+static int pass_shgroup_dist_sort(void *thunk, const void *a, const void *b)
+{
+ const DRWCall *call_a = (DRWCall *)((const DRWShadingGroup *)a)->calls.first;
+ const DRWCall *call_b = (DRWCall *)((const DRWShadingGroup *)b)->calls.first;
+ const ZSortData *zsortdata = (ZSortData *)thunk;
+
+ float tmp[3];
+ sub_v3_v3v3(tmp, zsortdata->origin, call_a->obmat[3]);
+ const float a_sq = dot_v3v3(zsortdata->axis, tmp);
+ sub_v3_v3v3(tmp, zsortdata->origin, call_b->obmat[3]);
+ const float b_sq = dot_v3v3(zsortdata->axis, tmp);
+
+ if (a_sq < b_sq) return 1;
+ else if (a_sq > b_sq) return -1;
+ else return 0;
+}
+
+/**
+ * Sort Shading groups by decreasing Z between
+ * the first call object center and a given world space point.
+ **/
+void DRW_pass_sort_shgroup_z(DRWPass *pass)
+{
+ RegionView3D *rv3d = DST.draw_ctx.rv3d;
+
+ float (*viewinv)[4];
+ viewinv = (viewport_matrix_override.override[DRW_MAT_VIEWINV])
+ ? viewport_matrix_override.mat[DRW_MAT_VIEWINV] : rv3d->viewinv;
+
+ ZSortData zsortdata = {viewinv[2], viewinv[3]};
+ BLI_listbase_sort_r(&pass->shgroups, pass_shgroup_dist_sort, &zsortdata);
+}
+
/** \} */
More information about the Bf-blender-cvs
mailing list