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:
authorClément Foucault <foucault.clem@gmail.com>2017-06-16 14:27:09 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-06-19 11:47:56 +0300
commit9a040fa3d4af2c2d4f51eafd3ce88c1f60ffc3a9 (patch)
tree2f04ff2c75ec5c0d777d93e9cf52cca5e07c7ce8 /source/blender
parent8a10fa1c530a0981301d0459a7a697c27a685c48 (diff)
DrwManager: Add the possibility to invert backfacing.
This is done in order to support planar reflection rendering.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/draw/intern/DRW_render.h1
-rw-r--r--source/blender/draw/intern/draw_manager.c18
2 files changed, 17 insertions, 2 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 3c368944320..e49a6ab7926 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -363,6 +363,7 @@ void DRW_draw_region_engine_info(void);
void DRW_state_reset_ex(DRWState state);
void DRW_state_reset(void);
+void DRW_state_invert_facing(void);
/* Selection */
void DRW_select_load_id(unsigned int id);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 9483a55ec40..90a3aaa84d5 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -290,6 +290,8 @@ static struct DRWGlobalState {
float screenvecs[2][3];
float pixsize;
+ GLenum backface, frontface;
+
struct {
unsigned int is_select : 1;
unsigned int is_depth : 1;
@@ -1792,7 +1794,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
/* Negative scale objects */
if (neg_scale) {
- glFrontFace(GL_CW);
+ glFrontFace(DST.backface);
}
GPU_SELECT_LOAD_IF_PICKSEL(call);
@@ -1809,7 +1811,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
/* Reset state */
if (neg_scale) {
- glFrontFace(GL_CCW);
+ glFrontFace(DST.frontface);
}
}
}
@@ -1901,6 +1903,13 @@ void DRW_state_reset(void)
DRW_state_reset_ex(DRW_STATE_DEFAULT);
}
+/* NOTE : Make sure to reset after use! */
+void DRW_state_invert_facing(void)
+{
+ SWAP(GLenum, DST.backface, DST.frontface);
+ glFrontFace(DST.frontface);
+}
+
/** \} */
@@ -2249,6 +2258,11 @@ static void DRW_viewport_var_init(void)
/* Refresh DST.pixelsize */
DST.pixsize = rv3d->pixsize;
+
+ /* Reset facing */
+ DST.frontface = GL_CCW;
+ DST.backface = GL_CW;
+ glFrontFace(DST.frontface);
}
void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type)