aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/gfx/renderobjectmanager.h
blob: 1db91dfbe6c7cf6439679644ede54f613e5929f8 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * 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.
 *
 */

/*
 * This code is based on Broken Sword 2.5 engine
 *
 * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer
 *
 * Licensed under GNU GPL v2
 *
 */

/*
    BS_RenderObjectManager
    ----------------------
    Diese Klasse ist f�r die Verwaltung von BS_RenderObjects zust�ndig.

    Sie sorgt z.B. daf�r, dass die BS_RenderObjects in der richtigen Reihenfolge gerendert werden.

    Autor: Malte Thiesen
*/

#ifndef SWORD25_RENDEROBJECTMANAGER_H
#define SWORD25_RENDEROBJECTMANAGER_H

#include "common/rect.h"
#include "sword25/kernel/common.h"
#include "sword25/gfx/renderobjectptr.h"
#include "sword25/kernel/persistable.h"

#include "sword25/gfx/microtiles.h"

namespace Sword25 {

class Kernel;
class RenderObject;
class TimedRenderObject;
class RenderObjectManager;

struct RenderObjectQueueItem {
	RenderObject *_renderObject;
	Common::Rect _bbox;
	int _version;
	RenderObjectQueueItem(RenderObject *renderObject, const Common::Rect &bbox, int version)
		: _renderObject(renderObject), _bbox(bbox), _version(version) {}
};

class RenderObjectQueue : public Common::List<RenderObjectQueueItem> {
public:
	void add(RenderObject *renderObject);
	bool exists(const RenderObjectQueueItem &renderObjectQueueItem);
};

/**
    @brief Diese Klasse ist f�r die Verwaltung von BS_RenderObjects zust�ndig.

    Sie sorgt daf�r, dass die BS_RenderObjects in der richtigen Reihenfolge gerendert werden und erm�glicht den Zugriff auf die
    BS_RenderObjects �ber einen String.
*/
class RenderObjectManager : public Persistable {
public:
	/**
	    @brief Erzeugt ein neues BS_RenderObjectManager-Objekt.
	    @param Width die horizontale Bildschirmaufl�sung in Pixeln
	    @param Height die vertikale Bildschirmaufl�sung in Pixeln
	    @param Die Anzahl an Framebuffern, die eingesetzt wird (Backbuffer + Primary).
	*/
	RenderObjectManager(int width, int height, int framebufferCount);
	virtual ~RenderObjectManager();

	// Interface
	// ---------
	/**
	    @brief Initialisiert den Manager f�r einen neuen Frame.
	    @remark Alle Ver�nderungen an Objekten m�ssen nach einem Aufruf dieser Methode geschehen, damit sichergestellt ist, dass diese
	            visuell umgesetzt werden.<br>
	            Mit dem Aufruf dieser Methode werden die R�ckgabewerte von GetUpdateRects() und GetUpdateRectCount() auf ihre Startwerte
	            zur�ckgesetzt. Wenn man also mit diesen Werten arbeiten m�chten, muss man dies nach einem Aufruf von Render() und vor
	            einem Aufruf von StartFrame() tun.
	 */
	void startFrame();
	/**
	    @brief Rendert alle Objekte die sich w�hrend des letzten Aufrufes von Render() ver�ndert haben.
	    @return Gibt false zur�ck, falls das Rendern fehlgeschlagen ist.
	 */
	bool render();
	/**
	    @brief Gibt einen Pointer auf die Wurzel des Objektbaumes zur�ck.
	 */
	RenderObjectPtr<RenderObject> getTreeRoot() {
		return _rootPtr;
	}
	/**
	    @brief F�gt ein BS_TimedRenderObject in die Liste der zeitabh�ngigen Render-Objekte.

	    Alle Objekte die sich in dieser Liste befinden werden vor jedem Frame �ber die seit dem letzten Frame
	    vergangene Zeit informiert, so dass sich ihren Zustand zeitabh�ngig ver�ndern k�nnen.

	    @param RenderObject das einzuf�gende BS_TimedRenderObject
	*/
	void attatchTimedRenderObject(RenderObjectPtr<TimedRenderObject> pRenderObject);
	/**
	    @brief Entfernt ein BS_TimedRenderObject aus der Liste f�r zeitabh�ngige Render-Objekte.
	*/
	void detatchTimedRenderObject(RenderObjectPtr<TimedRenderObject> pRenderObject);

	virtual bool persist(OutputPersistenceBlock &writer);
	virtual bool unpersist(InputPersistenceBlock &reader);

private:
	bool _frameStarted;
	typedef Common::Array<RenderObjectPtr<TimedRenderObject> > RenderObjectList;
	RenderObjectList _timedRenderObjects;

	MicroTileArray *_uta;
	RenderObjectQueue *_currQueue, *_prevQueue;

	// RenderObject-Tree Variablen
	// ---------------------------
	// Der Baum legt die hierachische Ordnung der BS_RenderObjects fest.
	// Zu weiteren Informationen siehe: "renderobject.h"
	RenderObjectPtr<RenderObject>     _rootPtr;      // Die Wurzel der Baumes
};

} // End of namespace Sword25

#endif