[Bf-blender-cvs] [f972a3c3145] master: DRW: Support inverted view matrix

Clément Foucault noreply at git.blender.org
Wed Feb 19 19:37:01 CET 2020


Commit: f972a3c31458a7048a6ffb3e26f7d802e3433934
Author: Clément Foucault
Date:   Wed Feb 19 19:36:12 2020 +0100
Branches: master
https://developer.blender.org/rBf972a3c31458a7048a6ffb3e26f7d802e3433934

DRW: Support inverted view matrix

We detect the case where we need to invert the facing directly inside the
DRWView update and do the appropriate GL calls at draw time.

Fix T63047 Camera with negative scale works only in Cycles Rendered view
Fix T71352 Negative scale camera causes BLI_assert

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

M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_exec.c

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

diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index f040afc794c..6d415ee95b3 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -362,6 +362,8 @@ struct DRWView {
   int clip_planes_len;
   /** Does culling result needs to be updated. */
   bool is_dirty;
+  /** Does facing needs to be reversed? */
+  bool is_inverted;
   /** Culling */
   uint32_t culling_mask;
   BoundBox frustum_corners;
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 0af68181478..fbdabb44b15 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -1551,13 +1551,6 @@ static void draw_view_matrix_state_update(DRWViewUboStorage *storage,
                                           const float viewmat[4][4],
                                           const float winmat[4][4])
 {
-  /* If only one the matrices is negative, then the
-   * polygon winding changes and we don't want that.
-   * By convention, the winmat is negative because
-   * looking through the -Z axis. So this inverse the
-   * changes the test for the winmat. */
-  BLI_assert(is_negative_m4(viewmat) == !is_negative_m4(winmat));
-
   copy_m4_m4(storage->viewmat, viewmat);
   invert_m4_m4(storage->viewinv, storage->viewmat);
 
@@ -1629,6 +1622,7 @@ void DRW_view_update_sub(DRWView *view, const float viewmat[4][4], const float w
   BLI_assert(view->parent != NULL);
 
   view->is_dirty = true;
+  view->is_inverted = (is_negative_m4(viewmat) == is_negative_m4(winmat));
 
   draw_view_matrix_state_update(&view->storage, viewmat, winmat);
 }
@@ -1646,6 +1640,7 @@ void DRW_view_update(DRWView *view,
   BLI_assert(view->parent == NULL);
 
   view->is_dirty = true;
+  view->is_inverted = (is_negative_m4(viewmat) == is_negative_m4(winmat));
 
   draw_view_matrix_state_update(&view->storage, viewmat, winmat);
 
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 23a3e0b05d4..0ff3e2b1853 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -1072,7 +1072,7 @@ static void draw_call_resource_bind(DRWCommandsState *state, const DRWResourceHa
   /* Front face is not a resource but it is inside the resource handle. */
   bool neg_scale = DRW_handle_negative_scale_get(handle);
   if (neg_scale != state->neg_scale) {
-    glFrontFace((neg_scale) ? GL_CW : GL_CCW);
+    glFrontFace((neg_scale != DST.view_active->is_inverted) ? GL_CW : GL_CCW);
     state->neg_scale = neg_scale;
   }
 
@@ -1395,6 +1395,10 @@ static void drw_draw_pass_ex(DRWPass *pass,
   drw_state_set(pass->state);
   drw_state_validate();
 
+  if (DST.view_active->is_inverted) {
+    glFrontFace(GL_CW);
+  }
+
   DRW_stats_query_start(pass->name);
 
   for (DRWShadingGroup *shgroup = start_group; shgroup; shgroup = shgroup->next) {
@@ -1444,6 +1448,11 @@ static void drw_draw_pass_ex(DRWPass *pass,
     drw_state_set((DST.state & ~DRW_STATE_RASTERIZER_ENABLED) | DRW_STATE_DEFAULT);
   }
 
+  /* Reset default. */
+  if (DST.view_active->is_inverted) {
+    glFrontFace(GL_CCW);
+  }
+
   DRW_stats_query_end();
 }



More information about the Bf-blender-cvs mailing list