You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

363 lines
13 KiB

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