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.

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