bool UnderstandingMgr_W::OnePassScanOnCurrentSR(const Vec3f &_CameraPos, const Vec3f &_CameraDir, Float _MaxPlayspaceSize) { // Set FPU SetAsoboFPU(); m_PlaySpaceInfos.SetPlayspaceSR(&m_PlayspaceSR); // Set Camera (to be modified) Vec3f normedCameraDir; Vec3f normedCameraDirUp; normedCameraDir.CNormalize(); normedCameraDirUp = normedCameraDir ^ (normedCameraDir^VEC3F_UP); normedCameraDirUp.CNormalize(); Util_L::SetCurrentCamera(_CameraPos, normedCameraDir, normedCameraDirUp); if (m_FrameMode == ManageInside) Util_L::ApplyTranfoToCamera(m_FrameQuat); // Set Scan mode : MESH and NEW (to be suppressed) PlaySpaceInfos_W::g_TypeScan &= ~PlaySpaceInfos_W::PSI_SCAN_OLD; PlaySpaceInfos_W::g_TypeScan |= PlaySpaceInfos_W::PSI_SCAN_NEW; PlaySpaceInfos_W::g_TypeScan |= PlaySpaceInfos_W::PSI_SCAN_MESH; if (!m_PlaySpaceInfos.OnePassComputePlaySpace(_CameraPos, _CameraDir, _MaxPlayspaceSize)) return FALSE; // Report Align. ResetFrameTransfo(m_FrameQuat * m_PlaySpaceInfos.m_AlignTransfo); return TRUE; }
Quat Util_L::GetOrientationQuat(const Vec3f &_front, const Vec3f &_baseUp, S32 _order[3]) { // orientation / sol Mat4x4 rot; Quat qRot; Vec3f vRight = _front ^ _baseUp; vRight.CNormalize(); Vec3f vUp = vRight ^ _front; vUp.CNormalize(); Vec3f v[3] = { _front, vUp, vRight }; for (S32 i = 0;i < 3;i++) rot.GetRow(i) = Sign(_order[i]) * v[Abs(_order[i]) - 1]; qRot = Quat(rot); qRot.Normalize(); return qRot; }
Quat Util_L::GetOrientationQuat(const Vec3f &_nodePos, const Vec3f &_viewPos, const Vec3f &_baseUp, S32 _order[3], Float *_pDist) { Vec3f vFrontDir = _viewPos - _nodePos; if (_pDist) { (*_pDist) = vFrontDir.GetNorm(); } vFrontDir.CNormalize(); return GetOrientationQuat(vFrontDir, _baseUp, _order); }
void QuatToRV(const Quat &_q,Vec3f &_v) { Quat q=_q; if (q.w<-1.f) q.w=-1.f; if (q.w>1.f) q.w=1.f; Float halfang=ACos(q.w); Float s=Sin(halfang); //Don't try to use sinf here...we already tried, it breaks the quaternion...Need to investigate if (s>Float_Eps) { q.v*=(1.f/s); } q.w=halfang*2.f; _v=q.v, _v.CNormalize(); _v*=q.w; }