| 61 | } |
| 62 | |
| 63 | void PlanarView::UpdateCache() |
| 64 | { |
| 65 | if (m_CacheValid) |
| 66 | return; |
| 67 | |
| 68 | m_PixelOffsetMatrix = affineToHomogeneous(translation( |
| 69 | float3(2.f * m_PixelOffset.x / (m_Viewport.maxX - m_Viewport.minX), |
| 70 | -2.f * m_PixelOffset.y / (m_Viewport.maxY - m_Viewport.minY), 0.f))); |
| 71 | m_PixelOffsetMatrixInv = inverse(m_PixelOffsetMatrix); |
| 72 | |
| 73 | m_ViewProjMatrix = affineToHomogeneous(m_ViewMatrix) * m_ProjMatrix; |
| 74 | m_ViewProjOffsetMatrix = m_ViewProjMatrix * m_PixelOffsetMatrix; |
| 75 | |
| 76 | m_ViewMatrixInv = inverse(m_ViewMatrix); |
| 77 | m_ProjMatrixInv = inverse(m_ProjMatrix); |
| 78 | m_ViewProjMatrixInv = m_ProjMatrixInv * affineToHomogeneous(m_ViewMatrixInv); |
| 79 | m_ViewProjOffsetMatrixInv = m_PixelOffsetMatrixInv * m_ViewProjMatrixInv; |
| 80 | |
| 81 | m_ReverseDepth = (m_ProjMatrix[2][2] <= 0.f); |
| 82 | m_ViewFrustum = frustum(m_ViewProjMatrix, m_ReverseDepth); |
| 83 | m_ProjectionFrustum = frustum(m_ProjMatrix, m_ReverseDepth); |
| 84 | |
| 85 | m_IsMirrored = determinant(m_ViewMatrix.m_linear) < 0.f; |
| 86 | |
| 87 | m_CacheValid = true; |
| 88 | } |
| 89 | |
| 90 | void PlanarView::EnsureCacheIsValid() const |
| 91 | { |
no test coverage detected