Merge remote-tracking branch 'glBitmap@DGL/master'
[LazOpenGLCore.git] / uglcTypes.pas
1 unit uglcTypes;
2
3 { Package:      OpenGLCore
4   Prefix:       glc - OpenGL Core
5   Beschreibung: diese Unit definiert Enum-Typen die OpenGL Konstanten wrappen und stellt zusätzlich
6                 Funktions-Wrapper zur verfügung die diese Enum-Typen als Parameter entgegen nehmen }
7
8 {$mode objfpc}{$H+}
9 {$MACRO ON}
10 {$SCOPEDENUMS ON}
11
12 interface
13
14 uses
15   {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF}, sysutils;
16
17 type
18   TglcFace = (
19     faFront = GL_FRONT,
20     faBack  = GL_BACK,
21     faBoth  = GL_FRONT_AND_BACK);
22
23 {$IFNDEF OPENGL_ES}
24   TglcPolygonMode = (
25     pmPoint = GL_POINT,
26     pmLine  = GL_LINE,
27     pmFill  = GL_FILL);
28 {$ENDIF}
29
30   TglcDepthFunc = (
31     dfNever         = GL_NEVER,
32     dfLess          = GL_LESS,
33     dfEqual         = GL_EQUAL,
34     dfLessEqual     = GL_LEQUAL,
35     dfGreater       = GL_GREATER,
36     dfNotEqual      = GL_NOTEQUAL,
37     dfGreaterEqual  = GL_GEQUAL,
38     dfAlways        = GL_ALWAYS);
39
40   TglcClearBuffer = (
41     cbDepthBuffer   = GL_DEPTH_BUFFER_BIT,
42 {$IFNDEF OPENGL_ES}
43     cbAccumBuffer   = GL_ACCUM_BUFFER_BIT,
44 {$ENDIF}
45     cbStencilBuffer = GL_STENCIL_BUFFER_BIT,
46     cbColorBuffer   = GL_COLOR_BUFFER_BIT);
47
48   TglcTextureMinFilter = (
49     mfNearest              = GL_NEAREST,
50     mfLinear               = GL_LINEAR,
51     mfNearestMipmapNearest = GL_NEAREST_MIPMAP_NEAREST,
52     mfLinearMipmapNearest  = GL_LINEAR_MIPMAP_NEAREST,
53     mfNearestMipmapLinear  = GL_NEAREST_MIPMAP_LINEAR,
54     mfLinearMipmapLinear   = GL_LINEAR_MIPMAP_LINEAR);
55
56   TglcTextureMagFilter = (
57     mfNearest = GL_NEAREST,
58     mfLinear  = GL_LINEAR);
59
60   TglcTextureWrap = (
61 {$IFNDEF OPENGL_ES}
62     twClamp          = GL_CLAMP,
63 {$ENDIF}
64     twRepeat         = GL_REPEAT,
65 {$IFNDEF OPENGL_ES}
66     twClampToBorder  = GL_CLAMP_TO_BORDER,
67 {$ENDIF}
68     twClampToEdge    = GL_CLAMP_TO_EDGE,
69     twMirroredRepeat = GL_MIRRORED_REPEAT);
70
71   TglcBlendFactor = (
72     bfZero               = GL_ZERO,
73     bfOne                = GL_ONE,
74     bfSrcColor           = GL_SRC_COLOR,
75     bfOneMinusSrcColor   = GL_ONE_MINUS_SRC_COLOR,
76     bfSrcAlpha           = GL_SRC_ALPHA,
77     bfOneMinusSrcAlpha   = GL_ONE_MINUS_SRC_ALPHA,
78     bfDstAlpha           = GL_DST_ALPHA,
79     bfOneMinusDstAlpha   = GL_ONE_MINUS_DST_ALPHA,
80     bfDstColor           = GL_DST_COLOR,
81     bfOneMinusDstColor   = GL_ONE_MINUS_DST_COLOR,
82     bfSrcAlphaSaturate   = GL_SRC_ALPHA_SATURATE,
83     bgConstColor         = GL_CONSTANT_COLOR,
84     bfOneMinusConstColor = GL_ONE_MINUS_CONSTANT_COLOR,
85     bfConstAlpha         = GL_CONSTANT_ALPHA,
86     bfOneMinusConstAlpha = GL_ONE_MINUS_CONSTANT_ALPHA);
87
88   TglcBlendMode = (
89     bmNone,
90     bmAlphaBlend,
91     bmAdditiveAlphaBlend,
92     bmAdditiveBlend);
93
94   TglcFormat = (
95     fmUnknown           = 0,
96 {$IFNDEF OPENGL_ES}
97     fmColorIndex        = GL_COLOR_INDEX,
98 {$ENDIF}
99     fmDepthComponent    = GL_DEPTH_COMPONENT,
100     fmRed               = GL_RED,
101     fmGreen             = GL_GREEN,
102     fmBlue              = GL_BLUE,
103     fmAlpha             = GL_ALPHA,
104     fmRGB               = GL_RGB,
105     fmRGBA              = GL_RGBA,
106     fmLuminance         = GL_LUMINANCE,
107     fmLuminanceAlpha    = GL_LUMINANCE_ALPHA,
108 {$IFNDEF OPENGL_ES}
109     fmBGR               = GL_BGR,
110     fmBGRA              = GL_BGRA,
111 {$ENDIF}
112     fmDepthStencil      = GL_DEPTH_STENCIL);
113
114   TglcInternalFormat = (
115     ifUnknown                   = 0,
116     ifDepthComponent            = GL_DEPTH_COMPONENT,
117     ifAlpha                     = GL_ALPHA,
118     ifRGB                       = GL_RGB,
119     ifRGBA                      = GL_RGBA,
120     ifLuminance                 = GL_LUMINANCE,
121     ifLuminanceAlpha            = GL_LUMINANCE_ALPHA,
122 {$IFNDEF OPENGL_ES}
123     ifR3G3B2                    = GL_R3_G3_B2,
124     ifAlpha4                    = GL_ALPHA4,
125     ifAlpha8                    = GL_ALPHA8,
126     ifAlpha12                   = GL_ALPHA12,
127     ifAlpha16                   = GL_ALPHA16,
128     ifLuminance4                = GL_LUMINANCE4,
129     ifLuminance8                = GL_LUMINANCE8,
130     ifLuminance12               = GL_LUMINANCE12,
131     ifLuminance16               = GL_LUMINANCE16,
132     ifLuminance4Alpha4          = GL_LUMINANCE4_ALPHA4,
133     ifLuminance6Alpha2          = GL_LUMINANCE6_ALPHA2,
134     ifLuminance8Alpha8          = GL_LUMINANCE8_ALPHA8,
135     ifLuminance12Alpha4         = GL_LUMINANCE12_ALPHA4,
136     ifLuminance12Alpha12        = GL_LUMINANCE12_ALPHA12,
137     ifLuminance16Alpha16        = GL_LUMINANCE16_ALPHA16,
138     ifIntensity                 = GL_INTENSITY,
139     ifIntensity4                = GL_INTENSITY4,
140     ifIntensity8                = GL_INTENSITY8,
141     ifIntensity12               = GL_INTENSITY12,
142     ifIntensity16               = GL_INTENSITY16,
143     ifRGB4                      = GL_RGB4,
144     ifRGB5                      = GL_RGB5,
145 {$ENDIF}
146     ifRGB8                      = GL_RGB8,
147 {$IFNDEF OPENGL_ES}
148     ifRGB10                     = GL_RGB10,
149     ifRGB12                     = GL_RGB12,
150     ifRGB16                     = GL_RGB16,
151     ifRGBA2                     = GL_RGBA2,
152 {$ENDIF}
153     ifRGBA4                     = GL_RGBA4,
154     ifRGB5A1                    = GL_RGB5_A1,
155     ifRGBA8                     = GL_RGBA8,
156     ifRGB10A2                   = GL_RGB10_A2,
157 {$IFNDEF OPENGL_ES}
158     ifRGBA12                    = GL_RGBA12,
159     ifRGBA16                    = GL_RGBA16,
160 {$ENDIF}
161     ifDepthComponent16          = GL_DEPTH_COMPONENT16,
162     ifDepthComponent24          = GL_DEPTH_COMPONENT24,
163 {$IFNDEF OPENGL_ES}
164     ifDepthComponent32          = GL_DEPTH_COMPONENT32,
165     ifCompressedAlpha           = GL_COMPRESSED_ALPHA,
166     ifCompressedLuminance       = GL_COMPRESSED_LUMINANCE,
167     ifCompressedLuminanceAlpha  = GL_COMPRESSED_LUMINANCE_ALPHA,
168     ifCompressedIntensity       = GL_COMPRESSED_INTENSITY,
169     ifCompressedRGB             = GL_COMPRESSED_RGB,
170     ifCompressedRGBA            = GL_COMPRESSED_RGBA,
171 {$ENDIF}
172     ifRGBA32f                   = GL_RGBA32F,
173     ifRGB32f                    = GL_RGB32F,
174     ifRGBA16F                   = GL_RGBA16F,
175     ifRGB16F                    = GL_RGB16F,
176     ifDepth24Stencil8           = GL_DEPTH24_STENCIL8,
177     ifSRGB                      = GL_SRGB,
178     ifSRGB8                     = GL_SRGB8,
179 {$IFNDEF OPENGL_ES}
180     ifSRGBA                     = GL_SRGB_ALPHA,
181 {$ENDIF}
182     ifSRGBA8                    = GL_SRGB8_ALPHA8,
183 {$IFNDEF OPENGL_ES}
184     ifSLuminanceAlpha           = GL_SLUMINANCE_ALPHA,
185     ifSLuminance8Alpha8         = GL_SLUMINANCE8_ALPHA8,
186     ifSLuminance                = GL_SLUMINANCE,
187     ifSLuminance8               = GL_SLUMINANCE8,
188 {$ENDIF}
189     ifDepth32fStencil8          = GL_DEPTH32F_STENCIL8,
190 {$IFNDEF OPENGL_ES}
191     ifStencil1                  = GL_STENCIL_INDEX1,
192     ifStencil4                  = GL_STENCIL_INDEX4,
193 {$ENDIF}
194     ifStencil8                  = GL_STENCIL_INDEX8
195 {$IFNDEF OPENGL_ES}
196     , ifStencil16                 = GL_STENCIL_INDEX16
197 {$ENDIF}
198   );
199
200   TglcAttachment = (
201     atDepthStencil = GL_DEPTH_STENCIL_ATTACHMENT,
202     atColor0       = GL_COLOR_ATTACHMENT0,
203     atColor1       = GL_COLOR_ATTACHMENT1,
204     atColor2       = GL_COLOR_ATTACHMENT2,
205     atColor3       = GL_COLOR_ATTACHMENT3,
206     atColor4       = GL_COLOR_ATTACHMENT4,
207     atColor5       = GL_COLOR_ATTACHMENT5,
208     atColor6       = GL_COLOR_ATTACHMENT6,
209     atColor7       = GL_COLOR_ATTACHMENT7,
210     atColor8       = GL_COLOR_ATTACHMENT8,
211     atColor9       = GL_COLOR_ATTACHMENT9,
212     atColor10      = GL_COLOR_ATTACHMENT10,
213     atColor11      = GL_COLOR_ATTACHMENT11,
214     atColor12      = GL_COLOR_ATTACHMENT12,
215     atColor13      = GL_COLOR_ATTACHMENT13,
216     atColor14      = GL_COLOR_ATTACHMENT14,
217     atColor15      = GL_COLOR_ATTACHMENT15,
218     atDepth        = GL_DEPTH_ATTACHMENT,
219     atStencil      = GL_STENCIL_ATTACHMENT);
220
221   TglcShaderType = (
222     stFragment        = GL_FRAGMENT_SHADER,
223     stVertex          = GL_VERTEX_SHADER
224 {$IFNDEF OPENGL_ES}
225     , stGeometry        = GL_GEOMETRY_SHADER
226     , stTessEvaluation  = GL_TESS_EVALUATION_SHADER
227     , stTessControl     = GL_TESS_CONTROL_SHADER
228 {$ENDIF}
229   );
230
231   TglcBufferTarget = (
232     btArrayBuffer        = GL_ARRAY_BUFFER,
233     btElementArrayBuffer = GL_ELEMENT_ARRAY_BUFFER);
234
235   TglcBufferUsage = (
236     buStreamDraw  = GL_STREAM_DRAW,
237     buStreamRead  = GL_STREAM_READ,
238     buStreamCopy  = GL_STREAM_COPY,
239     buStaticDraw  = GL_STATIC_DRAW,
240     buStaticRead  = GL_STATIC_READ,
241     buStaticCopy  = GL_STATIC_COPY,
242     buDynamicDraw = GL_DYNAMIC_DRAW,
243     buDynamicRead = GL_DYNAMIC_READ,
244     buDynamicCopy = GL_DYNAMIC_COPY);
245
246   TglcBufferAccess = (
247     baReadOnly  = GL_READ_ONLY,
248     baWriteOnly = GL_WRITE_ONLY,
249     baReadWrite = GL_READ_WRITE);
250
251   EOpenGL = class(Exception)
252   private
253     fErrorCode: GLenum;
254   public
255     property ErrorCode: GLenum read fErrorCode;
256     constructor Create(const aErrorCode: GLenum);
257     constructor Create(const aMsg: String; const aErrorCode: GLenum);
258   end;
259
260 procedure glcRenderFace(const aValue: TglcFace); inline;
261 procedure glcDepthFunc(const aValue: TglcDepthFunc); inline;
262 procedure glcBlendFunc(const aSource, aDest: TglcBlendFactor); inline; overload;
263 procedure glcBlendFunc(const aMode: TglcBlendMode); inline; overload;
264 procedure glcCheckAndRaiseError;
265 {$IFNDEF OPENGL_ES}
266 procedure glcPolygonMode(const aFace: TglcFace; const aValue: TglcPolygonMode); inline;
267 {$ENDIF}
268
269 implementation
270
271 type
272   TglcBlendModeValue = packed record
273     src, dst: TglcBlendFactor;
274   end;
275
276 const
277   BLEND_MODE_VALUES: array[TglcBlendMode] of TglcBlendModeValue = (
278     (src: TglcBlendFactor.bfOne;         dst: TglcBlendFactor.bfZero),                        //bmNone
279     (src: TglcBlendFactor.bfSrcAlpha;    dst: TglcBlendFactor.bfOneMinusSrcAlpha),            //bmAlphaBlend
280     (src: TglcBlendFactor.bfSrcAlpha;    dst: TglcBlendFactor.bfOne),                         //bmAdditiveAlphaBlend
281     (src: TglcBlendFactor.bfOne;         dst: TglcBlendFactor.bfOne));                        //bmAdditiveBlend
282
283 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
284 procedure glcRenderFace(const aValue: TglcFace);
285 begin
286   case aValue of
287     TglcFace.faBoth: begin
288       glDisable(GL_CULL_FACE);
289     end;
290     TglcFace.faFront: begin
291       glEnable(GL_CULL_FACE);
292       glCullFace(GL_BACK);
293     end;
294     TglcFace.faBack: begin
295       glEnable(GL_CULL_FACE);
296       glCullFace(GL_FRONT);
297     end;
298   end;
299 end;
300
301 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
302 procedure glcDepthFunc(const aValue: TglcDepthFunc);
303 begin
304   glDepthFunc(GLenum(aValue));
305 end;
306
307 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
308 procedure glcBlendFunc(const aSource, aDest: TglcBlendFactor);
309 begin
310   glBlendFunc(GLenum(aSource), GLenum(aDest));
311 end;
312
313 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
314 procedure glcBlendFunc(const aMode: TglcBlendMode); overload;
315 begin
316   glBlendFunc(GLenum(BLEND_MODE_VALUES[aMode].src), GLenum(BLEND_MODE_VALUES[aMode].dst));
317 end;
318
319 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
320 procedure glcCheckAndRaiseError;
321 var
322   e: GLenum;
323 begin
324   e := glGetError();
325   if (e <> GL_NO_ERROR) then
326     raise EOpenGL.Create(e);
327 end;
328
329 {$IFNDEF OPENGL_ES}
330 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
331 procedure glcPolygonMode(const aFace: TglcFace; const aValue: TglcPolygonMode);
332 begin
333   glPolygonMode(GLenum(aFace), GLenum(aValue));
334 end;
335 {$ENDIF}
336
337 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
338 //EOpenGL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
339 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
340 constructor EOpenGL.Create(const aErrorCode: GLenum);
341 begin
342   fErrorCode := aErrorCode;
343 {$IFNDEF OPENGL_ES}
344   inherited Create(gluErrorString(fErrorCode));
345 {$ELSE}
346   inherited Create('OpenGL Error: ' + IntToHex(fErrorCode, 8));
347 {$ENDIF}
348 end;
349
350 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
351 constructor EOpenGL.Create(const aMsg: String; const aErrorCode: GLenum);
352 begin
353   fErrorCode := aErrorCode;
354 {$IFNDEF OPENGL_ES}
355   inherited Create(aMsg + ': ' + gluErrorString(fErrorCode))
356 {$ELSE}
357   inherited Create(aMsg + ': ' + IntToHex(fErrorCode, 8));
358 {$ENDIF}
359 end;
360
361 end.
362