nux-0.9.46

NuxGraphics/GraphicsEngine.h

Go to the documentation of this file.
00001 /*
00002  * Copyright 2010 Inalogic® Inc.
00003  *
00004  * This program is free software: you can redistribute it and/or modify it
00005  * under the terms of the GNU Lesser General Public License, as
00006  * published by the  Free Software Foundation; either version 2.1 or 3.0
00007  * of the License.
00008  *
00009  * This program is distributed in the hope that it will be useful, but
00010  * WITHOUT ANY WARRANTY; without even the implied warranties of
00011  * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
00012  * PURPOSE.  See the applicable version of the GNU Lesser General Public
00013  * License for more details.
00014  *
00015  * You should have received a copy of both the GNU Lesser General Public
00016  * License along with this program. If not, see <http://www.gnu.org/licenses/>
00017  *
00018  * Authored by: Jay Taoko <jaytaoko@inalogic.com>
00019  *
00020  */
00021 
00022 
00023 #ifndef OPENGLENGINE_H
00024 #define OPENGLENGINE_H
00025 
00026 #include "GLResource.h"
00027 #include "GpuDevice.h"
00028 #include "GLDeviceObjects.h"
00029 #include "GLResourceManager.h"
00030 #include "GLTextureResourceManager.h"
00031 #include "GLVertexResourceManager.h"
00032 #include "GLRenderStates.h"
00033 #include "FontTexture.h"
00034 #include "RenderingPipe.h"
00035 #include "GLShader.h"
00036 
00037 #if defined(NUX_OS_WINDOWS)
00038   #include "GraphicsDisplay.h"
00039   #include "GLWindowManager.h"
00040 #elif defined(NUX_OS_LINUX)
00041   #include "GraphicsDisplay.h"
00042   #include "GLWindowManager.h"
00043 #endif
00044 
00045 namespace nux
00046 {
00047 
00048   class FontTexture;
00049   class FontRenderer;
00050   class FilePath;
00051   class BaseTexture;
00052   class TextureRectangle;
00053 
00054   class ROPConfig
00055   {
00056   public:
00057     ROPConfig();
00058     ~ROPConfig();
00059 
00060     bool Blend;
00061     t_u32 SrcBlend;
00062     t_u32 DstBlend;
00063 
00064     static ROPConfig Default;
00065   };
00066 
00067   class BlendOperator
00068   {
00069   public:
00070     BlendOperator ();
00071     ~BlendOperator ();
00072 
00073     void EnableBlending (bool enable);
00074     void SetPorterDuffOperator (PorterDuffOperator op);
00075     void SetCustomBlendOperator (unsigned int src_blend, unsigned int dst_blend);
00076 
00077     bool  _enable;
00078     unsigned int _src_blend;
00079     unsigned int _dst_blend;
00080   };
00081 
00082   typedef struct
00083   {
00084     int x;
00085     int y;
00086     int width;
00087     int height;
00088 
00089   } OpenGLContext;
00090 
00092   class GraphicsEngine
00093   {
00094   public:
00099     GraphicsEngine (GraphicsDisplay &GlWindow, bool create_rendering_data = true);
00100     ~GraphicsEngine();
00101 
00102     void SetContext (int x, int y, int width, int height);
00103     void GetContextSize (int &w, int &h) const;
00104     int GetContextWidth() const;
00105     int GetContextHeight() const;
00106     int GetContextX() const;
00107     int GetContextY() const;
00108 
00109     void GetWindowSize (int &w, int &h) const;
00110     int GetWindowWidth() const;
00111     int GetWindowHeight() const;
00112 
00113     OpenGLContext m_CurrrentContext;
00114 
00115     // Load Textures
00116     BaseTexture *Load2DTextureFile (const char *filename);
00117     BaseTexture *Load2DRectangleTextureFile (const char *filename);
00118     BaseTexture *Load2DTextureFileGenerateAlpha (const char *filename, int red, int green, int blue);
00119 
00120     void SetTexture (int TextureUnit, BaseTexture *Texture);
00121     void SetTexture (int TextureUnit, ObjectPtr< IOpenGLBaseTexture > Texture);
00122     void EnableTextureMode (int TextureUnit, int TextureMode);
00123     void DisableTextureMode (int TextureUnit, int TextureMode);
00124     void DisableAllTextureMode (int TextureUnit);
00125 
00126 
00128     // DRAW TEXTURE  //
00130 
00131     // Neutral
00132     void QRP_1Tex (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> Tex0, TexCoordXForm &texxform, const Color &color0);
00133     void QRP_Pixelate (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform, const Color &c0, int pixel_size);
00134     void QRP_Color (int x, int y, int width, int height, const Color &c0);
00135     void QRP_Color (int x, int y, int width, int height, const Color &c0, const Color &c1, const Color &c2, const Color &c3);
00136     void QRP_ColorModTexAlpha (int x, int y, int width, int height,
00137       ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform0, const Color &color);
00138 
00139     void QRP_2Tex (int x, int y, int width, int height,
00140       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00141       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00142 
00143     void QRP_2TexMod (int x, int y, int width, int height,
00144       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00145       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00146 
00147     void QRP_4Tex (int x, int y, int width, int height,
00148       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00149       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1,
00150       ObjectPtr<IOpenGLBaseTexture> DeviceTexture2, TexCoordXForm &texxform2, const Color &color2,
00151       ObjectPtr<IOpenGLBaseTexture> DeviceTexture3, TexCoordXForm &texxform3, const Color &color3);
00152 
00153     void QRP_Triangle (int x0, int y0, int x1, int y1, int x2, int y2, Color c0);
00154     void QRP_Triangle (int x0, int y0, int x1, int y1, int x2, int y2, Color c0, Color c1, Color c2);
00155     void QRP_Line (int x0, int y0, int x1, int y1, Color c0);
00156     void QRP_Line (int x0, int y0, int x1, int y1, Color c0, Color c1);
00157     void QRP_QuadWireframe (int x0, int y0, int width, int height, Color c0, Color c1, Color c2, Color c3);
00158 
00159 
00160     ObjectPtr<IOpenGLBaseTexture> QRP_GetBlurTexture (
00161       int x, int y,
00162       int buffer_width, int buffer_height,
00163       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00164       const Color& c0,
00165       float sigma = 1.0f, int num_pass = 1);
00166 
00167     ObjectPtr<IOpenGLBaseTexture> QRP_GetAlphaTexture (
00168       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00169       const Color& c0);
00170 
00171     ObjectPtr<IOpenGLBaseTexture> QRP_GetColorMatrixTexture (
00172       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00173       const Color& c0,
00174       Matrix4 color_matrix, Vector4 offset);
00175 
00176     ObjectPtr<IOpenGLBaseTexture> QRP_GetPower (
00177       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& c0, const Vector4 &exponent);
00178 
00179     ObjectPtr<IOpenGLBaseTexture> QRP_GetLQBlur (
00180       int x, int y, int buffer_width, int buffer_height,
00181       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00182       const Color& c0);
00183 
00184     ObjectPtr<IOpenGLBaseTexture> QRP_GetHQBlur (
00185       int x, int y, int buffer_width, int buffer_height,
00186       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00187       const Color& c0, float sigma = 1.0f, int num_pass = 1);
00188 
00189     void QRP_DisturbedTexture (
00190       int x, int y, int width, int height,
00191       ObjectPtr<IOpenGLBaseTexture> distorsion_texture, TexCoordXForm &texxform0, const Color& c0,
00192       ObjectPtr<IOpenGLBaseTexture> src_device_texture, TexCoordXForm &texxform1, const Color& c1);
00193 
00194           ObjectPtr<IOpenGLBaseTexture> QRP_GetPixelBlocks (
00195                   ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform0, const Color& c0, int pixel_size);
00196 
00197     // ASM
00198     void QRP_ASM_1Tex (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> Tex0, TexCoordXForm &texxform, const Color &color0);
00199     void QRP_ASM_Pixelate (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform, const Color &c0, int pixel_size);
00200 
00201     void QRP_ASM_Color (int x, int y, int width, int height, const Color &c0);
00202     void QRP_ASM_Color (int x, int y, int width, int height, const Color &c0, const Color &c1, const Color &c2, const Color &c3);
00203     void QRP_ASM_ColorModTexAlpha (int x, int y, int width, int height,
00204                                ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform0, const Color &color);
00205 
00206     void QRP_ASM_2Tex (int x, int y, int width, int height,
00207                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00208                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00209 
00210     void QRP_ASM_2TexMod (int x, int y, int width, int height,
00211       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00212       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00213 
00214     void QRP_ASM_4Tex (int x, int y, int width, int height,
00215                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00216                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1,
00217                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture2, TexCoordXForm &texxform2, const Color &color2,
00218                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture3, TexCoordXForm &texxform3, const Color &color3);
00219 
00220     void QRP_ASM_Triangle (int x0, int y0, int x1, int y1, int x2, int y2, Color c0);
00221     void QRP_ASM_Triangle (int x0, int y0, int x1, int y1, int x2, int y2, Color c0, Color c1, Color c2);
00222     void QRP_ASM_Line (int x0, int y0, int x1, int y1, Color c0);
00223     void QRP_ASM_Line (int x0, int y0, int x1, int y1, Color c0, Color c1);
00224     void QRP_ASM_QuadWireframe (int x0, int y0, int width, int height, Color c0, Color c1, Color c2, Color c3);
00225 
00226     void QRP_ASM_Power  (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, Vector4 exponent);
00227     void QRP_ASM_AlphaReplicate  (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0);
00228     void QRP_ASM_HorizontalGauss (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, float sigma = 1.0f);
00229     void QRP_ASM_VerticalGauss   (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, float sigma = 1.0f);
00230     void QRP_ASM_ColorMatrix     (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, Matrix4 color_matrix, Vector4 offset);
00231 
00233 
00242     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetBlurTexture (
00243       int x, int y, int buffer_width, int buffer_height,
00244       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& color, float sigma = 1.0f, int num_pass = 1);
00245 
00247 
00253     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetAlphaTexture (
00254       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& color);
00255 
00257 
00265     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetColorMatrixTexture (
00266       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00267       const Color& c, Matrix4 color_matrix, Vector4 offset);
00268 
00270 
00278     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetPower (
00279       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& c0, const Vector4 &exponent);
00280 
00281     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetLQBlur (
00282       int x, int y, int buffer_width, int buffer_height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00283       const Color& c0);
00284 
00285     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetHQBlur (
00286       int x, int y, int buffer_width, int buffer_height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00287       const Color& c0, float sigma = 1.0f, int num_pass = 1);
00288 
00289     void QRP_ASM_DisturbedTexture (
00290       int x, int y, int width, int height,
00291       ObjectPtr<IOpenGLBaseTexture> distorsion_texture, TexCoordXForm &texxform0, const Color& c0,
00292       ObjectPtr<IOpenGLBaseTexture> src_device_texture, TexCoordXForm &texxform1, const Color& c1);
00293 
00295 
00302     ObjectPtr<IOpenGLBaseTexture>  QRP_ASM_GetPixelBlocks (
00303                   ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform0, const Color& color, int pixel_size);
00304 
00305     // GLSL
00306 
00307     void QRP_GLSL_1Tex (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform, const Color &c0);
00308     void QRP_GLSL_Pixelate (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform, const Color &c0, int pixel_size);
00309 
00310     void QRP_GLSL_Color (int x, int y, int width, int height, const Color &c0);
00311     void QRP_GLSL_Color (int x, int y, int width, int height, const Color &c0, const Color &c1, const Color &c2, const Color &c3);
00312     void QRP_GLSL_ColorModTexAlpha (int x, int y, int width, int height,
00313                                     ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform0, const Color &color);
00314 
00315     void QRP_GLSL_2Tex (int x, int y, int width, int height,
00316                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00317                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00318 
00319     void QRP_GLSL_2TexMod (int x, int y, int width, int height,
00320       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00321       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00322 
00323 
00324     void QRP_GLSL_4Tex (int x, int y, int width, int height,
00325                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00326                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1,
00327                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture2, TexCoordXForm &texxform2, const Color &color2,
00328                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture3, TexCoordXForm &texxform3, const Color &color3);
00329 
00330     void QRP_GLSL_Triangle      (int x0, int y0, int x1, int y1, int x2, int y2, Color c0);
00331     void QRP_GLSL_Triangle      (int x0, int y0, int x1, int y1, int x2, int y2, Color c0, Color c1, Color c2);
00332     void QRP_GLSL_Line          (int x0, int y0, int x1, int y1, Color c0);
00333     void QRP_GLSL_Line          (int x0, int y0, int x1, int y1, Color c0, Color c1);
00334     void QRP_GLSL_QuadWireframe (int x0, int y0, int width, int height, Color c0, Color c1, Color c2, Color c3);
00335 
00336     void QRP_GLSL_Power           (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, Vector4 exponent);
00337     void QRP_GLSL_AlphaReplicate  (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0);
00338     void QRP_GLSL_HorizontalGauss (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, float sigma = 1.0f);
00339     void QRP_GLSL_VerticalGauss   (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, float sigma = 1.0f);
00340     void QRP_GLSL_HorizontalHQGauss (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, float sigma = 1.0f);
00341     void QRP_GLSL_VerticalHQGauss   (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, float sigma = 1.0f);
00342     void QRP_GLSL_ColorMatrix     (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, Matrix4 color_matrix, Vector4 offset);
00343 
00352     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetBlurTexture (
00353       int x, int y,
00354       int buffer_width, int buffer_height,
00355       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00356       const Color& c0,
00357       float sigma = 1.0f, int num_pass = 1);
00358 
00359     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetAlphaTexture (
00360       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00361       const Color& c0);
00362 
00363     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetColorMatrixTexture (
00364       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00365       const Color& c0,
00366       Matrix4 color_matrix, Vector4 offset);
00367 
00368     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetPower (
00369       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& c0, const Vector4 &exponent);
00370 
00371     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetLQBlur (
00372       int x, int y,
00373       int buffer_width, int buffer_height,
00374       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00375       const Color& c0);
00376 
00377     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetHQBlur (
00378       int x, int y,
00379       int buffer_width, int buffer_height,
00380       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00381       const Color& c0, float sigma = 1.0f, int num_pass = 1);
00382 
00383     void QRP_GLSL_DisturbedTexture (
00384       int x, int y, int width, int height,
00385       ObjectPtr<IOpenGLBaseTexture> distorsion_texture, TexCoordXForm &texxform0, const Color& c0,
00386       ObjectPtr<IOpenGLBaseTexture> src_device_texture, TexCoordXForm &texxform1, const Color& c1);
00387 
00389 
00396           ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetPixelBlocks (
00397                   ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform0, const Color& c0, int pixel_size);
00398 
00400     // DRAW CLIPPING    //
00402 
00403     mutable std::vector<Rect> ClippingRect;
00404     void PushClippingRectangle (Rect rect);
00405     void PopClippingRectangle ();
00406     void EmptyClippingRegion ();
00408     void ApplyClippingRectangle ();
00409     
00410     void SetGlobalClippingRectangle (Rect rect);
00411     void DisableGlobalClippingRectangle ();
00412 
00414 
00417     void SetClippingRectangle (const Rect &rect);
00418 
00420     void SetOpenGLClippingRectangle (int x, int y, unsigned int width, unsigned int height);
00421 
00422     Rect GetClippingRegion () const;
00423     int GetNumberOfClippingRegions () const;
00424     
00425     void AddClipOffset (int x, int y);  
00426     void PushClipOffset (int x, int y);
00427     void PopClipOffset ();
00428 
00429     void ClearAreaColorDepthStencil (int x, int y, int width, int height, Color clearcolor, float cleardepth, int clearstencil);
00430     void ClearAreaColor (int x, int y, int width, int height, Color clearcolor);
00431     void ClearAreaDepthStencil (int x, int y, int width, int height, float cleardepth, int clearstencil);
00432 
00433     void Set3DView (int w, int h);
00434 
00436     void Push2DWindow (int w, int h);
00437     void Pop2DWindow ();
00438     void Push2DModelViewMatrix (Matrix4 mat);
00439     Matrix4 Pop2DModelViewMatrix ();
00440     void Clear2DModelViewMatrix ();
00441     std::list<Matrix4> m_2DModelViewMatricesStack;
00442 
00443     void SetViewport (int x, int y, int w, int h);
00444     Rect GetViewportRect () const;
00445     int  GetViewportWidth () const;
00446     int  GetViewportHeight () const;
00447     int  GetViewportX () const;
00448     int  GetViewportY () const;
00449 
00450     void  GetViewportSize (int &viewport_width, int &viewport_height) const;
00451 
00452     void SetScissor (int x, int y, int w, int h);
00453 
00461     void SetScissorOffset (int x, int y);
00462 
00463     Rect GetScissorRect();
00464     void EnableScissoring (bool b);
00465 
00466 
00467 //     void LoadPainterImages();
00468 //     const PainterImage* GetImage(UXStyleImageRef style);
00469 //     Rect GetImageGeometry(UXStyleImageRef style);
00470 //     std::list<PainterImage*> m_PainterImageList;
00471 
00472     int RenderColorText (ObjectPtr<FontTexture> Font, int x, int y, const NString &Str,
00473                          const Color &TextColor,
00474                          bool WriteAlphaChannel,
00475                          int NumCharacter);
00476 
00477     int RenderColorTextLineStatic (ObjectPtr<FontTexture> Font, const PageBBox &pageSize, const NString &Str,
00478                                    const Color &TextColor,
00479                                    bool WriteAlphaChannel,
00480                                    TextAlignment alignment);
00481 
00482     int RenderColorTextLineEdit (ObjectPtr<FontTexture> Font, const PageBBox &pageSize, const NString &Str,
00483                                  const Color &TextColor,
00484                                  bool WriteAlphaChannel,
00485                                  const Color &SelectedTextColor,
00486                                  const Color &SelectedTextBackgroundColor,
00487                                  const Color &TextBlinkColor,
00488                                  const Color &CursorColor,
00489                                  bool ShowCursor, unsigned int CursorPosition,
00490                                  int offset = 0, int selection_start = 0, int selection_end = 0);
00491 
00492     ObjectPtr <IOpenGLBaseTexture> CreateTextureFromBackBuffer (int x, int y, int width, int height);
00493 
00494     //Statistics
00495     void ResetStats();
00496 
00503     ObjectPtr<CachedResourceData> CacheResource (ResourceData *Resource);
00504 
00509     void UpdateResource (ResourceData *Resource);
00510 
00511     bool FlushCachedResourceData (ResourceData *Resource);
00512     bool IsResourceCached (ResourceData *Resource);
00513     NResourceCache ResourceCache;
00514 
00515     Matrix4 GetProjectionMatrix ();
00517     Matrix4 GetOpenGLProjectionMatrix ();
00518     
00519     void SetProjectionMatrix (const Matrix4 &matrix);
00520     
00522 
00528     void SetOrthographicProjectionMatrix (int viewport_width, int viewport_height);
00529 
00531     void ResetProjectionMatrix ();
00532 
00533     Matrix4 GetModelViewMatrix ();
00535     Matrix4 GetOpenGLModelViewMatrix ();
00536 
00537     Matrix4 GetModelViewProjectionMatrix ();
00538     Matrix4 GetOpenGLModelViewProjectionMatrix ();
00539 
00540     GpuRenderStates &GetRenderStates()
00541     {
00542       return *_graphics_display.m_DeviceFactory->_gpu_render_states;
00543     }
00544     void ResetRenderStates()
00545     {
00546       _graphics_display.m_DeviceFactory->_gpu_render_states->ResetStateChangeToDefault();
00547     }
00548     void VerifyRenderStates()
00549     {
00550       _graphics_display.m_DeviceFactory->_gpu_render_states->CheckStateChange();
00551     }
00552 
00553     ObjectPtr<FontTexture> GetFont();
00554     ObjectPtr<FontTexture> GetBoldFont();
00555 
00557 
00560     bool UsingGLSLCodePath ();
00561 
00563 
00566     bool UsingARBProgramCodePath ();
00567 
00569     void PushModelViewMatrix (const Matrix4 &matrix);
00570 
00572     void PushIdentityModelViewMatrix ();
00573 
00575 
00578     void Push2DTranslationModelViewMatrix (float tx, float ty, float tz);
00579 
00581 
00584     bool PopModelViewMatrix ();
00585 
00587     void ResetModelViewMatrixStack ();
00588 
00590 
00593     void SetModelViewMatrix (const Matrix4 &matrix);
00594 
00596     void ApplyModelViewMatrix ();
00597 
00599 
00605     Rect ModelViewXFormRect (const Rect& rect);
00606 
00608 
00611     int ModelViewStackDepth ();
00612 
00613 
00614 
00616     void PushProjectionMatrix (const Matrix4 &matrix);
00617 
00619 
00622     bool PopProjectionMatrix ();
00623 
00625 
00628     int ProjectionStackDepth ();
00629 
00630 
00631 
00632 
00633 
00635     void PushPorterDuffBlend (const PorterDuffOperator &porter_duff_op);
00636 
00638     void PushDisableBlend ();
00639 
00641 
00645     void PushBlend (unsigned int src_blend, unsigned int dst_blend);
00646 
00648 
00651     bool PopBlend ();
00652 
00654 
00657     int BlendStackDepth ();
00658 
00659   private:
00660 
00661     ObjectPtr<FontTexture> _normal_font;    
00662     ObjectPtr<FontTexture> _bold_font;      
00663 
00664     void InitShaders();
00665 
00667     void GaussianWeights (float **weights, float sigma, unsigned int num_tap);
00668 
00670     void SetFrameBufferHelper(
00671       ObjectPtr<IOpenGLFrameBufferObject>& fbo,
00672       ObjectPtr<IOpenGLTexture2D>& colorbuffer,
00673       ObjectPtr<IOpenGLTexture2D>& depthbuffer,
00674       int width, int height);
00675 
00676 #ifndef NUX_OPENGLES_20
00677     void InitAsmColorShader();
00679     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmColor;
00680 
00681     void InitAsmTextureShader();
00683     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmTextureModColor;
00685     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmTextureRectModColor;
00686 
00687     void InitAsmPixelateShader();
00689     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPixelate;
00691     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPixelateRect;
00692 
00693     void InitAsmColorModTexMaskAlpha();
00696     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmColorModTexMaskAlpha;
00697     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmColorModTexRectMaskAlpha;
00698 
00699     void InitAsm2TextureAdd();
00701     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm2TextureAdd;
00702     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm2TextureRectAdd;
00703 
00704     void InitAsm2TextureMod();
00706     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm2TextureMod;
00707     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm2TextureRectMod;
00708 
00709     void InitAsm4TextureAdd();
00711     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm4TextureAdd;
00712     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm4TextureRectAdd;
00713 
00714     void InitAsmPower ();
00716 
00719     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_component_exponentiation_prog;
00720     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_component_exponentiation_prog;
00721 
00722     void InitAsmAlphaReplicate ();
00724 
00727     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_alpha_replicate_prog;
00728     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_alpha_replicate_prog;
00729 
00730     void InitAsmSeparableGaussFilter ();
00732     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_separable_gauss_filter_prog;
00733     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_separable_gauss_filter_prog;
00734 
00735 //     void InitAsmSeparableGaussFilter2 ();
00736 //     //! Gauss horizontal filter.
00737 //     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_separable_gauss_filter_prog2;
00738 //     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_separable_gauss_filter_prog2;
00739 
00740     void InitAsmColorMatrixFilter ();
00742     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_color_matrix_filter_prog;
00743     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_color_matrix_filter_prog;
00744 
00745     void InitAsm2TextureDepRead ();
00746     ObjectPtr<IOpenGLAsmShaderProgram> m_ASM2TextureDepRead;
00747     ObjectPtr<IOpenGLAsmShaderProgram> m_ASM2TextureRectDepRead;
00748 
00749     void InitAsmBlendModes();
00750 
00751     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPSBNormal;
00752     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPSBLighten;
00753     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPSBDarken;
00754     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPSBMultiply;
00755 #endif
00756 
00757     void InitSlColorShader();
00759     ObjectPtr<IOpenGLShaderProgram> m_SlColor;
00760 
00761     void InitSlTextureShader();
00763     ObjectPtr<IOpenGLShaderProgram> m_SlTextureModColor;
00764 
00765     void InitSlPixelateShader();
00767     ObjectPtr<IOpenGLShaderProgram> m_SLPixelate;
00768 
00769     void InitSlColorModTexMaskAlpha();
00772     ObjectPtr<IOpenGLShaderProgram> m_SlColorModTexMaskAlpha;
00773     ObjectPtr<IOpenGLShaderProgram> m_SlColorModTexRectMaskAlpha;
00774 
00775     void InitSl2TextureAdd();
00778     ObjectPtr<IOpenGLShaderProgram> m_Sl2TextureAdd;
00779 
00780     void InitSl2TextureDepRead();
00783     ObjectPtr<IOpenGLShaderProgram> m_Sl2TextureDepRead;
00784 
00785 
00786     void InitSl2TextureMod();
00789     ObjectPtr<IOpenGLShaderProgram> m_Sl2TextureMod;
00790 
00791     void InitSl4TextureAdd();
00793     ObjectPtr<IOpenGLShaderProgram> m_Sl4TextureAdd;
00794 
00795     void InitSLPower ();
00797 
00800     ObjectPtr<IOpenGLShaderProgram> _component_exponentiation_prog;
00801 
00802     void InitSLAlphaReplicate ();
00804 
00807     ObjectPtr<IOpenGLShaderProgram> _alpha_replicate_prog;
00808 
00809     void InitSLHorizontalGaussFilter ();
00811     ObjectPtr<IOpenGLShaderProgram> _horizontal_gauss_filter_prog;
00812     
00813     void InitSLVerticalGaussFilter ();
00815     ObjectPtr<IOpenGLShaderProgram> _vertical_gauss_filter_prog;
00816     
00817 
00818     void InitSLHorizontalHQGaussFilter ();
00820     ObjectPtr<IOpenGLShaderProgram> _horizontal_hq_gauss_filter_prog;
00821 
00822     void InitSLVerticalHQGaussFilter ();
00824     ObjectPtr<IOpenGLShaderProgram> _vertical_hq_gauss_filter_prog;
00825 
00826 
00827 
00828     void InitSLColorMatrixFilter ();
00830     ObjectPtr<IOpenGLShaderProgram> _color_matrix_filter_prog;
00831 
00832     void InitSlBlendModes();
00833 
00834     ObjectPtr<IOpenGLShaderProgram> m_SlPSBNormal;
00835     ObjectPtr<IOpenGLShaderProgram> m_SlPSBLighten;
00836     ObjectPtr<IOpenGLShaderProgram> m_SlPSBDarken;
00837     ObjectPtr<IOpenGLShaderProgram> m_SlPSBMultiply;
00838 
00839 
00841     void EvaluateGpuCaps ();
00842 
00843     bool _use_glsl_shaders; 
00844 
00845     ObjectPtr<IOpenGLFrameBufferObject> _offscreen_fbo;
00846     ObjectPtr<IOpenGLTexture2D> _offscreen_color_rt0;
00847     ObjectPtr<IOpenGLTexture2D> _offscreen_depth_rt0;
00848     ObjectPtr<IOpenGLTexture2D> _offscreen_color_rt1;
00849     ObjectPtr<IOpenGLTexture2D> _offscreen_depth_rt1;
00850     ObjectPtr<IOpenGLTexture2D> _offscreen_color_rt2;
00851     ObjectPtr<IOpenGLTexture2D> _offscreen_depth_rt2;
00852     ObjectPtr<IOpenGLTexture2D> _offscreen_color_rt3;
00853     ObjectPtr<IOpenGLTexture2D> _offscreen_depth_rt3;
00854 
00855     Matrix4 _projection_matrix;
00856     Matrix4 _model_view_matrix;
00857     
00858     std::list<Matrix4>   _model_view_stack;
00859     std::list<BlendOperator> _blend_stack;
00860 
00862     GraphicsDisplay &_graphics_display;
00863 
00864     Rect _viewport;
00865     Rect _scissor;
00866     int _clip_offset_x;
00867     int _clip_offset_y;
00868     Rect _clipping_rect;
00869 
00870 
00872 
00877     bool _global_clipping_enabled;
00878 
00880     Rect _global_clipping_rect;
00881 
00882     std::list<Point> _clip_offset_stack;
00883 
00884     FontRenderer *_font_renderer;
00885 
00886     //Statistics
00887     mutable long m_quad_stats;
00888     mutable long m_quad_tex_stats;
00889     mutable long m_triangle_stats;
00890     mutable long m_triangle_tex_stats;
00891     mutable long m_line_stats;
00892 
00893     GraphicsEngine (const GraphicsEngine &);
00894     // Does not make sense for a singleton. This is a self assignment.
00895     GraphicsEngine& operator = (const GraphicsEngine &);
00896     // Declare operator address-of as private
00897     GraphicsEngine* operator & ();
00898   };
00899 
00900 }
00901 
00902 #endif // OPENGLENGINE_H
00903