void MatrixTransformPlane2(const mat4_t m, vec4_t inout) { vec4_t tmp; MatrixTransformPlane(m, inout, tmp); Vector4Copy(tmp, inout); }
//----------------------------------------------------------------------------- // Do we have reflective glass in view? //----------------------------------------------------------------------------- bool IsReflectiveGlassInView( const CViewSetup& view, cplane_t &plane ) { // Early out if no cameras C_FuncReflectiveGlass *pReflectiveGlass = GetReflectiveGlassList(); if ( !pReflectiveGlass ) return false; Frustum_t frustum; GeneratePerspectiveFrustum( view.origin, view.angles, view.zNear, view.zFar, view.fov, view.m_flAspectRatio, frustum ); cplane_t localPlane; Vector vecOrigin, vecWorld, vecDelta, vecForward; AngleVectors( view.angles, &vecForward, NULL, NULL ); for ( ; pReflectiveGlass != NULL; pReflectiveGlass = pReflectiveGlass->m_pNext ) { if ( pReflectiveGlass->IsDormant() ) continue; Vector vecMins, vecMaxs; pReflectiveGlass->GetRenderBoundsWorldspace( vecMins, vecMaxs ); if ( R_CullBox( vecMins, vecMaxs, frustum ) ) continue; const model_t *pModel = pReflectiveGlass->GetModel(); const matrix3x4_t& mat = pReflectiveGlass->EntityToWorldTransform(); int nCount = modelinfo->GetBrushModelPlaneCount( pModel ); for ( int i = 0; i < nCount; ++i ) { modelinfo->GetBrushModelPlane( pModel, i, localPlane, &vecOrigin ); MatrixTransformPlane( mat, localPlane, plane ); // Transform to world space VectorTransform( vecOrigin, mat, vecWorld ); if ( view.origin.Dot( plane.normal ) <= plane.dist ) // Check for view behind plane continue; VectorSubtract( vecWorld, view.origin, vecDelta ); // Backface cull if ( vecDelta.Dot( plane.normal ) >= 0 ) continue; return true; } } return false; }