1 /***********************************************************************
2 created:    Wed, 8th Feb 2012
3 author:     Lukas E Meindl
4 *************************************************************************/
5 /***************************************************************************
6 *   Copyright (C) 2004 - 2012 Paul D Turner & The CEGUI Development Team
7 *
8 *   Permission is hereby granted, free of charge, to any person obtaining
9 *   a copy of this software and associated documentation files (the
10 *   "Software"), to deal in the Software without restriction, including
11 *   without limitation the rights to use, copy, modify, merge, publish,
12 *   distribute, sublicense, and/or sell copies of the Software, and to
13 *   permit persons to whom the Software is furnished to do so, subject to
14 *   the following conditions:
15 *
16 *   The above copyright notice and this permission notice shall be
17 *   included in all copies or substantial portions of the Software.
18 *
19 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23 *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 *   OTHER DEALINGS IN THE SOFTWARE.
26 ***************************************************************************/
27 #ifndef _CEGUIOpenGL3Shader_h_
28 #define _CEGUIOpenGL3Shader_h_
29 
30 #include "CEGUI/Exceptions.h"
31 #include "RendererBase.h"
32 #include <string>
33 
34 #if defined(_MSC_VER)
35 #   pragma warning(push)
36 #   pragma warning(disable : 4251)
37 #endif
38 
39 // Start of CEGUI namespace section
40 namespace CEGUI
41 {
42 
43 class OPENGL_GUIRENDERER_API OpenGL3Shader :
44     public AllocatedObject<OpenGL3Shader>
45 {
46 public:
47 
48     /*!
49     \brief
50         Creates and loads shader programs from the two strings supplied to it
51     */
52     OpenGL3Shader(const std::string& vertex_shader_source,
53                   const std::string& fragment_shader_source);
54 
55     ~OpenGL3Shader();
56 
57     /*!
58     \brief
59         Bind the shader to the OGL state-machine
60     */
61     void bind() const;
62 
63     /*!
64     \brief
65         Unbind the shader
66     */
67     void unbind() const;
68 
69     /*!
70     \brief
71         Query the location of a vertex attribute inside the shader.
72     */
73     GLuint getAttribLocation(const std::string &name) const;
74 
75     /*!
76     \brief
77         Query the location of a uniform variable inside the shader.
78     */
79     GLuint getUniformLocation(const std::string &name) const;
80 
81     /*!
82     \brief
83         Defines the name of the variable inside the shader which represents the
84         final color for each fragment.
85     */
86     void bindFragDataLocation(const std::string &name);
87 
88     bool isCreatedSuccessfully();
89 
90     void link();
91 
92 private:
93     GLuint compile(GLuint type, const std::string &source);
94 
95     void outputShaderLog(GLuint shader);
96     void outputProgramLog(GLuint program);
97 
98     std::string d_shaderName;
99     bool d_createdSucessfully;
100 
101     GLuint d_vertexShader;
102     GLuint d_fragmentShader;
103     GLuint d_geometryShader;
104     GLuint d_program;
105 };
106 
107 #define STRINGIFY(x) #x
108 #define TOSTRING(x) STRINGIFY(x)
109 #define AT __FILE__ ":" TOSTRING(__LINE__)
110 #define checkGLErrors() getGLErrors(AT)
111 
112 /*!
113 \brief
114     Query OpenGL errors and process them in CEGUI
115 */
116 void getGLErrors(const char *location);
117 
118 }
119 
120 #endif
121 
122