Frustum Camera::GetSplitFrustum(float nearClip, float farClip) const { if (projectionDirty_) UpdateProjection(); nearClip = Max(nearClip, projNearClip_); farClip = Min(farClip, projFarClip_); if (farClip < nearClip) farClip = nearClip; Frustum ret; if (customProjection_) { // DefineSplit() needs to project the near & far distances, so can not use a combined view-projection matrix. // Transform to world space afterward instead ret.DefineSplit(projection_, nearClip, farClip); ret.Transform(GetEffectiveWorldTransform()); } else { if (!orthographic_) ret.Define(fov_, aspectRatio_, zoom_, nearClip, farClip, GetEffectiveWorldTransform()); else ret.DefineOrtho(orthoSize_, aspectRatio_, zoom_, nearClip, farClip, GetEffectiveWorldTransform()); } return ret; }
Frustum Camera::GetViewSpaceSplitFrustum(float nearClip, float farClip) const { if (projectionDirty_) UpdateProjection(); nearClip = Max(nearClip, projNearClip_); farClip = Min(farClip, projFarClip_); if (farClip < nearClip) farClip = nearClip; Frustum ret; if (customProjection_) ret.DefineSplit(projection_, nearClip, farClip); else { if (!orthographic_) ret.Define(fov_, aspectRatio_, zoom_, nearClip, farClip); else ret.DefineOrtho(orthoSize_, aspectRatio_, zoom_, nearClip, farClip); } return ret; }