unit uglcTypes; { Package: OpenGLCore Prefix: glc - OpenGL Core Beschreibung: diese Unit definiert Enum-Typen die OpenGL Konstanten wrappen und stellt zusätzlich Funktions-Wrapper zur verfügung die diese Enum-Typen als Parameter entgegen nehmen } {$mode objfpc}{$H+} {$MACRO ON} {$SCOPEDENUMS ON} interface uses dglOpenGL, sysutils; type TglcFace = ( faFront = GL_FRONT, faBack = GL_BACK, faBoth = GL_FRONT_AND_BACK); TglcPolygonMode = ( pmPoint = GL_POINT, pmLine = GL_LINE, pmFill = GL_FILL); TglcDepthFunc = ( dfNever = GL_NEVER, dfLess = GL_LESS, dfEqual = GL_EQUAL, dfLessEqual = GL_LEQUAL, dfGreater = GL_GREATER, dfNotEqual = GL_NOTEQUAL, dfGreaterEqual = GL_GEQUAL, dfAlways = GL_ALWAYS); TglcClearBuffer = ( cbDepthBuffer = GL_DEPTH_BUFFER_BIT, cbAccumBuffer = GL_ACCUM_BUFFER_BIT, cbStencilBuffer = GL_STENCIL_BUFFER_BIT, cbColorBuffer = GL_COLOR_BUFFER_BIT); TglcTextureMinFilter = ( mfNearest = GL_NEAREST, mfLinear = GL_LINEAR, mfNearestMipmapNearest = GL_NEAREST_MIPMAP_NEAREST, mfLinearMipmapNearest = GL_LINEAR_MIPMAP_NEAREST, mfNearestMipmapLinear = GL_NEAREST_MIPMAP_LINEAR, mfLinearMipmapLinear = GL_LINEAR_MIPMAP_LINEAR); TglcTextureMagFilter = ( mfNearest = GL_NEAREST, mfLinear = GL_LINEAR); TglcTextureWrap = ( twClamp = GL_CLAMP, twRepeat = GL_REPEAT, twClampToBorder = GL_CLAMP_TO_BORDER, twClampToEdge = GL_CLAMP_TO_EDGE, twMirroredRepeat = GL_MIRRORED_REPEAT); TglcBlendFactor = ( bfZero = GL_ZERO, bfOne = GL_ONE, bfSrcColor = GL_SRC_COLOR, bfOneMinusSrcColor = GL_ONE_MINUS_SRC_COLOR, bfSrcAlpha = GL_SRC_ALPHA, bfOneMinusSrcAlpha = GL_ONE_MINUS_SRC_ALPHA, bfDstAlpha = GL_DST_ALPHA, bfOneMinusDstAlpha = GL_ONE_MINUS_DST_ALPHA, bfDstColor = GL_DST_COLOR, bfOneMinusDstColor = GL_ONE_MINUS_DST_COLOR, bfSrcAlphaSaturate = GL_SRC_ALPHA_SATURATE, bgConstColor = GL_CONSTANT_COLOR, bfOneMinusConstColor = GL_ONE_MINUS_CONSTANT_COLOR, bfConstAlpha = GL_CONSTANT_ALPHA, bfOneMinusConstAlpha = GL_ONE_MINUS_CONSTANT_ALPHA); TglcBlendMode = ( bmNone, bmAlphaBlend, bmAdditiveAlphaBlend, bmAdditiveBlend); TglcFormat = ( fmUnknown = 0, fmColorIndex = GL_COLOR_INDEX, fmDepthComponent = GL_DEPTH_COMPONENT, fmRed = GL_RED, fmGreen = GL_GREEN, fmBlue = GL_BLUE, fmAlpha = GL_ALPHA, fmRGB = GL_RGB, fmRGBA = GL_RGBA, fmLuminance = GL_LUMINANCE, fmLuminanceAlpha = GL_LUMINANCE_ALPHA, fmBGR = GL_BGR, fmBGRA = GL_BGRA, fmDepthStencil = GL_DEPTH_STENCIL); TglcInternalFormat = ( ifUnknown = 0, ifDepthComponent = GL_DEPTH_COMPONENT, ifAlpha = GL_ALPHA, ifRGB = GL_RGB, ifRGBA = GL_RGBA, ifLuminance = GL_LUMINANCE, ifLuminanceAlpha = GL_LUMINANCE_ALPHA, ifR3G3B2 = GL_R3_G3_B2, ifAlpha4 = GL_ALPHA4, ifAlpha8 = GL_ALPHA8, ifAlpha12 = GL_ALPHA12, ifAlpha16 = GL_ALPHA16, ifLuminance4 = GL_LUMINANCE4, ifLuminance8 = GL_LUMINANCE8, ifLuminance12 = GL_LUMINANCE12, ifLuminance16 = GL_LUMINANCE16, ifLuminance4Alpha4 = GL_LUMINANCE4_ALPHA4, ifLuminance6Alpha2 = GL_LUMINANCE6_ALPHA2, ifLuminance8Alpha8 = GL_LUMINANCE8_ALPHA8, ifLuminance12Alpha4 = GL_LUMINANCE12_ALPHA4, ifLuminance12Alpha12 = GL_LUMINANCE12_ALPHA12, ifLuminance16Alpha16 = GL_LUMINANCE16_ALPHA16, ifIntensity = GL_INTENSITY, ifIntensity4 = GL_INTENSITY4, ifIntensity8 = GL_INTENSITY8, ifIntensity12 = GL_INTENSITY12, ifIntensity16 = GL_INTENSITY16, ifRGB4 = GL_RGB4, ifRGB5 = GL_RGB5, ifRGB8 = GL_RGB8, ifRGB10 = GL_RGB10, ifRGB12 = GL_RGB12, ifRGB16 = GL_RGB16, ifRGBA2 = GL_RGBA2, ifRGBA4 = GL_RGBA4, ifRGB5A1 = GL_RGB5_A1, ifRGBA8 = GL_RGBA8, ifRGB10A2 = GL_RGB10_A2, ifRGBA12 = GL_RGBA12, ifRGBA16 = GL_RGBA16, ifDepthComponent16 = GL_DEPTH_COMPONENT16, ifDepthComponent24 = GL_DEPTH_COMPONENT24, ifDepthComponent32 = GL_DEPTH_COMPONENT32, ifCompressedAlpha = GL_COMPRESSED_ALPHA, ifCompressedLuminance = GL_COMPRESSED_LUMINANCE, ifCompressedLuminanceAlpha = GL_COMPRESSED_LUMINANCE_ALPHA, ifCompressedIntensity = GL_COMPRESSED_INTENSITY, ifCompressedRGB = GL_COMPRESSED_RGB, ifCompressedRGBA = GL_COMPRESSED_RGBA, ifRGBA32f = GL_RGBA32F, ifRGB32f = GL_RGB32F, ifRGBA16F = GL_RGBA16F, ifRGB16F = GL_RGB16F, ifDepth24Stencil8 = GL_DEPTH24_STENCIL8, ifSRGB = GL_SRGB, ifSRGB8 = GL_SRGB8, ifSRGBA = GL_SRGB_ALPHA, ifSRGBA8 = GL_SRGB8_ALPHA8, ifSLuminanceAlpha = GL_SLUMINANCE_ALPHA, ifSLuminance8Alpha8 = GL_SLUMINANCE8_ALPHA8, ifSLuminance = GL_SLUMINANCE, ifSLuminance8 = GL_SLUMINANCE8, ifDepth32fStencil8 = GL_DEPTH32F_STENCIL8, ifStencil1 = GL_STENCIL_INDEX1, ifStencil4 = GL_STENCIL_INDEX4, ifStencil8 = GL_STENCIL_INDEX8, ifStencil16 = GL_STENCIL_INDEX16); TglcAttachment = ( atDepthStencil = GL_DEPTH_STENCIL_ATTACHMENT, atColor0 = GL_COLOR_ATTACHMENT0, atColor1 = GL_COLOR_ATTACHMENT1, atColor2 = GL_COLOR_ATTACHMENT2, atColor3 = GL_COLOR_ATTACHMENT3, atColor4 = GL_COLOR_ATTACHMENT4, atColor5 = GL_COLOR_ATTACHMENT5, atColor6 = GL_COLOR_ATTACHMENT6, atColor7 = GL_COLOR_ATTACHMENT7, atColor8 = GL_COLOR_ATTACHMENT8, atColor9 = GL_COLOR_ATTACHMENT9, atColor10 = GL_COLOR_ATTACHMENT10, atColor11 = GL_COLOR_ATTACHMENT11, atColor12 = GL_COLOR_ATTACHMENT12, atColor13 = GL_COLOR_ATTACHMENT13, atColor14 = GL_COLOR_ATTACHMENT14, atColor15 = GL_COLOR_ATTACHMENT15, atDepth = GL_DEPTH_ATTACHMENT, atStencil = GL_STENCIL_ATTACHMENT); TglcShaderType = ( stFragment = GL_FRAGMENT_SHADER, stVertex = GL_VERTEX_SHADER, stGeometry = GL_GEOMETRY_SHADER, stTessEvaluation = GL_TESS_EVALUATION_SHADER, stTessControl = GL_TESS_CONTROL_SHADER); TglcBufferTarget = ( btArrayBuffer = GL_ARRAY_BUFFER, btElementArrayBuffer = GL_ELEMENT_ARRAY_BUFFER); TglcBufferUsage = ( buStreamDraw = GL_STREAM_DRAW, buStreamRead = GL_STREAM_READ, buStreamCopy = GL_STREAM_COPY, buStaticDraw = GL_STATIC_DRAW, buStaticRead = GL_STATIC_READ, buStaticCopy = GL_STATIC_COPY, buDynamicDraw = GL_DYNAMIC_DRAW, buDynamicRead = GL_DYNAMIC_READ, buDynamicCopy = GL_DYNAMIC_COPY); TglcBufferAccess = ( baReadOnly = GL_READ_ONLY, baWriteOnly = GL_WRITE_ONLY, baReadWrite = GL_READ_WRITE); EOpenGL = class(Exception) private fErrorCode: GLenum; public property ErrorCode: GLenum read fErrorCode; constructor Create(const aErrorCode: GLenum); constructor Create(const aMsg: String; const aErrorCode: GLenum); end; procedure glcRenderFace(const aValue: TglcFace); inline; procedure glcPolygonMode(const aFace: TglcFace; const aValue: TglcPolygonMode); inline; procedure glcDepthFunc(const aValue: TglcDepthFunc); inline; procedure glcBlendFunc(const aSource, aDest: TglcBlendFactor); inline; overload; procedure glcBlendFunc(const aMode: TglcBlendMode); inline; overload; procedure glcCheckAndRaiseError; implementation type TglcBlendModeValue = packed record src, dst: TglcBlendFactor; end; const BLEND_MODE_VALUES: array[TglcBlendMode] of TglcBlendModeValue = ( (src: TglcBlendFactor.bfOne; dst: TglcBlendFactor.bfZero), //bmNone (src: TglcBlendFactor.bfSrcAlpha; dst: TglcBlendFactor.bfOneMinusSrcAlpha), //bmAlphaBlend (src: TglcBlendFactor.bfSrcAlpha; dst: TglcBlendFactor.bfOne), //bmAdditiveAlphaBlend (src: TglcBlendFactor.bfOne; dst: TglcBlendFactor.bfOne)); //bmAdditiveBlend //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure glcRenderFace(const aValue: TglcFace); begin case aValue of TglcFace.faBoth: begin glDisable(GL_CULL_FACE); end; TglcFace.faFront: begin glEnable(GL_CULL_FACE); glCullFace(GL_BACK); end; TglcFace.faBack: begin glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); end; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure glcPolygonMode(const aFace: TglcFace; const aValue: TglcPolygonMode); begin glPolygonMode(GLenum(aFace), GLenum(aValue)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure glcDepthFunc(const aValue: TglcDepthFunc); begin glDepthFunc(GLenum(aValue)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure glcBlendFunc(const aSource, aDest: TglcBlendFactor); begin glBlendFunc(GLenum(aSource), GLenum(aDest)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure glcBlendFunc(const aMode: TglcBlendMode); overload; begin glBlendFunc(GLenum(BLEND_MODE_VALUES[aMode].src), GLenum(BLEND_MODE_VALUES[aMode].dst)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure glcCheckAndRaiseError; var e: GLenum; begin e := glGetError(); if (e <> GL_NO_ERROR) then raise EOpenGL.Create(e); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //EOpenGL/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EOpenGL.Create(const aErrorCode: GLenum); begin fErrorCode := aErrorCode; inherited Create(gluErrorString(fErrorCode)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor EOpenGL.Create(const aMsg: String; const aErrorCode: GLenum); begin fErrorCode := aErrorCode; inherited Create(aMsg + ': ' + gluErrorString(fErrorCode)) end; end.