GL Studio C++ Runtime API
gls_state_manager_interface.h
Go to the documentation of this file.
1 /*! \file
2  \brief IGlsStateManager, interface to a state manager that manages the GL Studio
3 runtime library's use of the OpenGL context, minimizing unnecessary state changes.
4 
5  \par Copyright Information
6 
7  Copyright (c) 2017 by The DiSTI Corporation.<br>
8  11301 Corporate Blvd; Suite 100<br>
9  Orlando, Florida 32817<br>
10  USA<br>
11  <br>
12  All rights reserved.<br>
13 
14  This Software contains proprietary trade secrets of DiSTI and may not be
15 reproduced, in whole or part, in any form, or by any means of electronic,
16 mechanical, or otherwise, without the written permission of DiSTI. Said
17 permission may be derived through the purchase of applicable DiSTI product
18 licenses which detail the distribution rights of this content and any
19 Derivative Works based on this or other copyrighted DiSTI Software.
20 
21  NO WARRANTY. THE SOFTWARE IS PROVIDED "AS-IS," WITHOUT WARRANTY OF ANY KIND,
22 AND ANY USE OF THIS SOFTWARE PRODUCT IS AT YOUR OWN RISK. TO THE MAXIMUM EXTENT
23 PERMITTED BY APPLICABLE LAW, DISTI AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES
24 AND CONDITIONS, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
25 IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY AND/OR FITNESS FOR A
26 PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT, WITH REGARD TO THE SOFTWARE.
27 
28  LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW,
29 IN NO EVENT SHALL DISTI OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
30 INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION,
31 DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS
32 INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR
33 INABILITY TO USE THE SOFTWARE, EVEN IF DISTI HAS BEEN ADVISED OF THE POSSIBILITY
34 OF SUCH DAMAGES. DISTI'S ENTIRE LIABILITY AND YOUR EXCLUSIVE REMEDY SHALL NOT
35 EXCEED FIVE DOLLARS (US$5.00).
36 
37  The aforementioned terms and restrictions are governed by the laws of the
38 State of Florida and the United States of America. Use, distribution,
39 duplication, or disclosure by the U. S. Government is subject to
40 "Restricted Rights" as set forth in DFARS 252.227-7014(c)(1)(ii).
41 
42 */
43 
44 #ifndef DISTI_GLS_STATE_MANAGER_INTERFACE_H_INCLUDED
45 #define DISTI_GLS_STATE_MANAGER_INTERFACE_H_INCLUDED
46 
47 #include "IFontImage.h"
48 #include "gls_color.h"
49 #include "gls_gl.h"
50 #include "gls_include.h"
51 #include "gls_matrix_affine.h"
52 #include "non_copyable.h"
53 #include "scoped_ptr.h"
54 
55 #ifndef LESS_MAX_LIGHTS
56 # define MAX_LIGHTS 8
57 #else
58 # define MAX_LIGHTS 6
59 #endif
60 
61 namespace disti
62 {
63 /** \interface IGlsStateManager
64  * The interface to a state manager that manages the GL Studio
65  * runtime library's use of the OpenGL context, minimizing unnecessary state changes
66  */
68 {
69 public:
70  /** Wrapper for glBlendFuncSeparate if supported, or glBlendFunc (ignoring the last two parameters) if
71  * glBlendFuncSeparate is not supported. Parameters are equivalent to glBlendFuncSeparate
72  */
73  GLS_EXPORT virtual void AlphaBlendFuncSeparate( GLenum srcColor, GLenum dstColor, GLenum srcAlpha, GLenum dstAlpha ) = 0;
74  /** sets the default blend function for GL Studio */
75  GLS_EXPORT virtual void SetDefaultAlphaBlendFunc() = 0;
76  /** pushes the current alpha blend func onto an internal stack. Can restore the pushed alpha blend func by calling PopAlphaBlendFunc */
77  GLS_EXPORT virtual void PushAlphaBlendFunc() = 0;
78  /** pops the previously pushed alpha blend func from the stack and restores its state to the opengl context */
79  GLS_EXPORT virtual void PopAlphaBlendFunc() = 0;
80  /** Wrapper for glBlendFunc. Parameters are equivalent to glBlendFunc */
81  GLS_EXPORT virtual void AlphaBlendFunc( GLenum src, GLenum dst ) = 0;
82 
83 #ifdef GLES
84  /** supported texture mapping modes */
85  enum {
86  GLS_TEXTURE_MAP_MODE_MODULATE = 0x2100, // = GL_MODULATE
87  GLS_TEXTURE_MAP_MODE_DECAL = 0x2101, // = GL_DECAL
88  GLS_TEXTURE_MAP_MODE_BLEND = 0x0BE2, // = GL_BLEND
89  GLS_TEXTURE_MAP_MODE_REPLACE = 0x1E01 // = GL_REPLACE
90  };
91 
92  /** Initializes the state manager to its default states and then sends that state
93  * to the OpenGL context
94  * \param forceResetUnmanagedState force the reset of all GL state, even state unmanaged by GL Studio
95  */
96  GLS_EXPORT virtual void SetDefaultState( bool forceResetUnmanagedState = false ) = 0;
97 
98  ////////////////////////////////////////////////////////////////
99  //
100  // Matrix Stack
101  //
102  ////////////////////////////////////////////////////////////////
103  enum {
104  MATRIX_STACK_DEPTH = 64u, /**< depth of model view matrix stack */
105  PROJECTION_STACK_DEPTH = 64u, /**< depth of projection matrix stack */
106  TEXTURE_STACK_DEPTH = 64u, /**< depth of texture matrix stack */
107  CUSTOM_SHADER_PROGRAM_STACK_DEPTH = 64u /**< depth of custom shader stack */
108  };
109 
110  /** load the given matrix into the projection matrix
111  * \pre GLMatrixAffineFIsValid( m )
112  * \post the given matrix is the projection matrix
113  */
114  GLS_EXPORT virtual void LoadProjectionMatrixf( const GlsMatrixType& m ) = 0;
115 
116  GLS_EXPORT virtual void LoadProjectionIdentityMatrix( void ) = 0;
117 
118  GLS_EXPORT virtual void PushProjectionMatrix( void ) = 0;
119 
120  GLS_EXPORT virtual void PopProjectionMatrix( void ) = 0;
121 
122  /** load the given matrix on to the top of the matrix stack
123  * \pre GLMatrixAffineFIsValid( m )
124  * \post the given matrix is on the top of the matrix stack
125  */
126  GLS_EXPORT virtual void LoadModelViewMatrixf( const GlsMatrixType& m ) = 0;
127 
128  GLS_EXPORT virtual void LoadModelViewIdentityMatrix( void ) = 0;
129 
130  /** Multiply (and optionally push) the top of the stack by the given matrix such that if
131  * t is the top of the matrix then t=t*m . If pushMatrix is true then the matrix stack
132  * is pushed before the multiplication.
133  * \param m matrix to multiply by
134  * \param pushMatrix true to push the matrix stack before multiplying
135  * \pre GLMatrixAffineFIsValid( m ), current matrix stack index is < ( MATRIX_STACK_DEPTH - 1u ) if pushMatrix is true
136  * \post the top of the stack is multiplied by the given matrix
137  */
138  GLS_EXPORT virtual void MultModelViewMatrixf( const GlsMatrixType& m, const GLboolean pushMatrix ) = 0;
139 
140  /** apply a translation to the top of the model view matrix stack
141  * \param x the x-coordinate of the translation vector
142  * \param y the y-coordinate of the translation vector
143  * \param z the z-coordinate of the translation vector
144  */
145  GLS_EXPORT virtual void TranslateModelViewMatrixf( GLfloat x, GLfloat y, GLfloat z ) = 0;
146 
147  /** push the matrix stack
148  * \pre current matrix stack index is < ( MATRIX_STACK_DEPTH - 1u )
149  * \post matrix stack is popped
150  */
151  GLS_EXPORT virtual void PushModelViewMatrix( void ) = 0;
152 
153  /** pop the matrix stack
154  * \pre current matrix stack index is > 0u
155  * \post matrix stack is popped
156  */
157  GLS_EXPORT virtual void PopModelViewMatrix( void ) = 0;
158 
159  /** load the given matrix on to the top of the texture matrix stack
160  * \pre GLMatrixAffineFIsValid( m )
161  * \post the given matrix is on the top of the texture matrix stack
162  */
163  GLS_EXPORT virtual void LoadTextureMatrixf( const GlsMatrixType& m ) = 0;
164 
165  GLS_EXPORT virtual void LoadTextureIdentityMatrix( void ) = 0;
166 
167  /** apply a scale factor to the top of the texture matrix stack
168  * \param x the x-coordinate of the scale vector
169  * \param y the y-coordinate of the scale vector
170  * \param z the z-coordinate of the scale vector
171  */
172  GLS_EXPORT virtual void ScaleTextureMatrixf( GLfloat x, GLfloat y, GLfloat z ) = 0;
173 
174  /** apply a translation to the top of the texture matrix stack
175  * \param x the x-coordinate of the translation vector
176  * \param y the y-coordinate of the translation vector
177  * \param z the z-coordinate of the translation vector
178  */
179  GLS_EXPORT virtual void TranslateTextureMatrixf( GLfloat x, GLfloat y, GLfloat z ) = 0;
180 
181  /** push the texture matrix stack
182  * \pre current matrix stack index is < ( MATRIX_STACK_DEPTH - 1u )
183  * \post matrix stack is popped
184  */
185  GLS_EXPORT virtual void PushTextureMatrix( void ) = 0;
186 
187  /** pop the texture matrix stack
188  * \pre current matrix stack index is > 0u
189  * \post matrix stack is popped
190  */
191  GLS_EXPORT virtual void PopTextureMatrix( void ) = 0;
192 
193  ////////////////////////////////////////////////////////////////
194  //
195  // The following methods manage the various OpenGL state calls
196  //
197  ////////////////////////////////////////////////////////////////
198  GLS_EXPORT virtual void AlphaBlendEnabled( bool val ) = 0;
199  GLS_EXPORT virtual void AlphaTestEnabled( bool val ) = 0;
200  GLS_EXPORT virtual void AlphaTestFunc( GLenum func, GLfloat val ) = 0;
201 
202  GLS_EXPORT virtual void DepthTestEnabled( bool val ) = 0;
203  GLS_EXPORT virtual void DepthMaskEnabled( bool val ) = 0;
204  GLS_EXPORT virtual bool IsDepthMaskEnabled( void ) = 0;
205  GLS_EXPORT virtual void DepthFunc( GLenum func ) = 0;
206  GLS_EXPORT virtual void DepthRange( GLfloat min, GLfloat max ) = 0;
207 
208  GLS_EXPORT virtual void BackfaceCullingEnabled( bool val ) = 0;
209 
210  GLS_EXPORT virtual void Texture2DEnabled( bool val ) = 0;
211  GLS_EXPORT virtual void ActiveTexture( GLenum textureUnit ) = 0;
212  GLS_EXPORT virtual void BindTexture( IFontImage* texture ) = 0;
213  GLS_EXPORT virtual void DeleteTexture( IFontImage* texture ) = 0;
214  GLS_EXPORT virtual void SetTextureWrapS( GLenum mode ) = 0;
215  GLS_EXPORT virtual void SetTextureWrapT( GLenum mode ) = 0;
216  GLS_EXPORT virtual void SetTextureEnvMode( GLenum mode ) = 0;
217  GLS_EXPORT virtual void SetTextureBlendColor( GLfloat* color ) = 0;
218  GLS_EXPORT virtual void SetTextureMinFilter( GLenum mode ) = 0;
219  GLS_EXPORT virtual void SetTextureMagFilter( GLenum mode ) = 0;
220 
221  GLS_EXPORT virtual void BindIndexBuffer( unsigned int handle ) = 0;
222  GLS_EXPORT virtual void BindVertexBuffer( unsigned int handle ) = 0;
223 
224  GLS_EXPORT virtual void VertexArrayEnabled( bool val ) = 0;
225  GLS_EXPORT virtual void NormalArrayEnabled( bool val ) = 0;
226  GLS_EXPORT virtual void TextureArrayEnabled( bool val ) = 0;
227  GLS_EXPORT virtual void ColorArrayEnabled( bool val ) = 0;
228 
229  GLS_EXPORT virtual void VertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid* pointer ) = 0;
230  GLS_EXPORT virtual void TexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid* pointer ) = 0;
231  GLS_EXPORT virtual void NormalPointer( GLenum type, GLsizei stride, const GLvoid* pointer ) = 0;
232  GLS_EXPORT virtual void ColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid* pointer ) = 0;
233 
234  GLS_EXPORT virtual void LineSmoothEnabled( bool val ) = 0;
235  GLS_EXPORT virtual void LineWidth( float width ) = 0;
236  GLS_EXPORT virtual void PointSize( float size ) = 0;
237  GLS_EXPORT virtual void LineStipple( unsigned short pattern, unsigned int multiplier ) = 0;
238  GLS_EXPORT virtual void SetColor( const glsColor& color ) = 0;
239  GLS_EXPORT virtual void Normal3f( float x, float y, float z ) = 0;
240 
241  GLS_EXPORT virtual void AmbientMaterial( const glsColor& color ) = 0;
242  GLS_EXPORT virtual void DiffuseMaterial( const glsColor& color ) = 0;
243  GLS_EXPORT virtual void SpecularMaterial( const glsColor& color ) = 0;
244  GLS_EXPORT virtual void EmissionMaterial( const glsColor& color ) = 0;
245  GLS_EXPORT virtual void ShininessMaterial( float shininess ) = 0;
246 
247  GLS_EXPORT virtual void LightingEnabled( bool val ) = 0;
248  GLS_EXPORT virtual void GouraudShadingEnabled( bool val ) = 0;
249  GLS_EXPORT virtual bool IsLightingEnabled( void ) = 0;
250  GLS_EXPORT virtual bool IsLightSourceEnabled( unsigned int index ) = 0;
251  GLS_EXPORT virtual unsigned int GetMaxNumLights( void ) = 0;
252  GLS_EXPORT virtual void SetLightEnabled( unsigned int index, bool enabled ) = 0;
253 
254  // These functions work similar to glLightfv / glGetLightfv. For spacial data, the data is always set in local space and
255  // retrieved in eye space (so the retrieved value is different than the set value unless the modelview matrix is identity) */
256  GLS_EXPORT virtual void SetLightAmbientColor( unsigned int index, GLfloat* color ) = 0;
257  GLS_EXPORT virtual void GetLightAmbientColor( unsigned int index, GLfloat* color ) = 0;
258  GLS_EXPORT virtual void SetLightDiffuseColor( unsigned int index, GLfloat* color ) = 0;
259  GLS_EXPORT virtual void GetLightDiffuseColor( unsigned int index, GLfloat* color ) = 0;
260  GLS_EXPORT virtual void SetLightSpecularColor( unsigned int index, GLfloat* color ) = 0;
261  GLS_EXPORT virtual void GetLightSpecularColor( unsigned int index, GLfloat* color ) = 0;
262  GLS_EXPORT virtual void SetLightPosition( unsigned int index, GLfloat* position ) = 0;
263  GLS_EXPORT virtual void GetLightPosition( unsigned int index, GLfloat* position ) = 0;
264  GLS_EXPORT virtual void SetSpotlightDirection( unsigned int index, GLfloat* direction ) = 0;
265  GLS_EXPORT virtual void GetSpotlightDirection( unsigned int index, GLfloat* direction ) = 0;
266  GLS_EXPORT virtual void SetSpotlightCutoff( unsigned int index, GLfloat cutoff ) = 0;
267  GLS_EXPORT virtual GLfloat GetSpotlightCutoff( unsigned int index ) = 0;
268  GLS_EXPORT virtual void SetSpotlightExponent( unsigned int index, GLfloat exponent ) = 0;
269  GLS_EXPORT virtual GLfloat GetSpotlightExponent( unsigned int index ) = 0;
270  GLS_EXPORT virtual void SetLightAttenuation( unsigned int index, GLfloat constant, GLfloat linear, GLfloat quadratic ) = 0;
271  GLS_EXPORT virtual void GetLightAttenuation( unsigned int index, GLfloat& constant, GLfloat& linear, GLfloat& quadratic ) = 0;
272 
273  GLS_EXPORT virtual unsigned int GetMaxClipPlanes( void ) = 0;
274 
275  // These functions work similar to glClipPlane / glGetClipPlane. The equation is always set in local space and retrieved in eye space
276  // (so the retrieved value is different than the set value unless the modelview matrix is identity) */
277  GLS_EXPORT virtual void ClipPlanef( unsigned int index, float* equation ) = 0;
278  GLS_EXPORT virtual void GetClipPlanef( unsigned int index, float* equation ) = 0;
279 
280  GLS_EXPORT virtual void EnableClipPlane( unsigned int index ) = 0;
281  GLS_EXPORT virtual void DisableClipPlane( unsigned int index ) = 0;
282  GLS_EXPORT virtual bool IsClipPlaneEnabled( unsigned int index ) = 0;
283 
284  /** equivalent to glDrawArrays call
285  * \param mode primitive mode to draw ( GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, or GL_TRIANGLES )
286  * \param first starting index in the enabled arrays
287  * \param count the number of indices to be rendered
288  * \pre mode must be GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, or GL_TRIANGLES
289  * \pre first >= 0
290  * \post (GLES20) updated shader program is selected if needed
291  * \post primitives are drawn to GL
292  */
293  GLS_EXPORT virtual void DrawArrays( const GLenum mode, const GLint first, const GLsizei count ) = 0;
294 
295  /** equivalent to glDrawElements call
296  * \param mode primitive mode to draw ( GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, or GL_TRIANGLES )
297  * \param count the number of elements to be rendered
298  * \param type Specifies the type of the values in indices ( GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT )
299  * \param indices pointer to the location where the indices are stored else an offset in bytes into the
300  * the currently bound element array buffer
301  * \pre mode must be GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, or GL_TRIANGLES
302  * \pre type must be GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT
303  * \post (GLES20) updated shader program is selected if needed
304  * \post primitives are drawn to GL
305  */
306  GLS_EXPORT virtual void DrawElements( const GLenum mode, const GLsizei count, const GLenum type, const GLvoid* indices ) = 0;
307 #endif
308 
309 protected:
310  /** default ctor */
312 
313  /** dtor is protected but virtual so that users cannot delete instances of it,
314  * but ScopedPtr can inside GlsGlobals
315  */
316  virtual ~IGlsStateManager() {}
317  friend class ScopedPtr<IGlsStateManager>;
318 };
319 
320 } // namespace disti
321 
322 #endif // DISTI_GLS_STATE_MANAGER_INTERFACE_H_INCLUDED
virtual void AlphaBlendFuncSeparate(GLenum srcColor, GLenum dstColor, GLenum srcAlpha, GLenum dstAlpha)=0
Definition: IFontImage.h:53
virtual void PopAlphaBlendFunc()=0
A base class for objects that are not copyable via the standard C++ copy constructor.
The GlsMatrixAffine class.
IGlsStateManager()
Definition: gls_state_manager_interface.h:311
Definition: gls_state_manager_interface.h:67
The Color class: Implements a 4 component RGBA color.
A file for all GL Studio files to include.
virtual void PushAlphaBlendFunc()=0
Definition: scoped_ptr.h:53
Definition: gls_color.h:53
A smart pointer with unique ownership – poor man's std::unique_ptr.
virtual void SetDefaultAlphaBlendFunc()=0
Definition: non_copyable.h:45
Definition: bmpimage.h:46
virtual void AlphaBlendFunc(GLenum src, GLenum dst)=0
virtual ~IGlsStateManager()
Definition: gls_state_manager_interface.h:316
IFontImage.
The gls_gl.