[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