[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