| 51 | } |
| 52 | |
| 53 | void Frustum::Update(Viewport const* const viewport) |
| 54 | { |
| 55 | //calculate generalized relative width and aspect ratio |
| 56 | float normHalfWidth = tan(math::radians(m_FOV)); |
| 57 | float aspectRatio = viewport->GetAspectRatio(); |
| 58 | |
| 59 | //calculate width and height for near and far plane |
| 60 | float nearHW = normHalfWidth*m_NearPlane; |
| 61 | float nearHH = nearHW / aspectRatio; |
| 62 | float farHW = normHalfWidth*m_FarPlane;// *0.5f; |
| 63 | float farHH = farHW / aspectRatio; |
| 64 | |
| 65 | //calculate near and far plane centers |
| 66 | auto nCenter = m_Position + m_Forward*m_NearPlane; |
| 67 | auto fCenter = m_Position + m_Forward*m_FarPlane *0.5f; |
| 68 | |
| 69 | //construct corners of the near plane in the culled objects world space |
| 70 | m_Corners.na = nCenter + m_Up*nearHH - m_Right*nearHW; |
| 71 | m_Corners.nb = nCenter + m_Up*nearHH + m_Right*nearHW; |
| 72 | m_Corners.nc = nCenter - m_Up*nearHH - m_Right*nearHW; |
| 73 | m_Corners.nd = nCenter - m_Up*nearHH + m_Right*nearHW; |
| 74 | //construct corners of the far plane |
| 75 | m_Corners.fa = fCenter + m_Up*farHH - m_Right*farHW; |
| 76 | m_Corners.fb = fCenter + m_Up*farHH + m_Right*farHW; |
| 77 | m_Corners.fc = fCenter - m_Up*farHH - m_Right*farHW; |
| 78 | m_Corners.fd = fCenter - m_Up*farHH + m_Right*farHW; |
| 79 | |
| 80 | //float yFac = tanf( math::radians(m_FOV) / 2 ); |
| 81 | //float xFac = yFac*Config::GetInstance()->GetWindow().AspectRatio; |
| 82 | //vec3 nCenter = m_Position + m_Forward*m_NearPlane; |
| 83 | //vec3 fCenter = m_Position + m_Forward*m_FarPlane; |
| 84 | //vec3 nearHW = m_Right*m_FarPlane*xFac; |
| 85 | //vec3 nearHH = m_Up*m_FarPlane*yFac; |
| 86 | //vec3 farHW = m_Right*m_FarPlane*xFac; |
| 87 | //vec3 farHH = m_Up*m_FarPlane*yFac; |
| 88 | |
| 89 | ////construct corners of the near plane in the culled objects world space |
| 90 | //m_Corners.na = nCenter + nearHH - nearHW; |
| 91 | //m_Corners.nb = nCenter + nearHH + nearHW; |
| 92 | //m_Corners.nc = nCenter - nearHH - nearHW; |
| 93 | //m_Corners.nd = nCenter - nearHH + nearHW; |
| 94 | ////construct corners of the far plane |
| 95 | //m_Corners.fa = fCenter + farHH - farHW; |
| 96 | //m_Corners.fb = fCenter + farHH + farHW; |
| 97 | //m_Corners.fc = fCenter - farHH - farHW; |
| 98 | //m_Corners.fd = fCenter - farHH + farHW; |
| 99 | m_Corners.Transform(m_CullInverse); |
| 100 | |
| 101 | m_PositionObject = (m_CullInverse*vec4(m_Position, 0)).xyz; |
| 102 | m_RadInvFOV = 1 / math::radians(m_FOV); |
| 103 | |
| 104 | //construct planes |
| 105 | m_Planes.clear(); |
| 106 | //winding in an outside perspective so the cross product creates normals pointing inward |
| 107 | m_Planes.push_back(math::Plane(m_Corners.na, m_Corners.nb, m_Corners.nc));//Near |
| 108 | m_Planes.push_back(math::Plane(m_Corners.fb, m_Corners.fa, m_Corners.fd));//Far |
| 109 | m_Planes.push_back(math::Plane(m_Corners.fa, m_Corners.na, m_Corners.fc));//Left |
| 110 | m_Planes.push_back(math::Plane(m_Corners.nb, m_Corners.fb, m_Corners.nd));//Right |
no test coverage detected