nux-1.16.0
GraphicsEngine.h
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 #define NUX_MAX_GAUSSIAN_SIGMA 11
00046 #define NUX_MIN_GAUSSIAN_SIGMA 1
00047 
00048 namespace nux
00049 {
00050 
00051   class FontTexture;
00052   class FontRenderer;
00053   class FilePath;
00054   class BaseTexture;
00055   class TextureRectangle;
00056 
00057   class ROPConfig
00058   {
00059   public:
00060     ROPConfig();
00061     ~ROPConfig();
00062 
00063     bool Blend;
00064     t_u32 SrcBlend;
00065     t_u32 DstBlend;
00066 
00067     static ROPConfig Default;
00068   };
00069 
00070   class BlendOperator
00071   {
00072   public:
00073     BlendOperator ();
00074     ~BlendOperator ();
00075 
00076     void EnableBlending (bool enable);
00077     void SetPorterDuffOperator (PorterDuffOperator op);
00078     void SetCustomBlendOperator (unsigned int src_blend, unsigned int dst_blend);
00079 
00080     bool  _enable;
00081     unsigned int _src_blend;
00082     unsigned int _dst_blend;
00083   };
00084 
00085   typedef struct
00086   {
00087     int x;
00088     int y;
00089     int width;
00090     int height;
00091 
00092   } OpenGLContext;
00093 
00094   class FxStructure
00095   {
00096   public:
00097     FxStructure();
00098     ~FxStructure();
00099     ObjectPtr<IOpenGLBaseTexture> dst_texture;
00100     ObjectPtr<IOpenGLBaseTexture> src_texture;
00101     ObjectPtr<IOpenGLBaseTexture> temp_texture;
00102   };
00103 
00105   class GraphicsEngine
00106   {
00107   public:
00112     GraphicsEngine (GraphicsDisplay &GlWindow, bool create_rendering_data = true);
00113     ~GraphicsEngine();
00114 
00115     void SetContext (int x, int y, int width, int height);
00116     void GetContextSize (int &w, int &h) const;
00117     int GetContextWidth() const;
00118     int GetContextHeight() const;
00119     int GetContextX() const;
00120     int GetContextY() const;
00121 
00122     void GetWindowSize (int &w, int &h) const;
00123     int GetWindowWidth() const;
00124     int GetWindowHeight() const;
00125 
00126     OpenGLContext m_CurrrentContext;
00127 
00128     // Load Textures
00129     BaseTexture *Load2DTextureFile (const char *filename);
00130     BaseTexture *Load2DRectangleTextureFile (const char *filename);
00131     BaseTexture *Load2DTextureFileGenerateAlpha (const char *filename, int red, int green, int blue);
00132 
00133     void SetTexture (int TextureUnit, BaseTexture *Texture);
00134     void SetTexture (int TextureUnit, ObjectPtr< IOpenGLBaseTexture > Texture);
00135     void EnableTextureMode (int TextureUnit, int TextureMode);
00136     void DisableTextureMode (int TextureUnit, int TextureMode);
00137     void DisableAllTextureMode (int TextureUnit);
00138 
00140     // DRAW TEXTURE  //
00142 
00143     // Neutral
00144     void QRP_1Tex (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> Tex0, TexCoordXForm &texxform, const Color &color0);
00145     void QRP_Pixelate (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform, const Color &c0, int pixel_size);
00146     void QRP_Color (int x, int y, int width, int height, const Color &c0);
00147     void QRP_Color (int x, int y, int width, int height, const Color &c0, const Color &c1, const Color &c2, const Color &c3);
00148     void QRP_ColorModTexAlpha (int x, int y, int width, int height,
00149       ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform0, const Color &color);
00150 
00151     void QRP_2Tex (int x, int y, int width, int height,
00152       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00153       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00154 
00155     void QRP_2TexMod (int x, int y, int width, int height,
00156       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00157       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00158 
00159     void QRP_4Tex (int x, int y, int width, int height,
00160       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00161       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1,
00162       ObjectPtr<IOpenGLBaseTexture> DeviceTexture2, TexCoordXForm &texxform2, const Color &color2,
00163       ObjectPtr<IOpenGLBaseTexture> DeviceTexture3, TexCoordXForm &texxform3, const Color &color3);
00164 
00165     void QRP_Triangle (int x0, int y0, int x1, int y1, int x2, int y2, Color c0);
00166     void QRP_Triangle (int x0, int y0, int x1, int y1, int x2, int y2, Color c0, Color c1, Color c2);
00167     void QRP_Line (int x0, int y0, int x1, int y1, Color c0);
00168     void QRP_Line (int x0, int y0, int x1, int y1, Color c0, Color c1);
00169     void QRP_QuadWireframe (int x0, int y0, int width, int height, Color c0, Color c1, Color c2, Color c3);
00170 
00171 
00172     ObjectPtr<IOpenGLBaseTexture> QRP_GetBlurTexture (
00173       int x, int y,
00174       int buffer_width, int buffer_height,
00175       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00176       const Color& c0,
00177       float sigma = 1.0f, int num_pass = 1);
00178 
00179     ObjectPtr<IOpenGLBaseTexture> QRP_GetAlphaTexture (
00180       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00181       const Color& c0);
00182 
00183     ObjectPtr<IOpenGLBaseTexture> QRP_GetColorMatrixTexture (
00184       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00185       const Color& c0,
00186       Matrix4 color_matrix, Vector4 offset);
00187 
00188     ObjectPtr<IOpenGLBaseTexture> QRP_GetPower (
00189       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& c0, const Vector4 &exponent);
00190 
00191     ObjectPtr<IOpenGLBaseTexture> QRP_GetLQBlur (
00192       int x, int y, int buffer_width, int buffer_height,
00193       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00194       const Color& c0);
00195 
00196     ObjectPtr<IOpenGLBaseTexture> QRP_GetHQBlur (
00197       int x, int y, int buffer_width, int buffer_height,
00198       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00199       const Color& c0, float sigma = 1.0f, int num_pass = 1);
00200 
00201     void QRP_DisturbedTexture (
00202       int x, int y, int width, int height,
00203       ObjectPtr<IOpenGLBaseTexture> distorsion_texture, TexCoordXForm &texxform0, const Color& c0,
00204       ObjectPtr<IOpenGLBaseTexture> src_device_texture, TexCoordXForm &texxform1, const Color& c1);
00205 
00206           ObjectPtr<IOpenGLBaseTexture> QRP_GetPixelBlocks (
00207                   ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform0, const Color& c0, int pixel_size);
00208 
00209     void QRP_GetCopyTexture (
00210       int width, int height,
00211       ObjectPtr<IOpenGLBaseTexture>& dst_device_texture,
00212       ObjectPtr<IOpenGLBaseTexture>& src_device_texture,
00213       TexCoordXForm &texxform0, const Color& c0);
00214 
00215     // ASM
00216     void QRP_ASM_1Tex (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> Tex0, TexCoordXForm &texxform, const Color &color0);
00217     void QRP_ASM_Pixelate (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform, const Color &c0, int pixel_size);
00218 
00219     void QRP_ASM_Color (int x, int y, int width, int height, const Color &c0);
00220     void QRP_ASM_Color (int x, int y, int width, int height, const Color &c0, const Color &c1, const Color &c2, const Color &c3);
00221     void QRP_ASM_ColorModTexAlpha (int x, int y, int width, int height,
00222                                ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform0, const Color &color);
00223 
00224     void QRP_ASM_2Tex (int x, int y, int width, int height,
00225                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00226                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00227 
00228     void QRP_ASM_2TexMod (int x, int y, int width, int height,
00229       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00230       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00231 
00232     void QRP_ASM_4Tex (int x, int y, int width, int height,
00233                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00234                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1,
00235                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture2, TexCoordXForm &texxform2, const Color &color2,
00236                    ObjectPtr<IOpenGLBaseTexture> DeviceTexture3, TexCoordXForm &texxform3, const Color &color3);
00237 
00238     void QRP_ASM_Triangle (int x0, int y0, int x1, int y1, int x2, int y2, Color c0);
00239     void QRP_ASM_Triangle (int x0, int y0, int x1, int y1, int x2, int y2, Color c0, Color c1, Color c2);
00240     void QRP_ASM_Line (int x0, int y0, int x1, int y1, Color c0);
00241     void QRP_ASM_Line (int x0, int y0, int x1, int y1, Color c0, Color c1);
00242     void QRP_ASM_QuadWireframe (int x0, int y0, int width, int height, Color c0, Color c1, Color c2, Color c3);
00243 
00244     void QRP_ASM_Power  (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, Vector4 exponent);
00245     void QRP_ASM_AlphaReplicate  (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0);
00246     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);
00247     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);
00248     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);
00249 
00251 
00260     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetBlurTexture (
00261       int x, int y, int buffer_width, int buffer_height,
00262       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& color, float sigma = 1.0f, int num_pass = 1);
00263 
00264     void QRP_ASM_GetBlurTextureFx (
00265       int x, int y, int buffer_width, int buffer_height,
00266       FxStructure *fx_structure, TexCoordXForm &texxform, const Color& color, float sigma = 1.0f, int num_pass = 1);
00267 
00269 
00275     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetAlphaTexture (
00276       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& color);
00277 
00279 
00287     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetColorMatrixTexture (
00288       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00289       const Color& c, Matrix4 color_matrix, Vector4 offset);
00290 
00292 
00300     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetPower (
00301       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& c0, const Vector4 &exponent);
00302 
00303     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetLQBlur (
00304       int x, int y, int buffer_width, int buffer_height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00305       const Color& c0);
00306 
00307     ObjectPtr<IOpenGLBaseTexture> QRP_ASM_GetHQBlur (
00308       int x, int y, int buffer_width, int buffer_height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00309       const Color& c0, float sigma = 1.0f, int num_pass = 1);
00310 
00311     void QRP_ASM_DisturbedTexture (
00312       int x, int y, int width, int height,
00313       ObjectPtr<IOpenGLBaseTexture> distorsion_texture, TexCoordXForm &texxform0, const Color& c0,
00314       ObjectPtr<IOpenGLBaseTexture> src_device_texture, TexCoordXForm &texxform1, const Color& c1);
00315 
00317 
00324     ObjectPtr<IOpenGLBaseTexture>  QRP_ASM_GetPixelBlocks (
00325                   ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform0, const Color& color, int pixel_size);
00326 
00327     void QRP_ASM_GetCopyTexture (
00328       int width, int height,
00329       ObjectPtr<IOpenGLBaseTexture>& dst_device_texture,
00330       ObjectPtr<IOpenGLBaseTexture>& src_device_texture,
00331       TexCoordXForm &texxform0, const Color& c0);
00332 
00333     // GLSL
00334 
00335     void QRP_GLSL_1Tex (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform, const Color &c0);
00336     void QRP_GLSL_Pixelate (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform, const Color &c0, int pixel_size);
00337 
00338     void QRP_GLSL_Color (int x, int y, int width, int height, const Color &c0);
00339     void QRP_GLSL_Color (int x, int y, int width, int height, const Color &c0, const Color &c1, const Color &c2, const Color &c3);
00340     void QRP_GLSL_ColorModTexAlpha (int x, int y, int width, int height,
00341                                     ObjectPtr<IOpenGLBaseTexture> DeviceTexture, TexCoordXForm &texxform0, const Color &color);
00342 
00343     void QRP_GLSL_2Tex (int x, int y, int width, int height,
00344                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00345                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00346 
00347     void QRP_GLSL_2TexMod (int x, int y, int width, int height,
00348       ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00349       ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1);
00350 
00351 
00352     void QRP_GLSL_4Tex (int x, int y, int width, int height,
00353                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture0, TexCoordXForm &texxform0, const Color &color0,
00354                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture1, TexCoordXForm &texxform1, const Color &color1,
00355                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture2, TexCoordXForm &texxform2, const Color &color2,
00356                         ObjectPtr<IOpenGLBaseTexture> DeviceTexture3, TexCoordXForm &texxform3, const Color &color3);
00357 
00358     void QRP_GLSL_Triangle      (int x0, int y0, int x1, int y1, int x2, int y2, Color c0);
00359     void QRP_GLSL_Triangle      (int x0, int y0, int x1, int y1, int x2, int y2, Color c0, Color c1, Color c2);
00360     void QRP_GLSL_Line          (int x0, int y0, int x1, int y1, Color c0);
00361     void QRP_GLSL_Line          (int x0, int y0, int x1, int y1, Color c0, Color c1);
00362     void QRP_GLSL_QuadWireframe (int x0, int y0, int width, int height, Color c0, Color c1, Color c2, Color c3);
00363 
00364     void QRP_GLSL_Power           (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, Vector4 exponent);
00365     void QRP_GLSL_AlphaReplicate  (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0);
00366     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);
00367     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);
00368     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);
00369     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);
00370     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);
00371 
00380     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetBlurTexture (
00381       int x, int y,
00382       int buffer_width, int buffer_height,
00383       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00384       const Color& c0,
00385       float sigma = 1.0f, int num_pass = 1);
00386 
00387     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetAlphaTexture (
00388       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00389       const Color& c0);
00390 
00391     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetColorMatrixTexture (
00392       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00393       const Color& c0,
00394       Matrix4 color_matrix, Vector4 offset);
00395 
00396     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetPower (
00397       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color& c0, const Vector4 &exponent);
00398 
00399     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetLQBlur (
00400       int x, int y,
00401       int buffer_width, int buffer_height,
00402       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00403       const Color& c0);
00404 
00405     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetHQBlur (
00406       int x, int y,
00407       int buffer_width, int buffer_height,
00408       ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform,
00409       const Color& c0, float sigma = 1.0f, int num_pass = 1);
00410 
00411     void QRP_GLSL_GetHQBlurFx (
00412       int x, int y,
00413       int buffer_width, int buffer_height,
00414       FxStructure *fx_structure, TexCoordXForm &texxform,
00415       const Color& c0, float sigma = 1.0f, int num_pass = 1);
00416 
00417     void QRP_GLSL_DisturbedTexture (
00418       int x, int y, int width, int height,
00419       ObjectPtr<IOpenGLBaseTexture> distorsion_texture, TexCoordXForm &texxform0, const Color& c0,
00420       ObjectPtr<IOpenGLBaseTexture> src_device_texture, TexCoordXForm &texxform1, const Color& c1);
00421 
00422     ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetDisturbedTexture(
00423       int x, int y, int width, int height,
00424       ObjectPtr<IOpenGLBaseTexture> distorsion_texture, TexCoordXForm &texxform0, const Color& c0,
00425       ObjectPtr<IOpenGLBaseTexture> src_device_texture, TexCoordXForm &texxform1, const Color& c1);
00426 
00427     void QRP_GLSL_GetDisturbedTextureFx(
00428       int x, int y, int width, int height,
00429       ObjectPtr<IOpenGLBaseTexture> distorsion_texture, TexCoordXForm &texxform0, const Color& c0,
00430       FxStructure *fx_structure, TexCoordXForm &texxform1, const Color& c1);
00431 
00433 
00440           ObjectPtr<IOpenGLBaseTexture> QRP_GLSL_GetPixelBlocks (
00441                   ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform0, const Color& c0, int pixel_size);
00442 
00443     void QRP_GLSL_GetCopyTexture(
00444       int width, int height,
00445       ObjectPtr<IOpenGLBaseTexture>& dst_device_texture,
00446       ObjectPtr<IOpenGLBaseTexture>& src_device_texture,
00447       TexCoordXForm &texxform0, const Color& c0);
00448 
00450     // DRAW CLIPPING    //
00452 
00453     mutable std::vector<Rect> ClippingRect;
00454     void PushClippingRectangle (Rect rect);
00455     void PopClippingRectangle ();
00456     void EmptyClippingRegion ();
00458     void ApplyClippingRectangle ();
00459     
00460     void SetGlobalClippingRectangle (Rect rect);
00461     void DisableGlobalClippingRectangle ();
00462 
00464 
00467     void SetClippingRectangle (const Rect &rect);
00468 
00470     void SetOpenGLClippingRectangle (int x, int y, unsigned int width, unsigned int height);
00471 
00472     Rect GetClippingRegion () const;
00473     int GetNumberOfClippingRegions () const;
00474     
00475     void AddClipOffset (int x, int y);  
00476     void PushClipOffset (int x, int y);
00477     void PopClipOffset ();
00478 
00479     void ClearAreaColorDepthStencil (int x, int y, int width, int height, Color clearcolor, float cleardepth, int clearstencil);
00480     void ClearAreaColor (int x, int y, int width, int height, Color clearcolor);
00481     void ClearAreaDepthStencil (int x, int y, int width, int height, float cleardepth, int clearstencil);
00482 
00483     void Set3DView (int w, int h);
00484 
00486     void Push2DWindow (int w, int h);
00487     void Pop2DWindow ();
00488     void Push2DModelViewMatrix (Matrix4 mat);
00489     Matrix4 Pop2DModelViewMatrix ();
00490     void Clear2DModelViewMatrix ();
00491     std::list<Matrix4> m_2DModelViewMatricesStack;
00492 
00493     void SetViewport (int x, int y, int w, int h);
00494     Rect GetViewportRect () const;
00495     int  GetViewportWidth () const;
00496     int  GetViewportHeight () const;
00497     int  GetViewportX () const;
00498     int  GetViewportY () const;
00499 
00500     void  GetViewportSize (int &viewport_width, int &viewport_height) const;
00501 
00502     void SetScissor (int x, int y, int w, int h);
00503 
00511     void SetScissorOffset (int x, int y);
00512 
00513     Rect GetScissorRect();
00514     void EnableScissoring (bool b);
00515 
00516 
00517 //     void LoadPainterImages();
00518 //     const PainterImage* GetImage(UXStyleImageRef style);
00519 //     Rect GetImageGeometry(UXStyleImageRef style);
00520 //     std::list<PainterImage*> m_PainterImageList;
00521 
00522     int RenderColorText (ObjectPtr<FontTexture> Font, int x, int y, const NString &Str,
00523                          const Color &TextColor,
00524                          bool WriteAlphaChannel,
00525                          int NumCharacter);
00526 
00527     int RenderColorTextLineStatic (ObjectPtr<FontTexture> Font, const PageBBox &pageSize, const NString &Str,
00528                                    const Color &TextColor,
00529                                    bool WriteAlphaChannel,
00530                                    TextAlignment alignment);
00531 
00532     int RenderColorTextLineEdit (ObjectPtr<FontTexture> Font, const PageBBox &pageSize, const NString &Str,
00533                                  const Color &TextColor,
00534                                  bool WriteAlphaChannel,
00535                                  const Color &SelectedTextColor,
00536                                  const Color &SelectedTextBackgroundColor,
00537                                  const Color &TextBlinkColor,
00538                                  const Color &CursorColor,
00539                                  bool ShowCursor, unsigned int CursorPosition,
00540                                  int offset = 0, int selection_start = 0, int selection_end = 0);
00541 
00542     ObjectPtr <IOpenGLBaseTexture> CreateTextureFromBackBuffer (int x, int y, int width, int height);
00543 
00544     //Statistics
00545     void ResetStats();
00546 
00553     ObjectPtr<CachedResourceData> CacheResource (ResourceData *Resource);
00554 
00559     void UpdateResource (ResourceData *Resource);
00560 
00561     bool FlushCachedResourceData (ResourceData *Resource);
00562     bool IsResourceCached (ResourceData *Resource);
00563     NResourceCache ResourceCache;
00564 
00565     Matrix4 GetProjectionMatrix ();
00567     Matrix4 GetOpenGLProjectionMatrix ();
00568     
00569     void SetProjectionMatrix (const Matrix4 &matrix);
00570     
00572 
00578     void SetOrthographicProjectionMatrix (int viewport_width, int viewport_height);
00579 
00581     void ResetProjectionMatrix ();
00582 
00583     Matrix4 GetModelViewMatrix ();
00585     Matrix4 GetOpenGLModelViewMatrix ();
00586 
00587     Matrix4 GetModelViewProjectionMatrix ();
00588     Matrix4 GetOpenGLModelViewProjectionMatrix ();
00589 
00590     GpuRenderStates &GetRenderStates()
00591     {
00592       return *_graphics_display.m_DeviceFactory->_gpu_render_states;
00593     }
00594     void ResetRenderStates()
00595     {
00596       _graphics_display.m_DeviceFactory->_gpu_render_states->ResetStateChangeToDefault();
00597     }
00598     void VerifyRenderStates()
00599     {
00600       _graphics_display.m_DeviceFactory->_gpu_render_states->CheckStateChange();
00601     }
00602 
00603     ObjectPtr<FontTexture> GetFont();
00604     ObjectPtr<FontTexture> GetBoldFont();
00605 
00607 
00610     bool UsingGLSLCodePath ();
00611 
00613 
00616     bool UsingARBProgramCodePath ();
00617 
00619     void PushModelViewMatrix (const Matrix4 &matrix);
00620 
00622     void PushIdentityModelViewMatrix ();
00623 
00625 
00628     void Push2DTranslationModelViewMatrix (float tx, float ty, float tz);
00629 
00631 
00634     bool PopModelViewMatrix ();
00635 
00637     void ResetModelViewMatrixStack ();
00638 
00640 
00643     void SetModelViewMatrix (const Matrix4 &matrix);
00644 
00646     void ApplyModelViewMatrix ();
00647 
00649 
00655     Rect ModelViewXFormRect (const Rect& rect);
00656 
00658 
00661     int ModelViewStackDepth ();
00662 
00663 
00664 
00666     void PushProjectionMatrix (const Matrix4 &matrix);
00667 
00669 
00672     bool PopProjectionMatrix ();
00673 
00675 
00678     int ProjectionStackDepth ();
00679 
00680 
00681 
00682 
00683 
00685     void PushPorterDuffBlend (const PorterDuffOperator &porter_duff_op);
00686 
00688     void PushDisableBlend ();
00689 
00691 
00695     void PushBlend (unsigned int src_blend, unsigned int dst_blend);
00696 
00698 
00701     bool PopBlend ();
00702 
00704 
00707     int BlendStackDepth ();
00708 
00709   private:
00710 
00711     ObjectPtr<FontTexture> _normal_font;    
00712     ObjectPtr<FontTexture> _bold_font;      
00713 
00714     void InitShaders();
00715 
00717     void GaussianWeights (float **weights, float sigma, unsigned int num_tap);
00718 
00720     void SetFrameBufferHelper(
00721       ObjectPtr<IOpenGLFrameBufferObject>& fbo,
00722       ObjectPtr<IOpenGLBaseTexture>& colorbuffer,
00723       ObjectPtr<IOpenGLBaseTexture>& depthbuffer,
00724       int width, int height);
00725 
00726 #ifndef NUX_OPENGLES_20
00727     void InitAsmColorShader();
00729     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmColor;
00730 
00731     void InitAsmTextureShader();
00733     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmTextureModColor;
00735     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmTextureRectModColor;
00736 
00737     void InitAsmPixelateShader();
00739     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPixelate;
00741     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPixelateRect;
00742 
00743     void InitAsmColorModTexMaskAlpha();
00746     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmColorModTexMaskAlpha;
00747     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmColorModTexRectMaskAlpha;
00748 
00749     void InitAsm2TextureAdd();
00751     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm2TextureAdd;
00752     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm2TextureRectAdd;
00753 
00754     void InitAsm2TextureMod();
00756     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm2TextureMod;
00757     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm2TextureRectMod;
00758 
00759     void InitAsm4TextureAdd();
00761     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm4TextureAdd;
00762     ObjectPtr<IOpenGLAsmShaderProgram> m_Asm4TextureRectAdd;
00763 
00764     void InitAsmPower ();
00766 
00769     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_component_exponentiation_prog;
00770     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_component_exponentiation_prog;
00771 
00772     void InitAsmAlphaReplicate ();
00774 
00777     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_alpha_replicate_prog;
00778     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_alpha_replicate_prog;
00779 
00780     void InitAsmSeparableGaussFilter ();
00782     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_separable_gauss_filter_prog;
00783     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_separable_gauss_filter_prog;
00784 
00785 //     void InitAsmSeparableGaussFilter2 ();
00786 //     //! Gauss horizontal filter.
00787 //     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_separable_gauss_filter_prog2;
00788 //     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_separable_gauss_filter_prog2;
00789 
00790     void InitAsmColorMatrixFilter ();
00792     ObjectPtr<IOpenGLAsmShaderProgram> _asm_tex_color_matrix_filter_prog;
00793     ObjectPtr<IOpenGLAsmShaderProgram> _asm_texrect_color_matrix_filter_prog;
00794 
00795     void InitAsm2TextureDepRead ();
00796     ObjectPtr<IOpenGLAsmShaderProgram> m_ASM2TextureDepRead;
00797     ObjectPtr<IOpenGLAsmShaderProgram> m_ASM2TextureRectDepRead;
00798 
00799     void InitAsmBlendModes();
00800 
00801     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPSBNormal;
00802     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPSBLighten;
00803     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPSBDarken;
00804     ObjectPtr<IOpenGLAsmShaderProgram> m_AsmPSBMultiply;
00805 #endif
00806 
00807     void InitSlColorShader();
00809     ObjectPtr<IOpenGLShaderProgram> m_SlColor;
00810 
00811     void InitSlTextureShader();
00813     ObjectPtr<IOpenGLShaderProgram> m_SlTextureModColor;
00814 
00815     void InitSlPixelateShader();
00817     ObjectPtr<IOpenGLShaderProgram> m_SLPixelate;
00818 
00819     void InitSlColorModTexMaskAlpha();
00822     ObjectPtr<IOpenGLShaderProgram> m_SlColorModTexMaskAlpha;
00823     ObjectPtr<IOpenGLShaderProgram> m_SlColorModTexRectMaskAlpha;
00824 
00825     void InitSl2TextureAdd();
00828     ObjectPtr<IOpenGLShaderProgram> m_Sl2TextureAdd;
00829 
00830     void InitSl2TextureDepRead();
00833     ObjectPtr<IOpenGLShaderProgram> m_Sl2TextureDepRead;
00834 
00835 
00836     void InitSl2TextureMod();
00839     ObjectPtr<IOpenGLShaderProgram> m_Sl2TextureMod;
00840 
00841     void InitSl4TextureAdd();
00843     ObjectPtr<IOpenGLShaderProgram> m_Sl4TextureAdd;
00844 
00845     void InitSLPower ();
00847 
00850     ObjectPtr<IOpenGLShaderProgram> _component_exponentiation_prog;
00851 
00852     void InitSLAlphaReplicate ();
00854 
00857     ObjectPtr<IOpenGLShaderProgram> _alpha_replicate_prog;
00858 
00859     void InitSLHorizontalGaussFilter ();
00861     ObjectPtr<IOpenGLShaderProgram> _horizontal_gauss_filter_prog;
00862     
00863     void InitSLVerticalGaussFilter ();
00865     ObjectPtr<IOpenGLShaderProgram> _vertical_gauss_filter_prog;
00866     
00867 
00868     void InitSLHorizontalHQGaussFilter (int sigma);
00870     ObjectPtr<IOpenGLShaderProgram> _horizontal_hq_gauss_filter_prog[NUX_MAX_GAUSSIAN_SIGMA];
00871 
00872     void InitSLVerticalHQGaussFilter (int sigma);
00874     ObjectPtr<IOpenGLShaderProgram> _vertical_hq_gauss_filter_prog[NUX_MAX_GAUSSIAN_SIGMA];
00875 
00876 
00877 
00878     void InitSLColorMatrixFilter ();
00880     ObjectPtr<IOpenGLShaderProgram> _color_matrix_filter_prog;
00881 
00882     void InitSlBlendModes();
00883 
00884     void InitBlendModeNormal();
00885     void InitBlendModeLighten();
00886     void InitBlendModeDarken();
00887 
00888     ObjectPtr<IOpenGLShaderProgram> _shader_layer_blend_normal;
00889     ObjectPtr<IOpenGLShaderProgram> _shader_layer_blend_lighten;
00890     ObjectPtr<IOpenGLShaderProgram> _shader_layer_blend_darken;
00891     ObjectPtr<IOpenGLShaderProgram> _shader_layer_blend_multiply;
00892 
00893 
00895     void EvaluateGpuCaps ();
00896 
00897     bool _use_glsl_shaders; 
00898 
00899     ObjectPtr<IOpenGLFrameBufferObject> _offscreen_fbo;
00900     ObjectPtr<IOpenGLBaseTexture> _offscreen_color_rt0;
00901     ObjectPtr<IOpenGLBaseTexture> _offscreen_depth_rt0;
00902     ObjectPtr<IOpenGLBaseTexture> _offscreen_color_rt1;
00903     ObjectPtr<IOpenGLBaseTexture> _offscreen_depth_rt1;
00904     ObjectPtr<IOpenGLBaseTexture> _offscreen_color_rt2;
00905     ObjectPtr<IOpenGLBaseTexture> _offscreen_depth_rt2;
00906     ObjectPtr<IOpenGLBaseTexture> _offscreen_color_rt3;
00907     ObjectPtr<IOpenGLBaseTexture> _offscreen_depth_rt3;
00908 
00909     Matrix4 _projection_matrix;
00910     Matrix4 _model_view_matrix;
00911     
00912     std::list<Matrix4>   _model_view_stack;
00913     std::list<BlendOperator> _blend_stack;
00914 
00916     GraphicsDisplay &_graphics_display;
00917 
00918     Rect _viewport;
00919     Rect _scissor;
00920     int _clip_offset_x;
00921     int _clip_offset_y;
00922     Rect _clipping_rect;
00923 
00924 
00926 
00931     bool _global_clipping_enabled;
00932 
00934     Rect _global_clipping_rect;
00935 
00936     std::list<Point> _clip_offset_stack;
00937 
00938     FontRenderer *_font_renderer;
00939 
00940     //Statistics
00941     mutable long m_quad_stats;
00942     mutable long m_quad_tex_stats;
00943     mutable long m_triangle_stats;
00944     mutable long m_triangle_tex_stats;
00945     mutable long m_line_stats;
00946 
00947     GraphicsEngine (const GraphicsEngine &);
00948     // Does not make sense for a singleton. This is a self assignment.
00949     GraphicsEngine& operator = (const GraphicsEngine &);
00950     // Declare operator address-of as private
00951     GraphicsEngine* operator & ();
00952   };
00953 
00954 }
00955 
00956 #endif // OPENGLENGINE_H
00957 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends