summaryrefslogtreecommitdiff
path: root/Runtime/Camera/RenderManager.h
blob: 78c3e38a222343f9fa3139822a598cdd0a9d4fca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#pragma once

#include "Runtime/Utilities/LinkedList.h"
#include <list>
#include <map>
#include "Runtime/Math/Rect.h"
#include "Camera.h"

class Renderable;
class MonoBehaviour;
typedef ListNode<MonoBehaviour> MonoBehaviourListNode;

// Camera handling
class RenderManager {
public:
	typedef std::list<PPtr<Camera> >	CameraContainer;
	typedef std::multimap<int, Renderable *> Renderables;

	RenderManager ();
	~RenderManager ();

	void RenderOffscreenCameras();
	void RenderCameras();

	Camera &GetCurrentCamera () 			{ Assert (!m_CurrentCamera.IsNull ()); return *m_CurrentCamera; }
	Camera* GetCurrentCameraPtr () 			{ return m_CurrentCamera; }
	void SetCurrentCamera (Camera *c)		{ m_CurrentCamera = c; }

	void AddCamera (Camera *c);
	void RemoveCamera (Camera *c);
	
	// Add/Remove Renderable. The Renderable.Render() method is called before the RenderQueue with index beforeRenderqueueIndex
	// is rendered in Camera.Render()
	void AddCameraRenderable (Renderable *r, int beforeRenderqueueIndex);
	void RemoveCameraRenderable (Renderable *r);
	const Renderables& GetRenderables () { return m_Renderables; }

	void AddOnRenderObject (MonoBehaviourListNode& beh) { m_OnRenderObjectCallbacks.push_back(beh); }
	void InvokeOnRenderObjectCallbacks ();
	
	CameraContainer& GetOnscreenCameras ()	{ return m_Cameras; }
	CameraContainer& GetOffscreenCameras ()	{ return m_OffScreenCameras; }

	// The window we're rendering into.
	// Most often xmin/xmax of this window are zero, except when using fixed aspect
	// in the game view.
	const Rectf &GetWindowRect() const { return m_WindowRect; }
	void SetWindowRect (const Rectf& r);

	const int* GetCurrentViewPort() const { return m_CurrentViewPort; }
	int* GetCurrentViewPortWriteable() { return m_CurrentViewPort; }
	
	#if UNITY_EDITOR
	bool HasFullscreenCamera () const;
	#endif

	static void UpdateAllRenderers();

	static void InitializeClass ();
	static void CleanupClass ();

private:
	void AddRemoveCamerasDelayed();
	
private:
	PPtr<Camera> m_CurrentCamera;
	CameraContainer m_Cameras, m_OffScreenCameras;
	CameraContainer m_CamerasToAdd;
	CameraContainer m_CamerasToRemove;
	bool m_InsideRenderOrCull;

	Rectf	m_WindowRect;
	int		m_CurrentViewPort[4]; // left, bottom, width, height; in pixels into current render target

	Renderables m_Renderables;
	typedef List<MonoBehaviourListNode> MonoBehaviourList;
	MonoBehaviourList m_OnRenderObjectCallbacks;
};

RenderManager& GetRenderManager ();
RenderManager* GetRenderManagerPtr ();
inline Camera &GetCurrentCamera () { return GetRenderManager().GetCurrentCamera(); }
inline Camera* GetCurrentCameraPtr () { return GetRenderManager().GetCurrentCameraPtr(); }