123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // 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
- //
- // camera.cpp
- // Project: Nostril (aka Postal)
- //
- // This module impliments the CCamara class
- //
- // History:
- // 01/09/96 MJR Started.
- //
- // 02/13/97 JMI Now passes m_pHood to CScene::Render().
- //
- // 02/28/97 JMI The Snap that takes many parameters was not using the
- // passed in CScene*, now it is.
- // Snap() now accepts a CHood* as well.
- //
- // 07/05/97 MJR Changed to RSP_BLACK_INDEX instead of 0.
- //
- // 07/31/97 JMI Added m_bClip to allow us to disable clipping to realm
- // edges.
- //
- ////////////////////////////////////////////////////////////////////////////////
- #define CAMERA_CPP
- #include "RSPiX.h"
- #include "camera.h"
- ////////////////////////////////////////////////////////////////////////////////
- // Macros/types/etc.
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- // Default constructor
- ////////////////////////////////////////////////////////////////////////////////
- CCamera::CCamera()
- {
- // Clear these for testing/debugging
- m_pScene = 0;
- m_pimFilm = 0;
- m_pHood = 0;
- // Default to clipping to realm edges.
- m_bClip = true;
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Destructor
- ////////////////////////////////////////////////////////////////////////////////
- CCamera::~CCamera()
- {
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Set camera's scene
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::SetScene(
- CScene* pScene) // In: Scene to take picture of
- {
- // Save specified values
- m_pScene = pScene;
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Set camera's hood
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::SetHood(
- CHood* pHood) // In: Hood to use for camera control
- {
- // Save specified values
- m_pHood = pHood;
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Set camera's view of the scene
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::SetView(
- short sSceneViewX, // In: View's upper left x (in scene coords)
- short sSceneViewY, // In: View's upper left y (in scene coords)
- short sViewW, // In: View's width
- short sViewH) // In: View's height
- {
- // Save specified values
- m_sSceneViewX = sSceneViewX;
- m_sSceneViewY = sSceneViewY;
- m_sViewW = sViewW;
- m_sViewH = sViewH;
- // Update state
- Update();
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Set camera's view position (assumes the view's size will be or was set separately)
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::SetViewPos(
- short sSceneViewX, // In: View's upper left x (in scene coords)
- short sSceneViewY) // In: View's upper left y (in scene coords)
- {
- // Save specified values
- m_sSceneViewX = sSceneViewX;
- m_sSceneViewY = sSceneViewY;
- // Update state
- Update();
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Set camera's view size (assumes the view's position will be or was set separately)
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::SetViewSize(
- short sViewW, // In: View's width
- short sViewH) // In: View's height
- {
- // Save specified values
- m_sViewW = sViewW;
- m_sViewH = sViewH;
- // Update state
- Update();
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Set camera's film (the RImage in which to put pictures of the scene). The view
- // can be put anywhere on the film and is clipped as required to fit the film.
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::SetFilm(
- RImage* pimFilm, // In: Film (where the picture ends up)
- short sFilmViewX, // In: View's upper left x (in film coords)
- short sFilmViewY) // In: View's upper left y (in film coords)
- {
- // Save specified values
- m_pimFilm = pimFilm;
- m_sFilmViewX = sFilmViewX;
- m_sFilmViewY = sFilmViewY;
- // Update state
- Update();
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Snap a picture with the lens cover on (i.e. - set film's view area to black)
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::SnapWithLensCoverOn(void)
- {
- ASSERT(m_pimFilm != NULL);
- // Draw black rectangle (automatically clips to image size)
- rspRect(RSP_BLACK_INDEX, m_pimFilm, m_sFilmViewX, m_sFilmViewY, m_sViewW, m_sViewH);
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Snap a picture using the preset parameters (scene, view, and film)
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::Snap(void)
- {
- ASSERT(m_pScene != NULL);
- ASSERT(m_pimFilm != NULL);
- /*
- // Init film clipping rect to view's location on the film
- RRect rFilmClip(m_sFilmViewX, m_sFilmViewY, m_sViewW, m_sViewH);
- // Clip the clipping rect to the film size
- RRect rFilmSize(0, 0, m_pimFilm->m_sWidth, m_pimFilm->m_sHeight);
- rFilmClip.ClipTo(&rFilmSize);
- // Tell scene to render itself onto film
- m_pScene->Render(m_sScene2FilmX, m_sScene2FilmY, m_pimFilm, &rFilmClip);
- */
- // Tell scene to render itself onto film (scene handles clipping)
- m_pScene->Render(m_sSceneViewX, m_sSceneViewY, m_sViewW, m_sViewH, m_pimFilm, m_sFilmViewX, m_sFilmViewY, m_pHood);
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Snap a picture using the specified parameters. These parameters are
- // temporary -- they do not affect any of the preset parameters!
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::Snap(
- short sViewW, // In: View's width
- short sViewH, // In: View's height
- CScene* pScene, // In: Scene to take picture of
- CHood* phood, // In: Hood for this scene.
- short sSceneViewX, // In: View's upper left x (in scene coords)
- short sSceneViewY, // In: View's upper left y (in scene coords)
- RImage* pimFilm, // In: Film (where the picture ends up)
- short sFilmViewX, // In: View's upper left x (in film coords)
- short sFilmViewY) // In: View's upper left y (in film coords)
- {
- /*
- // Init film clipping rect to view's location on the film
- RRect rFilmClip(sFilmViewX, sFilmViewY, sViewW, sViewH);
- // Clip the clipping rect to the film size
- RRect rFilmSize(0, 0, pimFilm->m_sWidth, pimFilm->m_sHeight);
- rFilmClip.ClipTo(&rFilmSize);
- // Calculate mapping from scene to film coords
- short sScene2FilmX = sSceneViewX - sFilmViewX;
- short sScene2FilmY = sSceneViewY - sFilmViewY;
- // Tell scene to render itself onto film
- pScene->Render(sScene2FilmX, sScene2FilmY, pimFilm, &rFilmClip);
- */
- // Tell scene to render itself onto film (scene handles clipping)
- pScene->Render(sSceneViewX, sSceneViewY, sViewW, sViewH, pimFilm, sFilmViewX, sFilmViewY, phood);
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Update internal state after setting new values
- ////////////////////////////////////////////////////////////////////////////////
- void CCamera::Update(void)
- {
- // If clipping is on . . .
- if (m_bClip == true)
- {
- // Limit to left edge of scene
- if (m_sSceneViewX < 0)
- m_sSceneViewX = 0;
- // Limit to top edge of scene
- if (m_sSceneViewY < 0)
- m_sSceneViewY = 0;
- // Limit to right edge of scene
- if (m_pHood != 0)
- {
- short sClipX = (m_sSceneViewX + m_sViewW) - m_pHood->GetWidth();
- if (sClipX > 0)
- m_sSceneViewX -= sClipX;
- // Limit to bottom edge of scene
- short sClipY = (m_sSceneViewY + m_sViewH) - m_pHood->GetHeight();
- if (sClipY > 0)
- m_sSceneViewY -= sClipY;
- }
- }
- // Calculate mapping from scene to film coords
- m_sScene2FilmX = m_sSceneViewX - m_sFilmViewX;
- m_sScene2FilmY = m_sSceneViewY - m_sFilmViewY;
- }
- ////////////////////////////////////////////////////////////////////////////////
- // EOF
- ////////////////////////////////////////////////////////////////////////////////
|