1 #pragma once
2 #include <OgreRenderTargetListener.h>
3 #include <list>
4 
5 class SETTINGS;
6 namespace Ogre {  class SceneNode;  class Root;  class SceneManager;  class RenderWindow;  class Viewport;  }
7 
8 /*
9  * SplitScreenManager can be used to split up the screen into 2 - 4 areas.
10  * This is useful for "Hotseat" game mode (Multiple players driving against each other on the same PC)
11  *
12  * For every player a viewport and a camera will be created.
13  * Also there is one transparent fullscreen viewport on top of the others, for the GUI.
14  *
15  * One instance of SplitScreenManager is created when the game is started,
16  * and it will be destroyed when game quits.
17  */
18 
19 class SplitScr : public Ogre::RenderTargetListener
20 {
21 public:
22 	// Constructor, only assign members
23 	SplitScr(Ogre::SceneManager* sceneMgr, Ogre::RenderWindow* window, SETTINGS* set);
24 	~SplitScr();
25 
26 	// Number of viewports / cameras
27 	int mNumViewports;
28 
29 	// Lists for player viewports & cameras
30 	std::list<Ogre::Viewport*> mViewports;
31 	std::list<Ogre::Camera*> mCameras;
32 
33 	// Gui viewport & scene manager
34 	Ogre::SceneManager* mGuiSceneMgr;
35 	Ogre::Viewport* mGuiViewport;
36 
37 	// This method should always be called after mNumPlayers is changed.
38 	// It will create new viewports and cameras and arrange them.
39 	void Align();
40 
41 	// dimensions for the viewport of each player [4]
42 	struct VPDims
43 	{	Ogre::Real top,left, width,height, right,bottom, avgsize;
DefaultVPDims44 		void Default() {  top=0.f; left=0.f;  width=1.f; height=1.f;  right=1.f; bottom=1.f;  avgsize=1.f;  }
VPDimsVPDims45 		VPDims() {  Default();  }
46 	} mDims[4];
47 
48 	// Destroy viewports & cameras
49 	void CleanUp();
50 
51 	// Adjust viewport size / camera aspect ratio
52 	// Should be called whenever the window size changes
53 	void AdjustRatio();
54 
55 	// Set background color for all viewports
56 	void SetBackground(const Ogre::ColourValue& color);
57 
58 	// Update the view distance for all cameras.
59 	// This will be called when the view distance slider in gui is changed.
60 	void UpdateCamDist();
61 
62 	void preViewportUpdate(const Ogre::RenderTargetViewportEvent& evt);
63 	void postViewportUpdate(const Ogre::RenderTargetViewportEvent& evt);
64 
65 	class App* pApp;
66 private:
67 	SETTINGS* pSet;
68 
69 	// Scene manager to use
70 	Ogre::SceneManager* mSceneMgr;
71 
72 	// Render window to use
73 	Ogre::RenderWindow* mWindow;
74 };
75