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; }
const Matrix3x4& Camera::GetView() const { if (viewDirty_) { // Note: view matrix is unaffected by node or parent scale view_ = GetEffectiveWorldTransform().Inverse(); viewDirty_ = false; } return view_; }
const Frustum& Camera::GetFrustum() const { if (frustumDirty_) { Matrix3x4 worldTransform = GetEffectiveWorldTransform(); if (!orthographic_) frustum_.Define(fov_, aspectRatio_, zoom_, GetNearClip(), farClip_, worldTransform); else frustum_.DefineOrtho(orthoSize_, aspectRatio_, zoom_, GetNearClip(), farClip_, worldTransform); frustumDirty_ = false; } return frustum_; }
Frustum Camera::GetSplitFrustum(float nearClip, float farClip) const { Frustum ret; Matrix3x4 worldTransform = GetEffectiveWorldTransform(); nearClip = Max(nearClip, GetNearClip()); farClip = Min(farClip, farClip_); if (farClip < nearClip) farClip = nearClip; if (!orthographic_) ret.Define(fov_, aspectRatio_, zoom_, nearClip, farClip, worldTransform); else ret.DefineOrtho(orthoSize_, aspectRatio_, zoom_, nearClip, farClip, worldTransform); return ret; }
const Frustum& Camera::GetFrustum() const { // Use projection_ instead of GetProjection() so that Y-flip has no effect. Update first if necessary if (projectionDirty_) UpdateProjection(); if (frustumDirty_) { if (customProjection_) frustum_.Define(projection_ * GetView()); else { // If not using a custom projection, prefer calculating frustum from projection parameters instead of matrix // for better accuracy if (!orthographic_) frustum_.Define(fov_, aspectRatio_, zoom_, GetNearClip(), GetFarClip(), GetEffectiveWorldTransform()); else frustum_.DefineOrtho(orthoSize_, aspectRatio_, zoom_, GetNearClip(), GetFarClip(), GetEffectiveWorldTransform()); } frustumDirty_ = false; } return frustum_; }