ScummVM API documentation
renderobject.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 /*
23  * This code is based on Broken Sword 2.5 engine
24  *
25  * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer
26  *
27  * Licensed under GNU GPL v2
28  *
29  */
30 
31 /*
32  BS_RenderObject
33  ---------------
34  Dieses ist die Klasse die sämtliche sichtbaren Objekte beschreibt. Alle anderen sichtbaren Objekte müssen von ihr abgeleitet werden.
35  Diese Klasse erledigt Aufgaben wie: minimales Neuzeichnen, Renderreihenfolge, Objekthierachie.
36  Alle BS_RenderObject Instanzen werden von einem BS_RenderObjectManager in einem Baum verwaltet.
37 
38  Autor: Malte Thiesen
39 */
40 
41 #ifndef SWORD25_RENDEROBJECT_H
42 #define SWORD25_RENDEROBJECT_H
43 
44 #include "sword25/kernel/common.h"
45 #include "sword25/kernel/persistable.h"
46 #include "common/rect.h"
47 #include "sword25/gfx/graphicengine.h"
48 #include "sword25/gfx/renderobjectptr.h"
49 
50 #include "common/list.h"
51 
52 namespace Sword25 {
53 
54 class Kernel;
55 class RenderObjectManager;
56 class RenderObjectQueue;
57 class RectangleList;
58 class Bitmap;
59 class Animation;
60 class AnimationTemplate;
61 class Panel;
62 class Text;
63 
64 // Klassendefinition
72 class RenderObject {
73 public:
74  // Konstanten
75  // ----------
76  enum TYPES {
81  TYPE_DYNAMICBITMAP,
90  };
91 
92  // Add-Methoden
93  // ------------
94 
109  RenderObjectPtr<Bitmap> addDynamicBitmap(uint width, uint height);
135  RenderObjectPtr<Panel> addPanel(int width, int height, uint color = BS_RGB(0, 0, 0));
144  RenderObjectPtr<Text> addText(const Common::String &font, const Common::String &text = "");
145 
146  // Cast-Methoden
147  // -------------
154  if (_type == TYPE_STATICBITMAP || _type == TYPE_DYNAMICBITMAP)
155  return RenderObjectPtr<Bitmap>(this->getHandle());
156  else
157  return RenderObjectPtr<Bitmap>();
158  }
165  if (_type == TYPE_ANIMATION)
166  return RenderObjectPtr<Animation>(this->getHandle());
167  else
169  }
176  if (_type == TYPE_PANEL)
177  return RenderObjectPtr<Panel>(this->getHandle());
178  else
179  return RenderObjectPtr<Panel>();
180  }
187  if (_type == TYPE_TEXT)
188  return RenderObjectPtr<Text>(this->getHandle());
189  else
190  return RenderObjectPtr<Text>();
191  }
192 
193  // Konstruktor / Desktruktor
194  // -------------------------
211  RenderObject(RenderObjectPtr<RenderObject> pParent, TYPES type, uint handle = 0);
212  virtual ~RenderObject();
213 
214  // Interface
215  // ---------
216 
217  void preRender(RenderObjectQueue *renderQueue);
218 
226  bool render(RectangleList *updateRects, const Common::Array<int> &updateRectsMinZ);
227 
234  bool updateObjectState();
238  void deleteAllChildren();
239 
240  // Accessor-Methoden
241  // -----------------
247  virtual void setPos(int x, int y);
252  virtual void setX(int x);
257  virtual void setY(int y);
267  virtual void setZ(int z);
273  virtual void setVisible(bool visible);
277  virtual int getX() const {
278  return _x;
279  }
283  virtual int getY() const {
284  return _y;
285  }
289  virtual int getAbsoluteX() const {
290  return _absoluteX;
291  }
295  virtual int getAbsoluteY() const {
296  return _absoluteY;
297  }
305  int getZ() const {
306  return _z;
307  }
308 
309  int getAbsoluteZ() const {
310  return _absoluteZ;
311  }
312 
316  int getWidth() const {
317  return _width;
318  }
322  int getHeight() const {
323  return _height;
324  }
330  bool isVisible() const {
331  return _visible;
332  }
336  TYPES getType() const {
337  return _type;
338  }
343  bool getInitSuccess() const {
344  return _initSuccess;
345  }
350  const Common::Rect &getBbox() const {
351  return _bbox;
352  }
356  void forceRefresh() {
357  _refreshForced = true;
358  }
362  uint32 getHandle() const {
363  return _handle;
364  }
365 
366  // Get the RenderObjects current version
367  int getVersion() const {
368  return _version;
369  }
370 
371  bool isSolid() const {
372  return _isSolid;
373  }
374 
375  // Persistenz-Methoden
376  // -------------------
377  virtual bool persist(OutputPersistenceBlock &writer);
378  virtual bool unpersist(InputPersistenceBlock &reader);
379  // TODO: Evtl. protected
380  bool persistChildren(OutputPersistenceBlock &writer);
381  bool unpersistChildren(InputPersistenceBlock &reader);
382  // TODO: Evtl. private
383  RenderObjectPtr<RenderObject> recreatePersistedRenderObject(InputPersistenceBlock &reader);
384 
385 protected:
386  // Typen
387  // -----
390 
391  int32 _x;
392  int32 _y;
393  int32 _z;
394  int32 _absoluteX;
395  int32 _absoluteY;
396  int32 _absoluteZ;
397  int32 _width;
398  int32 _height;
399  bool _visible;
404 
405  // Kopien der Variablen, die für die Errechnung des Dirty-Rects und zur Bestimmung der Objektveränderung notwendig sind
406  Common::Rect _oldBbox;
407  int32 _oldX;
408  int32 _oldY;
409  int32 _oldZ;
410  bool _oldVisible;
411 
412  static int _nextGlobalVersion;
413 
414  int32 _version;
415 
416  // This should be set to true if the RenderObject is NOT alpha-blended to optimize drawing
417  bool _isSolid;
418 
421 
422  // Render-Methode
423  // --------------
433  virtual bool doRender(RectangleList *updateRects) = 0; // { return true; }
434 
435  // RenderObject-Baum Variablen
436  // ---------------------------
437  // Der Baum legt die hierachische Ordnung der BS_RenderObjects fest.
438  // Alle Eigenschaften wie X, Y, Z und Visible eines BS_RenderObjects sind relativ zu denen seines Vaters.
439  // Außerdem sind die Objekte von links nach rechts in ihrer Renderreihenfolge sortiert.
440  // Das primäre Sortierkriterium ist hierbei der Z-Wert und das sekundäre der Y-Wert (von oben nach unten).
441  // Beispiel:
442  // Screen
443  // / | \.
444  // / | \.
445  // / | \.
446  // / | \.
447  // Background Interface Maus
448  // / \ / | \.
449  // / \ / | \.
450  // George Tür Icn1 Icn2 Icn3
451  //
452  // Wenn jetzt das Interface mit SetVisible() ausgeblendet würde, verschwinden auch die Icons, die sich im Interface
453  // befinden.
454  // Wenn der Hintergrund bewegt wird (Scrolling), bewegen sich auch die darauf befindlichen Gegenstände und Personen.
455 
459  RENDEROBJECT_LIST _children;
460 
465  return _managerPtr;
466  }
473 
474 private:
476  bool _refreshForced;
477 
478  uint32 _handle;
479 
485  bool detatchChildren(RenderObjectPtr<RenderObject> pObject);
489  void updateBoxes();
494  Common::Rect calcBoundingBox() const;
499  Common::Rect calcDirtyRect() const;
503  void calcAbsolutePos(int32 &x, int32 &y, int32 &z) const;
507  int32 calcAbsoluteX() const;
511  int32 calcAbsoluteY() const;
512 
513  int32 calcAbsoluteZ() const;
514 
518  void sortRenderObjects();
522  void validateObject();
529  void updateAbsolutePos();
534  void signalChildChange() {
535  _childChanged = true;
536  }
543  bool getObjectIntersection(RenderObjectPtr<RenderObject> pObject, Common::Rect &result);
548  static bool greater(const RenderObjectPtr<RenderObject> lhs, const RenderObjectPtr<RenderObject> rhs);
549 };
550 
551 } // End of namespace Sword25
552 
553 #endif
void forceRefresh()
Stellt sicher, dass das Objekt im nächsten Frame neu gezeichnet wird.
Definition: renderobject.h:356
int getHeight() const
Gibt die Höhe des Objektes zurück.
Definition: renderobject.h:322
Definition: str.h:59
bool _visible
Ist true, wenn das Objekt sichtbar ist.
Definition: renderobject.h:399
Ein unbekannter Objekttyp. Diesen Typ sollte kein Renderobjekt annehmen.
Definition: renderobject.h:89
Ein Image. Siehe BS_Bitmap.
Definition: renderobject.h:80
RenderObjectPtr< Panel > toPanel()
Castet das Objekt zu einem BS_Panel-Objekt wenn zulässig.
Definition: renderobject.h:175
virtual void setY(int y)
Setzt die Position des Objektes auf der Y-Achse.
Das Wurzelobjekt. Siehe BS_RenderObjectManager.
Definition: renderobject.h:78
TYPES _type
Der Objekttyp.
Definition: renderobject.h:401
bool _childChanged
Ist true, wenn sich ein Kinderobjekt verändert hat.
Definition: renderobject.h:400
bool getInitSuccess() const
Gibt zurück, ob das Objekt erfolgreich initialisiert wurde.
Definition: renderobject.h:343
RenderObjectPtr< Bitmap > addDynamicBitmap(uint width, uint height)
Erzeugt ein veränderbares Bitmap als Kinderobjekt des Renderobjektes.
int32 _width
Die Breite des Objektes.
Definition: renderobject.h:397
int32 _absoluteY
Die absolute Y-Position des Objektes.
Definition: renderobject.h:395
Definition: renderobjectptr.h:46
RenderObjectPtr< Animation > toAnimation()
Castet das Objekt zu einem BS_Animation-Objekt wenn zulässig.
Definition: renderobject.h:164
TYPES
Definition: renderobject.h:76
RENDEROBJECT_LIST _children
Die Liste der Kinderobjekte nach der Renderreihenfolge geordnet.
Definition: renderobject.h:459
Definition: list.h:44
virtual int getY() const
Gibt die Position des Objektes auf der Y-Achse relativ zum Elternobjekt zurück.
Definition: renderobject.h:283
RenderObjectPtr< Animation > addAnimation(const Common::String &fileName)
Erzeugt eine Animation auf Basis einer Animationsdatei als Kinderobjekt des Renderobjektes.
int32 _x
Die X-Position des Objektes relativ zum Eltern-Objekt.
Definition: renderobject.h:391
Definition: rect.h:144
bool updateObjectState()
Bereitet das Objekt und alle seine Unterobjekte auf einen Rendervorgang vor. Hierbei werden alle Dirt...
RenderObject(RenderObjectPtr< RenderObject > pParent, TYPES type, uint handle=0)
Erzeugt ein neues BS_RenderObject.
int32 _absoluteX
Die absolute X-Position des Objektes.
Definition: renderobject.h:394
int getWidth() const
Gibt die Breite des Objektes zurück.
Definition: renderobject.h:316
Eine farbige Fläche. Siehe BS_Panel.
Definition: renderobject.h:85
Definition: microtiles.h:38
bool _initSuccess
Ist true, wenn Objekt erfolgreich intialisiert werden konnte.
Definition: renderobject.h:402
RenderObjectPtr< RenderObject > _parentPtr
Ein Pointer auf das Elternobjekt.
Definition: renderobject.h:457
Diese Klasse ist für die Verwaltung von BS_RenderObjects zuständig.
Definition: renderobjectmanager.h:78
TYPES getType() const
Gibt den Typ des Objektes zurück.
Definition: renderobject.h:336
uint32 getHandle() const
Gibt das Handle des Objekte zurück.
Definition: renderobject.h:362
bool isVisible() const
Gibt den Sichtbarkeitszustand des Objektes zurück.
Definition: renderobject.h:330
RenderObjectPtr< Panel > addPanel(int width, int height, uint color=BS_RGB(0, 0, 0))
Erzeugt ein neues Farbpanel als Kinderobjekt des Renderobjektes.
const Common::Rect & getBbox() const
Gibt die Bounding-Box des Objektes zurück.
Definition: renderobject.h:350
RenderObjectPtr< Bitmap > addBitmap(const Common::String &fileName)
Erzeugt ein Bitmap als Kinderobjekt des Renderobjektes.
virtual int getAbsoluteY() const
Gibt die absolute Position des Objektes auf der Y-Achse zurück.
Definition: renderobject.h:295
Definition: console.h:27
bool addObject(RenderObjectPtr< RenderObject > pObject)
Fügt dem Objekt ein neues Kinderobjekt hinzu.
int32 _y
Die Y-Position des Objektes relativ zum Eltern-Objekt.
Definition: renderobject.h:392
bool render(RectangleList *updateRects, const Common::Array< int > &updateRectsMinZ)
Rendert des Objekt und alle seine Unterobjekte.
virtual int getAbsoluteX() const
Gibt die absolute Position des Objektes auf der X-Achse zurück.
Definition: renderobject.h:289
int32 _height
Die Höhe des Objektes.
Definition: renderobject.h:398
RenderObjectManager * _managerPtr
Ein Pointer auf den BS_RenderObjektManager, der das Objekt verwaltet.
Definition: renderobject.h:420
RenderObjectPtr< Text > toText()
Castet das Object zu einem BS_Text-Objekt wenn zulässig.
Definition: renderobject.h:186
virtual void setZ(int z)
Setzt den Z-Wert des Objektes.
Ein Text. Siehe BS_Text.
Definition: renderobject.h:87
virtual void setPos(int x, int y)
Setzt die Position des Objektes.
Definition: animationtemplate.h:46
Eine Animation. Siehe BS_Animation.
Definition: renderobject.h:83
virtual void setX(int x)
Setzt die Position des Objektes auf der X-Achse.
void deleteAllChildren()
Löscht alle Kinderobjekte.
virtual bool doRender(RectangleList *updateRects)=0
Einschubmethode, die den tatsächlichen Redervorgang durchführt.
virtual void setVisible(bool visible)
Setzt die Sichtbarkeit eine Objektes.
Definition: inputpersistenceblock.h:40
RenderObjectPtr< Bitmap > toBitmap()
Castet das Objekt zu einem BS_Bitmap-Objekt wenn zulässig.
Definition: renderobject.h:153
Definition: list_intern.h:51
RenderObjectManager * getManager() const
Gibt einen Pointer auf den BS_RenderObjektManager zurück, der das Objekt verwaltet.
Definition: renderobject.h:464
Dieses ist die Klasse die sämtliche sichtbaren Objekte beschreibt.
Definition: renderobject.h:72
int32 _z
Der Z-Wert des Objektes relativ zum Eltern-Objekt.
Definition: renderobject.h:393
virtual int getX() const
Gibt die Position des Objektes auf der X-Achse relativ zum Elternobjekt zurück.
Definition: renderobject.h:277
int getZ() const
Gibt den Z-Wert des Objektes relativ zum Elternobjekt zurück.
Definition: renderobject.h:305
RenderObjectPtr< Text > addText(const Common::String &font, const Common::String &text="")
Erzeugt ein Textobjekt als Kinderobjekt des Renderobjektes.
Common::Rect _bbox
Die Bounding-Box des Objektes in Bildschirmkoordinaten.
Definition: renderobject.h:403
Definition: outputpersistenceblock.h:39
Definition: renderobjectmanager.h:66