123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this program; if not, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- // grip.h
- // Project: Nostril (aka Postal)
- //
- ////////////////////////////////////////////////////////////////////////////////
- #ifndef GRIP_H
- #define GRIP_H
- #include <math.h>
- #include "RSPiX.h"
- #include "camera.h"
- // A CGrip object is typically used to control the movement of a CCamera object.
- //
- // The name "grip" is taken from the movie industry, where the person who moves
- // around the platform the camera sits upon is called the "grip". The camera-
- // man is responsible for other camera adjustments such as pan, tilt and zoom.
- // In our case, the camera doesn't have those other adjustments, so the grip is
- // solely responsible for keeping the camera positioned correctly.
- //
- // The basic function of the grip is to move the camera so as to track some
- // specified "target" in the scene. Rather than just keeping the target within
- // the camera's view, it is usually desirable to define a smaller area within
- // the view, and to keep the target within (or outside of) that area. This
- // area is called the grip's "target zone".
- class CGrip
- {
- //---------------------------------------------------------------------------
- // Types, enums, etc.
- //---------------------------------------------------------------------------
- //---------------------------------------------------------------------------
- // Variables
- //---------------------------------------------------------------------------
- public:
- short m_sGripX; // Grip's current x coord
- short m_sGripY; // Grip's current y coord
- short m_sMinMoveX; // Minimum move in x direction
- short m_sMinMoveY; // Minimum move in y direction
- short m_sMaxMoveX; // Maximum move in x direction
- short m_sMaxMoveY; // Maximum move in y direction
- short m_sAlignX; // Required x alignment (1 allows any alignment)
- short m_sAlignY; // Required y alignment (1 allows any alignment)
- short m_sZoneX;
- short m_sZoneY;
- short m_sZoneR;
- // short m_sZoneW;
- // short m_sZoneH;
- // bool m_bAlwaysInView; // Always keep target in view, regardless of
- // any other settings
- // bool m_bUseZone;
- bool m_bKeepInsideZone;
- // bool m_bKeepOutsideZone;
- CCamera* m_pCamera; // Camera being controlled
- //---------------------------------------------------------------------------
- // Public functions
- //---------------------------------------------------------------------------
- public:
- // Default (and only) constructor
- CGrip();
- // Destructor
- ~CGrip();
- // Set camera to control
- void SetCamera(
- CCamera* pCamera); // In: Camera to control
- // Set tracking parameters
- void SetParms(
- short sZoneR, // In: Zone radius
- short sMinMoveX, // In: Minimum move in x direction
- short sMinMoveY, // In: Minimum move in y direction
- short sMaxMoveX, // In: Maximum move in x direction
- short sMaxMoveY, // In: Maximum move in y direction
- short sAlignX, // In: Required x alignment (1 allows any alignment)
- short sAlignY, // In: Required y alignment (1 allows any alignment)
- bool bKeepInsideZone) // In: True to keep inside zone, false otherwise
- {
- m_sZoneR = sZoneR;
- m_sMinMoveX = sMinMoveX;
- m_sMinMoveY = sMinMoveY;
- m_sMaxMoveX = sMaxMoveX;
- m_sMaxMoveY = sMaxMoveY;
- m_sAlignX = sAlignX;
- m_sAlignY = sAlignY;
- m_bKeepInsideZone = bKeepInsideZone;
- }
- // Reset target, which foces camera to be moved so the target is centered
- void ResetTarget(
- short sTargetX, // In: Target's x coord
- short sTargetY, // In: Target's y coord
- short sTargetR) // In: Target's radius
- {
- m_sZoneX = sTargetX;
- m_sZoneY = sTargetY;
- short sUpperLeftX = m_sZoneX - (m_pCamera->m_sViewW / 2);
- short sUpperLeftY = m_sZoneY - (m_pCamera->m_sViewH / 2);
- m_pCamera->SetViewPos(sUpperLeftX, sUpperLeftY);
- }
- // Track specified target coordinates
- void TrackTarget(
- short sTargetX, // In: Target's x coord
- short sTargetY, // In: Target's y coord
- short sTargetR) // In: Target's radius
- {
- if (m_bKeepInsideZone)
- KeepInside(sTargetX, sTargetY, sTargetR);
- // else
- // KeepOutside(sTargetx, sTargetY);
- }
- void KeepInside(
- short sTargetX, // In: Target's center x coord
- short sTargetY, // In: Target's center y coord
- short sTargetR) // In: Target's radius
- {
- // Calculate distance from center of zone to furthest edge of target
- double dx = sTargetX - m_sZoneX;
- double dy = sTargetY - m_sZoneY;
- double dDistance = sqrt((dx * dx) + (dy * dy)) + (double)sTargetR;
- // If distance is greater than zone's radius, then we need to move the camera
- if (dDistance > m_sZoneR)
- {
- // Calculate minimum amount we need to move
- double dMoveBy = dDistance - (double)m_sZoneR;
- // Calculate angle of movement
- short sDeg = rspATan(dy, dx);
- // Calculate camera x and y movement
- short sMoveX = (short)(rspCos(sDeg) * dMoveBy);
- short sMoveY = (short)(rspSin(sDeg) * dMoveBy);
- // if ((sMoveX >= m_sMinMoveX) && (sMoveY >= m_sMinMoveY))
- // {
- // if (sMoveX > m_sMaxMoveX)
- // sMoveX = m_sMaxMoveX;
- // if (sMoveY > m_sMaxMoveY)
- // sMoveY = m_sMaxMoveY;
- short sModX;
- if (sMoveX >= 0)
- sModX = sMoveX % m_sAlignX;
- else
- sModX = (-sMoveX) % m_sAlignX;
- if (sModX)
- sMoveX -= sModX;
- short sModY;
- if (sMoveY >= 0)
- sModY = sMoveY % m_sAlignY;
- else
- sModY = (-sMoveY) % m_sAlignY;
- if (sModY)
- sMoveY -= sModY;
- m_sZoneX += sMoveX;
- m_sZoneY += sMoveY;
- short sUpperLeftX = m_sZoneX - (m_pCamera->m_sViewW / 2);
- if (sUpperLeftX < 0)
- sUpperLeftX = 0;
- short sUpperLeftY = m_sZoneY - (m_pCamera->m_sViewH / 2);
- if (sUpperLeftY < 0)
- sUpperLeftY = 0;
- m_pCamera->SetViewPos(sUpperLeftX, sUpperLeftY);
- // }
- }
- }
- //---------------------------------------------------------------------------
- // Helper functions
- //---------------------------------------------------------------------------
- protected:
- };
- #endif //GRIP_H
- ////////////////////////////////////////////////////////////////////////////////
- // EOF
- ////////////////////////////////////////////////////////////////////////////////
|