diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-06-16 14:27:09 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-06-19 11:47:56 +0300 |
commit | 9a040fa3d4af2c2d4f51eafd3ce88c1f60ffc3a9 (patch) | |
tree | 2f04ff2c75ec5c0d777d93e9cf52cca5e07c7ce8 /source/blender | |
parent | 8a10fa1c530a0981301d0459a7a697c27a685c48 (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.h | 1 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 18 |
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) |