Orxonox  0.0.5 Codename: Arcturus
OgreCEGUIRenderer.h
Go to the documentation of this file.
1 /************************************************************************
2  filename: OgreCEGUIRenderer.h
3  created: 11/5/2004
4  author: Paul D Turner
5 
6  purpose: Interface for main Ogre GUI renderer class
7 *************************************************************************/
8 /*************************************************************************
9  Crazy Eddie's GUI System (http://www.cegui.org.uk)
10  Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk)
11 
12  This library is free software; you can redistribute it and/or
13  modify it under the terms of the GNU Lesser General Public
14  License as published by the Free Software Foundation; either
15  version 2.1 of the License, or (at your option) any later version.
16 
17  This library is distributed in the hope that it will be useful,
18  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  Lesser General Public License for more details.
21 
22  You should have received a copy of the GNU Lesser General Public
23  License along with this library; if not, write to the Free Software
24  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 *************************************************************************/
26 /*************************************************************************
27  This file contains code that is specific to Ogre (http://www.ogre3d.org)
28 *************************************************************************/
29 #ifndef _OgreCEGUIRenderer_h_
30 #define _OgreCEGUIRenderer_h_
31 
32 #include <CEGUIBase.h>
33 #include <CEGUIRenderer.h>
34 #include <CEGUITexture.h>
35 
36 #include <OgreRenderQueueListener.h>
37 #include <OgreSceneManagerEnumerator.h>
38 #include <OgreTextureUnitState.h>
39 
40 #if (OGRE_PLATFORM == OGRE_PLATFORM_WIN32) && !defined(OGRE_GUIRENDERER_STATIC_LIB)
41 # ifdef OGRE_GUIRENDERER_EXPORTS
42 # define OGRE_GUIRENDERER_API __declspec(dllexport)
43 # else
44 # if defined(__MINGW32__)
45 # define OGRE_GUIRENDERER_API
46 # else
47 # define OGRE_GUIRENDERER_API __declspec(dllimport)
48 # endif
49 # endif
50 #elif defined ( OGRE_GCC_VISIBILITY )
51 # define OGRE_GUIRENDERER_API __attribute__ ((visibility("default")))
52 #else
53 # define OGRE_GUIRENDERER_API
54 #endif
55 
56 
57 // Start of CEGUI namespace section
58 namespace CEGUI
59 {
60 /*************************************************************************
61  Forward refs
62 *************************************************************************/
63 class OgreCEGUITexture;
64 class OgreCEGUIRenderer;
65 
66 
71 class _OgrePrivate CEGUIRQListener : public Ogre::RenderQueueListener
72 {
73 public:
74  CEGUIRQListener(OgreCEGUIRenderer* renderer, Ogre::uint8 queue_id, bool post_queue)
75  {
76  d_renderer = renderer;
77  d_queue_id = queue_id;
78  d_post_queue = post_queue;
79  }
80 
81  virtual ~CEGUIRQListener() {}
82 
83  virtual void renderQueueStarted(Ogre::uint8 id, const Ogre::String& invocation, bool& skipThisQueue);
84  virtual void renderQueueEnded(Ogre::uint8 id, const Ogre::String& invocation, bool& repeatThisQueue);
85 
86  // methods for adjusting target queue settings
87  void setTargetRenderQueue(Ogre::uint8 queue_id) {d_queue_id = queue_id;}
88  void setPostRenderQueue(bool post_queue) {d_post_queue = post_queue;}
89 
90 private:
91  /*************************************************************************
92  Implementation Data
93  *************************************************************************/
95  Ogre::uint8 d_queue_id;
96  bool d_post_queue;
97 };
98 
99 
105 {
106 public:
126  OgreCEGUIRenderer(Ogre::RenderWindow* window,
127  Ogre::uint8 queue_id = Ogre::RENDER_QUEUE_OVERLAY,
128  bool post_queue = false, uint max_quads = 0);
129 
130 
151  OgreCEGUIRenderer(Ogre::RenderWindow* window, Ogre::uint8 queue_id, bool post_queue, uint max_quads, Ogre::SceneManager* scene_manager);
152 
153 
158  virtual ~OgreCEGUIRenderer(void);
159 
160 
161 
162  // add's a quad to the list to be rendered
163  virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode);
164 
165  // perform final rendering for all queued renderable quads.
166  virtual void doRender(void);
167 
168  // clear the queue
169  virtual void clearRenderList(void);
170 
171 
187  virtual void setQueueingEnabled(bool setting) {d_queueing = setting;}
188 
189 
190  // create an empty texture
191  virtual Texture* createTexture(void);
192 
193  // create a texture and load it with the specified file.
194  virtual Texture* createTexture(const String& filename, const String& resourceGroup = "General");
195 
196  // create a texture and set it to the specified size
197  virtual Texture* createTexture(float size);
198 
199  // create an OGRE resource provider.
200  virtual ResourceProvider* createResourceProvider(void);
201 
202  // destroy the given texture
203  virtual void destroyTexture(Texture* texture);
204 
205  // destroy all textures still active
206  virtual void destroyAllTextures(void);
207 
208 
216  virtual bool isQueueingEnabled(void) const {return d_queueing;}
217 
218 
226  virtual float getWidth(void) const {return d_display_area.getWidth();}
227 
228 
236  virtual float getHeight(void) const {return d_display_area.getHeight();}
237 
238 
246  virtual Size getSize(void) const {return d_display_area.getSize();}
247 
248 
257  virtual Rect getRect(void) const {return d_display_area;}
258 
259 
267  virtual uint getMaxTextureSize(void) const {return 2048;} // TODO: Change to proper value
268 
269 
277  virtual uint getHorzScreenDPI(void) const {return 96;}
278 
279 
287  virtual uint getVertScreenDPI(void) const {return 96;}
288 
289 
304  void setTargetSceneManager(Ogre::SceneManager* scene_manager);
305 
306 
321  void setTargetRenderQueue(Ogre::uint8 queue_id, bool post_queue);
322 
323 
339  Texture* createTexture(Ogre::TexturePtr& texture);
340 
341 
359  void setDisplaySize(const Size& sz);
360 
361 
362 private:
363  /************************************************************************
364  Implementation Constants
365  ************************************************************************/
366  static const size_t VERTEX_PER_QUAD;
367  static const size_t VERTEX_PER_TRIANGLE;
368  static const size_t VERTEXBUFFER_INITIAL_CAPACITY;
369  static const size_t UNDERUSED_FRAME_THRESHOLD;
370 
371  /*************************************************************************
372  Implementation Structs & classes
373  *************************************************************************/
378  struct QuadVertex {
379  float x, y, z;
380  Ogre::RGBA diffuse;
381  float tu1, tv1;
382  };
383 
388  struct QuadInfo
389  {
390  Ogre::TexturePtr texture;
391  Rect position;
392  float z;
394  uint32 topLeftCol;
395  uint32 topRightCol;
398 
399  QuadSplitMode splitMode;
400 
401  bool operator<(const QuadInfo& other) const
402  {
403  // this is intentionally reversed.
404  return z > other.z;
405  }
406  };
407 
408 
409  /*************************************************************************
410  Implementation Methods
411  *************************************************************************/
412  // setup states etc
413  void initRenderStates(void);
414 
415  // sort quads list according to texture
416  void sortQuads(void);
417 
418  // render a quad directly to the display
419  void renderQuadDirect(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode);
420 
421  // convert colour value to whatever the Ogre render system is expecting.
422  uint32 colourToOgre(const colour& col) const;
423 
424  // perform main work of the constructor. This does everything except the final hook into the render system.
425  void constructor_impl(Ogre::RenderWindow* window, Ogre::uint8 queue_id, bool post_queue, uint max_quads);
426 
427 
428  /*************************************************************************
429  Implementation Data
430  *************************************************************************/
432 
433  typedef std::multiset<QuadInfo> QuadList;
434  QuadList d_quadlist;
435  bool d_queueing;
436 
437  // Ogre specific bits.
438  Ogre::Root* d_ogre_root;
439  Ogre::RenderSystem* d_render_sys;
440  Ogre::uint8 d_queue_id;
441  Ogre::TexturePtr d_currTexture;
442  Ogre::RenderOperation d_render_op;
443  Ogre::HardwareVertexBufferSharedPtr d_buffer;
445  Ogre::RenderOperation d_direct_render_op;
446  Ogre::HardwareVertexBufferSharedPtr d_direct_buffer;
447  Ogre::SceneManager* d_sceneMngr;
448  Ogre::LayerBlendModeEx d_colourBlendMode;
449  Ogre::LayerBlendModeEx d_alphaBlendMode;
450  Ogre::TextureUnitState::UVWAddressingMode d_uvwAddressMode;
451 
454  size_t d_bufferPos;
455  bool d_sorted;
457 
458  std::list<OgreCEGUITexture*> d_texturelist;
459 };
460 
461 } // End of CEGUI namespace section
462 
463 
464 #endif // end of guard _OgreCEGUIRenderer_h_
bool d_sorted
true when data in quad list is sorted.
Definition: OgreCEGUIRenderer.h:455
virtual uint getMaxTextureSize(void) const
Return the maximum texture size available.
Definition: OgreCEGUIRenderer.h:267
uint32 topLeftCol
Definition: OgreCEGUIRenderer.h:394
float z
The position for the vertex.
Definition: OgreCEGUIRenderer.h:379
std::multiset< QuadInfo > QuadList
Definition: OgreCEGUIRenderer.h:433
Ogre::RenderOperation d_direct_render_op
Renderop for cursor.
Definition: OgreCEGUIRenderer.h:445
uint32 bottomRightCol
Definition: OgreCEGUIRenderer.h:397
Ogre::Root * d_ogre_root
pointer to the Ogre root object that we attach to
Definition: OgreCEGUIRenderer.h:438
OgreCEGUIRenderer * d_renderer
CEGUI renderer object for Ogre.
Definition: OgreCEGUIRenderer.h:94
static const size_t VERTEXBUFFER_INITIAL_CAPACITY
initial capacity of the allocated vertex buffer
Definition: OgreCEGUIRenderer.h:368
Ogre::RenderSystem * d_render_sys
Pointer to the render system for Ogre.
Definition: OgreCEGUIRenderer.h:439
virtual Size getSize(void) const
Return the size of the display in pixels.
Definition: OgreCEGUIRenderer.h:246
Ogre::HardwareVertexBufferSharedPtr d_direct_buffer
Renderop for cursor.
Definition: OgreCEGUIRenderer.h:446
std::list< OgreCEGUITexture * > d_texturelist
List used to track textures.
Definition: OgreCEGUIRenderer.h:458
Rect texPosition
Definition: OgreCEGUIRenderer.h:393
Rect d_display_area
Definition: OgreCEGUIRenderer.h:431
bool d_post_queue
true if we render after everything else in our queue.
Definition: OgreCEGUIRenderer.h:453
float tv1
texture coordinates
Definition: OgreCEGUIRenderer.h:381
Ogre::uint8 d_queue_id
ID of the queue that we are hooked into.
Definition: OgreCEGUIRenderer.h:440
void setTargetRenderQueue(Ogre::uint8 queue_id)
Definition: OgreCEGUIRenderer.h:87
uint32 bottomLeftCol
Definition: OgreCEGUIRenderer.h:396
size_t d_underused_framecount
Number of frames elapsed since buffer utilization was above half the capacity.
Definition: OgreCEGUIRenderer.h:444
Ogre::ColourValue colour(const btVector3 &color, btScalar alpha)
Definition: OgreBulletUtils.h:41
Ogre::RenderOperation d_render_op
Ogre render operation we use to do our stuff.
Definition: OgreCEGUIRenderer.h:442
void setPostRenderQueue(bool post_queue)
Definition: OgreCEGUIRenderer.h:88
Renderer class to interface with Ogre engine.
Definition: OgreCEGUIRenderer.h:104
CEGUIRQListener(OgreCEGUIRenderer *renderer, Ogre::uint8 queue_id, bool post_queue)
Definition: OgreCEGUIRenderer.h:74
Ogre::RGBA diffuse
colour of the vertex
Definition: OgreCEGUIRenderer.h:380
Definition: OgreCEGUIRenderer.cpp:46
structure used for all vertices.
Definition: OgreCEGUIRenderer.h:378
CEGUIRQListener * d_ourlistener
Definition: OgreCEGUIRenderer.h:452
Ogre::TextureUnitState::UVWAddressingMode d_uvwAddressMode
Definition: OgreCEGUIRenderer.h:450
virtual uint getVertScreenDPI(void) const
Return the vertical display resolution dpi.
Definition: OgreCEGUIRenderer.h:287
structure holding details about a quad to be drawn
Definition: OgreCEGUIRenderer.h:388
virtual float getHeight(void) const
Return the current height of the display in pixels.
Definition: OgreCEGUIRenderer.h:236
QuadSplitMode splitMode
Definition: OgreCEGUIRenderer.h:399
virtual ~CEGUIRQListener()
Definition: OgreCEGUIRenderer.h:81
static const size_t VERTEX_PER_TRIANGLE
number of vertices for a triangle
Definition: OgreCEGUIRenderer.h:367
Ogre::TexturePtr texture
Definition: OgreCEGUIRenderer.h:390
size_t d_bufferPos
index into buffer where next vertex should be put.
Definition: OgreCEGUIRenderer.h:454
virtual void setQueueingEnabled(bool setting)
Enable or disable the queueing of quads from this point on.
Definition: OgreCEGUIRenderer.h:187
bool d_post_queue
true if we render after everything else in our queue.
Definition: OgreCEGUIRenderer.h:96
Ogre::LayerBlendModeEx d_colourBlendMode
Controls colour blending mode used.
Definition: OgreCEGUIRenderer.h:448
bool d_queueing
setting for queueing control.
Definition: OgreCEGUIRenderer.h:435
virtual bool isQueueingEnabled(void) const
Return whether queueing is enabled.
Definition: OgreCEGUIRenderer.h:216
bool operator<(const QuadInfo &other) const
Definition: OgreCEGUIRenderer.h:401
virtual Rect getRect(void) const
Return a Rect describing the screen.
Definition: OgreCEGUIRenderer.h:257
Rect position
Definition: OgreCEGUIRenderer.h:391
Point d_texelOffset
Offset required for proper texel mapping.
Definition: OgreCEGUIRenderer.h:456
Ogre::SceneManager * d_sceneMngr
The scene manager we are hooked into.
Definition: OgreCEGUIRenderer.h:447
virtual float getWidth(void) const
Return the current width of the display in pixels.
Definition: OgreCEGUIRenderer.h:226
uint32 topRightCol
Definition: OgreCEGUIRenderer.h:395
Ogre::uint8 d_queue_id
ID of the queue that we are hooked into.
Definition: OgreCEGUIRenderer.h:95
Ogre::TexturePtr d_currTexture
currently set texture;
Definition: OgreCEGUIRenderer.h:441
Ogre::LayerBlendModeEx d_alphaBlendMode
Controls alpha blending mode used.
Definition: OgreCEGUIRenderer.h:449
RenderQueueListener based class used to hook into the ogre rendering system.
Definition: OgreCEGUIRenderer.h:71
float z
Definition: OgreCEGUIRenderer.h:392
static const size_t VERTEX_PER_QUAD
number of vertices per quad
Definition: OgreCEGUIRenderer.h:366
static const size_t UNDERUSED_FRAME_THRESHOLD
number of frames to wait before shrinking buffer
Definition: OgreCEGUIRenderer.h:369
Ogre::HardwareVertexBufferSharedPtr d_buffer
vertex buffer to queue sprite rendering
Definition: OgreCEGUIRenderer.h:443
#define OGRE_GUIRENDERER_API
Definition: OgreCEGUIRenderer.h:47
QuadList d_quadlist
Definition: OgreCEGUIRenderer.h:434
virtual uint getHorzScreenDPI(void) const
Return the horizontal display resolution dpi.
Definition: OgreCEGUIRenderer.h:277