[Bf-blender-cvs] [1ee5d08c952] blender2.8: Draw Manager: Add support for temporary matrix override.

Clément Foucault noreply at git.blender.org
Fri Jun 9 01:27:22 CEST 2017


Commit: 1ee5d08c952720227587138f436055c4fc42e9e9
Author: Clément Foucault
Date:   Thu Jun 8 20:19:42 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB1ee5d08c952720227587138f436055c4fc42e9e9

Draw Manager: Add support for temporary matrix override.

This allow to specify custom matrices for certain specific passes.

===================================================================

M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c

===================================================================

diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 12cdf04a826..ed308954fd9 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -198,6 +198,7 @@ void DRW_framebuffer_bind(struct GPUFrameBuffer *fb);
 void DRW_framebuffer_clear(bool color, bool depth, bool stencil, float clear_col[4], float clear_depth);
 void DRW_framebuffer_read_data(int x, int y, int w, int h, int channels, int slot, float *data);
 void DRW_framebuffer_texture_attach(struct GPUFrameBuffer *fb, struct GPUTexture *tex, int slot, int mip);
+void DRW_framebuffer_cubeface_attach(struct GPUFrameBuffer *fb, struct GPUTexture *tex, int slot, int face, int mip);
 void DRW_framebuffer_texture_detach(struct GPUTexture *tex);
 void DRW_framebuffer_blit(struct GPUFrameBuffer *fb_read, struct GPUFrameBuffer *fb_write, bool depth);
 void DRW_framebuffer_viewport_size(struct GPUFrameBuffer *UNUSED(fb_read), int w, int h);
@@ -314,7 +315,7 @@ void DRW_pass_foreach_shgroup(DRWPass *pass, void (*callback)(void *userData, DR
 
 /* Viewport */
 typedef enum {
-	DRW_MAT_PERS,
+	DRW_MAT_PERS = 0,
 	DRW_MAT_PERSINV,
 	DRW_MAT_VIEW,
 	DRW_MAT_VIEWINV,
@@ -324,6 +325,8 @@ typedef enum {
 
 void DRW_viewport_init(const bContext *C);
 void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type);
+void DRW_viewport_matrix_override_set(float mat[4][4], DRWViewportMatrixType type);
+void DRW_viewport_matrix_override_unset(DRWViewportMatrixType type);
 const float *DRW_viewport_size_get(void);
 const float *DRW_viewport_screenvecs_get(void);
 const float *DRW_viewport_pixelsize_get(void);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index e85de5da859..1edfcd3c1ed 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -300,6 +300,11 @@ static struct DRWGlobalState {
 	ListBase enabled_engines; /* RenderEngineType */
 } DST = {NULL};
 
+static struct DRWMatrixOveride {
+	float mat[6][4][4];
+	bool override[6];
+} viewport_matrix_override = {0};
+
 ListBase DRW_engines = {NULL, NULL};
 
 #ifdef USE_GPU_SELECT
@@ -1506,17 +1511,42 @@ static void draw_geometry_prepare(
 	bool do_eye = (interface->eye != -1);
 	bool do_orco = (interface->orcotexfac != -1) && (texcoloc != NULL) && (texcosize != NULL);
 
+	/* Matrix override */
+	float (*persmat)[4];
+	float (*persinv)[4];
+	float (*viewmat)[4];
+	float (*viewinv)[4];
+	float (*winmat)[4];
+	float (*wininv)[4];
+
+	persmat = (viewport_matrix_override.override[DRW_MAT_PERS])
+	          ? viewport_matrix_override.mat[DRW_MAT_PERS] : rv3d->persmat;
+	persinv = (viewport_matrix_override.override[DRW_MAT_PERSINV])
+	          ? viewport_matrix_override.mat[DRW_MAT_PERSINV] : rv3d->persinv;
+	viewmat = (viewport_matrix_override.override[DRW_MAT_VIEW])
+	          ? viewport_matrix_override.mat[DRW_MAT_VIEW] : rv3d->viewmat;
+	viewinv = (viewport_matrix_override.override[DRW_MAT_VIEWINV])
+	          ? viewport_matrix_override.mat[DRW_MAT_VIEWINV] : rv3d->viewinv;
+	winmat = (viewport_matrix_override.override[DRW_MAT_WIN])
+	          ? viewport_matrix_override.mat[DRW_MAT_WIN] : rv3d->winmat;
+
 	if (do_pi) {
-		invert_m4_m4(pi, rv3d->winmat);
+		if (viewport_matrix_override.override[DRW_MAT_WININV]) {
+			wininv = viewport_matrix_override.mat[DRW_MAT_WININV];
+		}
+		else {
+			invert_m4_m4(pi, winmat);
+			wininv = pi;
+		}
 	}
 	if (do_mi) {
 		invert_m4_m4(mi, obmat);
 	}
 	if (do_mvp) {
-		mul_m4_m4m4(mvp, rv3d->persmat, obmat);
+		mul_m4_m4m4(mvp, persmat, obmat);
 	}
 	if (do_mv || do_mvi || do_n || do_eye) {
-		mul_m4_m4m4(mv, rv3d->viewmat, obmat);
+		mul_m4_m4m4(mv, viewmat, obmat);
 	}
 	if (do_mvi) {
 		invert_m4_m4(mvi, mv);
@@ -1558,22 +1588,22 @@ static void draw_geometry_prepare(
 		GPU_shader_uniform_vector(shgroup->shader, interface->modelviewprojection, 16, 1, (float *)mvp);
 	}
 	if (interface->viewinverse != -1) {
-		GPU_shader_uniform_vector(shgroup->shader, interface->viewinverse, 16, 1, (float *)rv3d->viewinv);
+		GPU_shader_uniform_vector(shgroup->shader, interface->viewinverse, 16, 1, (float *)viewinv);
 	}
 	if (interface->viewprojection != -1) {
-		GPU_shader_uniform_vector(shgroup->shader, interface->viewprojection, 16, 1, (float *)rv3d->persmat);
+		GPU_shader_uniform_vector(shgroup->shader, interface->viewprojection, 16, 1, (float *)persmat);
 	}
 	if (interface->viewprojectioninverse != -1) {
-		GPU_shader_uniform_vector(shgroup->shader, interface->viewprojectioninverse, 16, 1, (float *)rv3d->persinv);
+		GPU_shader_uniform_vector(shgroup->shader, interface->viewprojectioninverse, 16, 1, (float *)persinv);
 	}
 	if (interface->projection != -1) {
-		GPU_shader_uniform_vector(shgroup->shader, interface->projection, 16, 1, (float *)rv3d->winmat);
+		GPU_shader_uniform_vector(shgroup->shader, interface->projection, 16, 1, (float *)winmat);
 	}
 	if (interface->projectioninverse != -1) {
-		GPU_shader_uniform_vector(shgroup->shader, interface->projectioninverse, 16, 1, (float *)pi);
+		GPU_shader_uniform_vector(shgroup->shader, interface->projectioninverse, 16, 1, (float *)wininv);
 	}
 	if (interface->view != -1) {
-		GPU_shader_uniform_vector(shgroup->shader, interface->view, 16, 1, (float *)rv3d->viewmat);
+		GPU_shader_uniform_vector(shgroup->shader, interface->view, 16, 1, (float *)viewmat);
 	}
 	if (interface->modelview != -1) {
 		GPU_shader_uniform_vector(shgroup->shader, interface->modelview, 16, 1, (float *)mv);
@@ -2234,6 +2264,17 @@ void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type)
 	}
 }
 
+void DRW_viewport_matrix_override_set(float mat[4][4], DRWViewportMatrixType type)
+{
+	copy_m4_m4(viewport_matrix_override.mat[type], mat);
+	viewport_matrix_override.override[type] = true;
+}
+
+void DRW_viewport_matrix_override_unset(DRWViewportMatrixType type)
+{
+	viewport_matrix_override.override[type] = false;
+}
+
 bool DRW_viewport_is_persp_get(void)
 {
 	RegionView3D *rv3d = DST.draw_ctx.rv3d;




More information about the Bf-blender-cvs mailing list