@@ -705,13 +705,27 @@ Real W3DView::getMaxZoom(Real x, Real y) const
705705// -------------------------------------------------------------------------------------------------
706706/* * set the transform matrix of m_3DCamera, based on m_pos & m_angle */
707707// -------------------------------------------------------------------------------------------------
708- void W3DView::setCameraTransform ()
708+ void W3DView::updateCameraTransform ()
709709{
710710 if (TheGlobalData->m_headless )
711711 return ;
712712
713- m_cameraHasMovedSinceRequest = true ;
713+ updateCameraClipPlanes ();
714+
715+ Vector3 sourcePos;
716+ Vector3 targetPos;
717+ buildCameraPosition (sourcePos, targetPos);
718+
719+ Matrix3D cameraTransform;
720+ buildCameraTransform (&cameraTransform, sourcePos, targetPos);
721+
722+ setCameraTransform (cameraTransform);
723+ }
714724
725+ // -------------------------------------------------------------------------------------------------
726+ // -------------------------------------------------------------------------------------------------
727+ void W3DView::updateCameraClipPlanes ()
728+ {
715729 Real farZ = 1200 .0f ;
716730
717731 if (m_useRealZoomCam) // WST 10.19.2002
@@ -730,18 +744,19 @@ void W3DView::setCameraTransform()
730744 }
731745
732746 m_3DCamera->Set_Clip_Planes (NearZ, farZ);
747+ }
748+
749+ // -------------------------------------------------------------------------------------------------
750+ // -------------------------------------------------------------------------------------------------
751+ void W3DView::setCameraTransform (const Matrix3D &transform)
752+ {
753+ m_cameraHasMovedSinceRequest = true ;
733754
734755#if defined(RTS_DEBUG)
735756 m_3DCamera->Set_View_Plane ( m_FOV, -1 );
736757#endif
737758
738- // rebuild it (even if we just did it due to camera constraints)
739- Vector3 sourcePos;
740- Vector3 targetPos;
741- buildCameraPosition (sourcePos, targetPos);
742- Matrix3D cameraTransform;
743- buildCameraTransform (&cameraTransform, sourcePos, targetPos);
744- m_3DCamera->Set_Transform ( cameraTransform );
759+ m_3DCamera->Set_Transform (transform);
745760
746761 if (TheTerrainRenderObject)
747762 {
@@ -790,14 +805,35 @@ void W3DView::init()
790805}
791806
792807// -------------------------------------------------------------------------------------------------
793- const Coord3D& W3DView::get3DCameraPosition () const
808+ Coord3D W3DView::get3DCameraPosition () const
794809{
795810 Vector3 camera = m_3DCamera->Get_Position ();
796- static Coord3D pos;
797- pos.set ( camera.X , camera.Y , camera.Z );
811+ Coord3D pos = { camera.X , camera.Y , camera.Z };
798812 return pos;
799813}
800814
815+ // -------------------------------------------------------------------------------------------------
816+ Coord3D W3DView::get3DCameraDirection () const
817+ {
818+ Vector3 forward = m_3DCamera->Get_Forward_Dir ();
819+ Coord3D dir = { forward.X , forward.Y , forward.Z };
820+ return dir;
821+ }
822+
823+ // -------------------------------------------------------------------------------------------------
824+ void W3DView::set3DCameraLookAt (const Coord3D &pos, const Coord3D &dir, Real roll)
825+ {
826+ Vector3 camPos (pos.x , pos.y , pos.z );
827+ Vector3 camDir (dir.x , dir.y , dir.z );
828+ Matrix3D transform;
829+ transform.Look_At_Dir (camPos, camDir, roll);
830+
831+ updateCameraClipPlanes ();
832+ setCameraTransform (transform);
833+
834+ m_recalcCamera = false ;
835+ }
836+
801837// -------------------------------------------------------------------------------------------------
802838// -------------------------------------------------------------------------------------------------
803839void W3DView::reset ()
@@ -1560,7 +1596,7 @@ void W3DView::update()
15601596 // (gth) C&C3 if m_isCameraSlaved then force the camera to update each frame
15611597 if (m_recalcCamera || m_isCameraSlaved)
15621598 {
1563- setCameraTransform ();
1599+ updateCameraTransform ();
15641600 m_recalcCamera = false ;
15651601 }
15661602
0 commit comments