123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- // *************************************************************************************
- // ! DayZPlayerCamera1stPersonVehicle - first person in vehicle
- // *************************************************************************************
- class DayZPlayerCamera1stPersonVehicle extends DayZPlayerCamera1stPerson
- {
- override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
- {
- super.OnUpdate(pDt, pOutResult);
- pOutResult.m_fUseHeading = 0.0;
- pOutResult.m_bUpdateEveryFrame = GetGame().IsPhysicsExtrapolationEnabled();
- }
- }
- // *************************************************************************************
- // ! DayZPlayerCamera3rdPersonVehicle - 3rd person in vehicle (generic)
- // *************************************************************************************
- class DayZPlayerCamera3rdPersonVehicle extends DayZPlayerCameraBase
- {
- static const float CONST_UD_MIN = -85.0; //!< down limit
- static const float CONST_UD_MAX = 85.0; //!< up limit
- const float UP_ANGLE_CAP = 10; // max up angle, doesnt require gamecode sync
- static const float CONST_LR_MIN = -160.0; //!< down limit
- static const float CONST_LR_MAX = 160.0; //!< up limit
-
- const float CONST_LINEAR_VELOCITY_STRENGTH = 0.025;
- const float CONST_ANGULAR_VELOCITY_STRENGTH = 0.025;
- const float CONST_ANGULAR_LAG_YAW_STRENGTH = 10.0;
- const float CONST_ANGULAR_LAG_PITCH_STRENGTH = 50.0;
- const float CONST_ANGULAR_LAG_ROLL_STRENGTH = 0.0;
- void DayZPlayerCamera3rdPersonVehicle( DayZPlayer pPlayer, HumanInputController pInput )
- {
- //Print("new camera: DayZPlayerCamera3rdPersonVehicle");
- m_fDistance = 4.0;
- m_CameraOffsetMS = "0.0 1.3 0.0";
-
- HumanCommandVehicle vehicleCommand = pPlayer.GetCommand_Vehicle();
- if ( vehicleCommand )
- {
- Transport transport = vehicleCommand.GetTransport();
- if ( transport )
- {
- m_Transport = transport;
- m_fDistance = transport.GetTransportCameraDistance();
- m_CameraOffsetMS = transport.GetTransportCameraOffset();
- }
- }
- }
-
- override void OnActivate( DayZPlayerCamera pPrevCamera, DayZPlayerCameraResult pPrevCameraResult )
- {
- if (pPrevCamera)
- {
- vector baseAngles = pPrevCamera.GetBaseAngles();
- m_fUpDownAngle = baseAngles[0];
- m_fLeftRightAngle = baseAngles[1];
- vector addAngles = pPrevCamera.GetAdditiveAngles();
- m_fUpDownAngleAdd = addAngles[0];
- m_fLeftRightAngleAdd = addAngles[1];
- }
-
- m_LagOffsetPosition = vector.Zero;
- m_fLagOffsetVelocityX[0] = 0;
- m_fLagOffsetVelocityY[0] = 0;
- m_fLagOffsetVelocityZ[0] = 0;
- }
- override void OnUpdate( float pDt, out DayZPlayerCameraResult pOutResult )
- {
- //! get player transform
- vector playerTransformWS[4];
- m_pPlayer.GetTransform(playerTransformWS);
- //! get vehicle and set it as ignore entity for camera collision solver
- IEntity vehicle = m_Transport;
- pOutResult.m_CollisionIgnoreEntity = vehicle;
-
- //! update camera offset
- vector cameraPosition = vector.Zero;
- if ( vehicle )
- {
- vector vehiclePositionWS = vehicle.GetOrigin();
- vector vehiclePositionMS = vehiclePositionWS.InvMultiply4(playerTransformWS);
- cameraPosition = vehiclePositionMS + m_CameraOffsetMS;
- }
- //! orientation LS
- m_CurrentCameraYaw = UpdateLRAngleUnlocked(m_fLeftRightAngle, m_fLeftRightAngleAdd, CONST_LR_MIN, CONST_LR_MAX, pDt);
- m_CurrentCameraPitch = UpdateUDAngleUnlocked(m_fUpDownAngle, m_fUpDownAngleAdd, CONST_UD_MIN, CONST_UD_MAX, pDt);
- m_CurrentCameraRoll = 0;
-
- //! create LS lag from vehicle velocities
- vector posDiffLS = vector.Zero;
- vector rotDiffLS = vector.Zero;
- vector orientVeh = vector.Zero;
-
- if (vehicle)
- {
- vector posDiffWS = GetVelocity(vehicle) * CONST_LINEAR_VELOCITY_STRENGTH;
- posDiffLS = posDiffWS.InvMultiply3(playerTransformWS);
- vector rotDiffWS = dBodyGetAngularVelocity(vehicle) * Math.RAD2DEG * CONST_ANGULAR_VELOCITY_STRENGTH;
- rotDiffLS = rotDiffWS.InvMultiply3(playerTransformWS);
-
- orientVeh = m_Transport.GetOrientation() * Math.DEG2RAD;
- }
-
- //! smooth it!
- m_LagOffsetPosition[0] = Math.SmoothCD(m_LagOffsetPosition[0], posDiffLS[0], m_fLagOffsetVelocityX, 0.3, 1000, pDt);
- m_LagOffsetPosition[1] = Math.SmoothCD(m_LagOffsetPosition[1], posDiffLS[1], m_fLagOffsetVelocityY, 0.3, 1000, pDt);
- m_LagOffsetPosition[2] = Math.SmoothCD(m_LagOffsetPosition[2], posDiffLS[2], m_fLagOffsetVelocityZ, 0.3, 1000, pDt);
- m_LagOffsetOrientation[0] = Math.SmoothCD(m_LagOffsetOrientation[0], rotDiffLS[1], m_fLagOffsetVelocityYaw, 0.3, 1000, pDt);
- m_LagOffsetOrientation[1] = Math.SmoothCDPI2PI(m_LagOffsetOrientation[1], orientVeh[1], m_fLagOffsetVelocityPitch, 0.3, 1000, pDt);
- m_LagOffsetOrientation[2] = Math.SmoothCD(m_LagOffsetOrientation[2], rotDiffLS[0], m_fLagOffsetVelocityRoll, 0.3, 1000, pDt);
-
- //! setup orientation
- vector rot;
- rot[0] = m_LagOffsetOrientation[0] * CONST_ANGULAR_LAG_YAW_STRENGTH;
- rot[1] = m_LagOffsetOrientation[1] * CONST_ANGULAR_LAG_PITCH_STRENGTH;
- rot[2] = m_LagOffsetOrientation[2] * CONST_ANGULAR_LAG_ROLL_STRENGTH;
-
- float distance = m_fDistance;
-
- if (m_CurrentCameraPitch > UP_ANGLE_CAP) // restrict moving camera below surface level
- {
- vector clamped = GetCurrentOrientation() + rot;
- clamped[1] = UP_ANGLE_CAP;
- Math3D.YawPitchRollMatrix(clamped, pOutResult.m_CameraTM);
-
- distance = m_fDistance - (2 * Math.InverseLerp(UP_ANGLE_CAP, CONST_UD_MAX, m_CurrentCameraPitch));
-
- }
- else
- Math3D.YawPitchRollMatrix(GetCurrentOrientation() + rot, pOutResult.m_CameraTM);
- //! setup position
- pOutResult.m_CameraTM[3] = cameraPosition - m_LagOffsetPosition;
-
- //! setup rest
- pOutResult.m_fDistance = distance;
- pOutResult.m_fUseHeading = 0.0;
- pOutResult.m_fInsideCamera = 0.0;
- pOutResult.m_fIgnoreParentRoll = 1.0;
- pOutResult.m_fIgnoreParentPitch = 1.0;
- pOutResult.m_bUpdateEveryFrame = GetGame().IsPhysicsExtrapolationEnabled();
-
- StdFovUpdate(pDt, pOutResult);
-
- super.OnUpdate(pDt, pOutResult);
- }
- override vector GetBaseAngles()
- {
- vector a;
- a[0] = m_fUpDownAngle;
- a[1] = m_fLeftRightAngle;
- a[2] = 0;
- return a;
- }
- override vector GetAdditiveAngles()
- {
- vector a;
- a[0] = m_fUpDownAngleAdd;
- a[1] = m_fLeftRightAngleAdd;
- a[2] = 0;
- return a;
- }
- //! runtime config
- protected vector m_CameraOffsetMS; //!< model space offset
- protected float m_fDistance; //!< distance from start
-
- //! runtime values
- protected float m_fUpDownAngle; //!< up down angle in rad
- protected float m_fUpDownAngleAdd; //!< up down angle in rad
- protected float m_fLeftRightAngle; //!< left right angle in rad
- protected float m_fLeftRightAngleAdd; //!< left right angle in rad
-
- //! lag offsets
- protected vector m_LagOffsetPosition;
- protected vector m_LagOffsetOrientation;
- protected float m_fLagOffsetVelocityX[1];
- protected float m_fLagOffsetVelocityY[1];
- protected float m_fLagOffsetVelocityZ[1];
- protected float m_fLagOffsetVelocityYaw[1];
- protected float m_fLagOffsetVelocityPitch[1];
- protected float m_fLagOffsetVelocityRoll[1];
-
- //! cache
- protected Transport m_Transport;
- }
|