| @@ -26,7 +26,7 @@ unit glBitmap; | |||
| // Please uncomment the defines below to configure the glBitmap to your preferences. | |||
| // If you have configured the unit you can uncomment the warning above. | |||
| {$MESSAGE error 'Hey. I''m the glBitmap.pas and i need to be configured. My master tell me your preferences! ;)'} | |||
| {.$MESSAGE error 'Hey. I''m the glBitmap.pas and i need to be configured. My master tell me your preferences! ;)'} | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| // Preferences /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -44,14 +44,6 @@ unit glBitmap; | |||
| {.$DEFINE OPENGL_ES_EXT} | |||
| // activate to enable build-in OpenGL support with statically linked methods | |||
| // use dglOpenGL.pas if not enabled | |||
| {.$DEFINE GLB_NATIVE_OGL_STATIC} | |||
| // activate to enable build-in OpenGL support with dynamically linked methods | |||
| // use dglOpenGL.pas if not enabled | |||
| {.$DEFINE GLB_NATIVE_OGL_DYNAMIC} | |||
| // activate to enable the support for SDL_surfaces | |||
| {.$DEFINE GLB_SDL} | |||
| @@ -126,15 +118,6 @@ unit glBitmap; | |||
| {$IF DEFINED(OPENGL_ES_2_0)} {$DEFINE OPENGL_ES_1_1} {$IFEND} | |||
| {$IF DEFINED(OPENGL_ES_1_1)} {$DEFINE OPENGL_ES} {$IFEND} | |||
| // native OpenGL Support | |||
| {$IF DEFINED(GLB_NATIVE_OGL_STATIC) OR DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | |||
| {$IFDEF OPENGL_ES} | |||
| {$ERROR 'native OpenGL is not supported yet for OpenGL ES, please use dglOpenGLES.pas instead'} | |||
| {$ELSE} | |||
| {$DEFINE GLB_NATIVE_OGL} | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| // checking define combinations | |||
| //SDL Image | |||
| {$IFDEF GLB_SDL_IMAGE} | |||
| @@ -253,11 +236,6 @@ unit glBitmap; | |||
| {$DEFINE GLB_SUPPORT_JPEG_WRITE} | |||
| {$ENDIF} | |||
| // native OpenGL | |||
| {$IF DEFINED(GLB_NATIVE_OGL_STATIC) AND DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | |||
| {$MESSAGE warn 'GLB_NATIVE_OGL_STATIC will be ignored because you enabled GLB_NATIVE_OGL_DYNAMIC'} | |||
| {$IFEND} | |||
| // general options | |||
| {$EXTENDEDSYNTAX ON} | |||
| {$LONGSTRINGS ON} | |||
| @@ -269,13 +247,11 @@ unit glBitmap; | |||
| interface | |||
| uses | |||
| {$IFNDEF GLB_NATIVE_OGL} | |||
| {$IFDEF OPENGL_ES} dglOpenGLES, | |||
| {$ELSE} dglOpenGL, {$ENDIF} | |||
| {$ENDIF} | |||
| {$IFDEF OPENGL_ES} dglOpenGLES, | |||
| {$ELSE} dglOpenGL, {$ENDIF} | |||
| {$IF DEFINED(GLB_WIN) AND | |||
| (DEFINED(GLB_NATIVE_OGL) OR | |||
| DEFINED(GLB_DELPHI))} windows, {$IFEND} | |||
| DEFINED(GLB_DELPHI)} windows, {$IFEND} | |||
| {$IFDEF GLB_SDL} SDL, {$ENDIF} | |||
| {$IFDEF GLB_LAZARUS} IntfGraphics, GraphType, Graphics, {$ENDIF} | |||
| @@ -289,319 +265,6 @@ uses | |||
| Classes, SysUtils; | |||
| {$IFDEF GLB_NATIVE_OGL} | |||
| const | |||
| GL_TRUE = 1; | |||
| GL_FALSE = 0; | |||
| GL_ZERO = 0; | |||
| GL_ONE = 1; | |||
| GL_VERSION = $1F02; | |||
| GL_EXTENSIONS = $1F03; | |||
| GL_TEXTURE_1D = $0DE0; | |||
| GL_TEXTURE_2D = $0DE1; | |||
| GL_TEXTURE_RECTANGLE = $84F5; | |||
| GL_NORMAL_MAP = $8511; | |||
| GL_TEXTURE_CUBE_MAP = $8513; | |||
| GL_REFLECTION_MAP = $8512; | |||
| GL_TEXTURE_CUBE_MAP_POSITIVE_X = $8515; | |||
| GL_TEXTURE_CUBE_MAP_NEGATIVE_X = $8516; | |||
| GL_TEXTURE_CUBE_MAP_POSITIVE_Y = $8517; | |||
| GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = $8518; | |||
| GL_TEXTURE_CUBE_MAP_POSITIVE_Z = $8519; | |||
| GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = $851A; | |||
| GL_TEXTURE_WIDTH = $1000; | |||
| GL_TEXTURE_HEIGHT = $1001; | |||
| GL_TEXTURE_INTERNAL_FORMAT = $1003; | |||
| GL_TEXTURE_SWIZZLE_RGBA = $8E46; | |||
| GL_S = $2000; | |||
| GL_T = $2001; | |||
| GL_R = $2002; | |||
| GL_Q = $2003; | |||
| GL_TEXTURE_GEN_S = $0C60; | |||
| GL_TEXTURE_GEN_T = $0C61; | |||
| GL_TEXTURE_GEN_R = $0C62; | |||
| GL_TEXTURE_GEN_Q = $0C63; | |||
| GL_RED = $1903; | |||
| GL_GREEN = $1904; | |||
| GL_BLUE = $1905; | |||
| GL_ALPHA = $1906; | |||
| GL_ALPHA4 = $803B; | |||
| GL_ALPHA8 = $803C; | |||
| GL_ALPHA12 = $803D; | |||
| GL_ALPHA16 = $803E; | |||
| GL_LUMINANCE = $1909; | |||
| GL_LUMINANCE4 = $803F; | |||
| GL_LUMINANCE8 = $8040; | |||
| GL_LUMINANCE12 = $8041; | |||
| GL_LUMINANCE16 = $8042; | |||
| GL_LUMINANCE_ALPHA = $190A; | |||
| GL_LUMINANCE4_ALPHA4 = $8043; | |||
| GL_LUMINANCE6_ALPHA2 = $8044; | |||
| GL_LUMINANCE8_ALPHA8 = $8045; | |||
| GL_LUMINANCE12_ALPHA4 = $8046; | |||
| GL_LUMINANCE12_ALPHA12 = $8047; | |||
| GL_LUMINANCE16_ALPHA16 = $8048; | |||
| GL_RGB = $1907; | |||
| GL_BGR = $80E0; | |||
| GL_R3_G3_B2 = $2A10; | |||
| GL_RGB4 = $804F; | |||
| GL_RGB5 = $8050; | |||
| GL_RGB565 = $8D62; | |||
| GL_RGB8 = $8051; | |||
| GL_RGB10 = $8052; | |||
| GL_RGB12 = $8053; | |||
| GL_RGB16 = $8054; | |||
| GL_RGBA = $1908; | |||
| GL_BGRA = $80E1; | |||
| GL_RGBA2 = $8055; | |||
| GL_RGBA4 = $8056; | |||
| GL_RGB5_A1 = $8057; | |||
| GL_RGBA8 = $8058; | |||
| GL_RGB10_A2 = $8059; | |||
| GL_RGBA12 = $805A; | |||
| GL_RGBA16 = $805B; | |||
| GL_DEPTH_COMPONENT = $1902; | |||
| GL_DEPTH_COMPONENT16 = $81A5; | |||
| GL_DEPTH_COMPONENT24 = $81A6; | |||
| GL_DEPTH_COMPONENT32 = $81A7; | |||
| GL_COMPRESSED_RGB = $84ED; | |||
| GL_COMPRESSED_RGBA = $84EE; | |||
| GL_COMPRESSED_RGB_S3TC_DXT1_EXT = $83F0; | |||
| GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = $83F1; | |||
| GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = $83F2; | |||
| GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = $83F3; | |||
| GL_UNSIGNED_BYTE = $1401; | |||
| GL_UNSIGNED_BYTE_3_3_2 = $8032; | |||
| GL_UNSIGNED_BYTE_2_3_3_REV = $8362; | |||
| GL_UNSIGNED_SHORT = $1403; | |||
| GL_UNSIGNED_SHORT_5_6_5 = $8363; | |||
| GL_UNSIGNED_SHORT_4_4_4_4 = $8033; | |||
| GL_UNSIGNED_SHORT_5_5_5_1 = $8034; | |||
| GL_UNSIGNED_SHORT_5_6_5_REV = $8364; | |||
| GL_UNSIGNED_SHORT_4_4_4_4_REV = $8365; | |||
| GL_UNSIGNED_SHORT_1_5_5_5_REV = $8366; | |||
| GL_UNSIGNED_INT = $1405; | |||
| GL_UNSIGNED_INT_8_8_8_8 = $8035; | |||
| GL_UNSIGNED_INT_10_10_10_2 = $8036; | |||
| GL_UNSIGNED_INT_8_8_8_8_REV = $8367; | |||
| GL_UNSIGNED_INT_2_10_10_10_REV = $8368; | |||
| { Texture Filter } | |||
| GL_TEXTURE_MAG_FILTER = $2800; | |||
| GL_TEXTURE_MIN_FILTER = $2801; | |||
| GL_NEAREST = $2600; | |||
| GL_NEAREST_MIPMAP_NEAREST = $2700; | |||
| GL_NEAREST_MIPMAP_LINEAR = $2702; | |||
| GL_LINEAR = $2601; | |||
| GL_LINEAR_MIPMAP_NEAREST = $2701; | |||
| GL_LINEAR_MIPMAP_LINEAR = $2703; | |||
| { Texture Wrap } | |||
| GL_TEXTURE_WRAP_S = $2802; | |||
| GL_TEXTURE_WRAP_T = $2803; | |||
| GL_TEXTURE_WRAP_R = $8072; | |||
| GL_CLAMP = $2900; | |||
| GL_REPEAT = $2901; | |||
| GL_CLAMP_TO_EDGE = $812F; | |||
| GL_CLAMP_TO_BORDER = $812D; | |||
| GL_MIRRORED_REPEAT = $8370; | |||
| { Other } | |||
| GL_GENERATE_MIPMAP = $8191; | |||
| GL_TEXTURE_BORDER_COLOR = $1004; | |||
| GL_MAX_TEXTURE_SIZE = $0D33; | |||
| GL_PACK_ALIGNMENT = $0D05; | |||
| GL_UNPACK_ALIGNMENT = $0CF5; | |||
| GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE; | |||
| GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF; | |||
| GL_MAX_CUBE_MAP_TEXTURE_SIZE = $851C; | |||
| GL_TEXTURE_GEN_MODE = $2500; | |||
| {$IF DEFINED(GLB_WIN)} | |||
| libglu = 'glu32.dll'; | |||
| libopengl = 'opengl32.dll'; | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| libglu = 'libGLU.so.1'; | |||
| libopengl = 'libGL.so.1'; | |||
| {$IFEND} | |||
| type | |||
| GLboolean = BYTEBOOL; | |||
| GLint = Integer; | |||
| GLsizei = Integer; | |||
| GLuint = Cardinal; | |||
| GLfloat = Single; | |||
| GLenum = Cardinal; | |||
| PGLvoid = Pointer; | |||
| PGLboolean = ^GLboolean; | |||
| PGLint = ^GLint; | |||
| PGLuint = ^GLuint; | |||
| PGLfloat = ^GLfloat; | |||
| TglCompressedTexImage1D = procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglCompressedTexImage2D = procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglGetCompressedTexImage = procedure(target: GLenum; level: GLint; img: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| {$IF DEFINED(GLB_WIN)} | |||
| TwglGetProcAddress = function (ProcName: PAnsiChar): Pointer; stdcall; | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| TglXGetProcAddress = function(ProcName: PAnsiChar): Pointer; cdecl; | |||
| TglXGetProcAddressARB = function(const name: PAnsiChar): pointer; cdecl; | |||
| {$IFEND} | |||
| {$IF DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | |||
| TglEnable = procedure(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglDisable = procedure(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglGetString = function(name: GLenum): PAnsiChar; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglGetIntegerv = procedure(pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglTexParameteri = procedure(target: GLenum; pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglTexParameteriv = procedure(target: GLenum; pname: GLenum; const params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglTexParameterfv = procedure(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglGetTexParameteriv = procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglGetTexParameterfv = procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglGetTexLevelParameteriv = procedure(target: GLenum; level: GLint; pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglGetTexLevelParameterfv = procedure(target: GLenum; level: GLint; pname: GLenum; params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglTexGeni = procedure(coord: GLenum; pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglGenTextures = procedure(n: GLsizei; textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglBindTexture = procedure(target: GLenum; texture: GLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglDeleteTextures = procedure(n: GLsizei; const textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglAreTexturesResident = function(n: GLsizei; const textures: PGLuint; residences: PGLboolean): GLboolean; {$IFDEF DGL_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglReadPixels = procedure(x: GLint; y: GLint; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglPixelStorei = procedure(pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglTexImage1D = procedure(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglTexImage2D = procedure(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; height: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TglGetTexImage = procedure(target: GLenum; level: GLint; format: GLenum; _type: GLenum; pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TgluBuild1DMipmaps = function(target: GLEnum; components, width: GLint; format, atype: GLEnum; const data: Pointer): GLint; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| TgluBuild2DMipmaps = function(target: GLEnum; components, width, height: GLint; format, atype: GLEnum; const Data: Pointer): GLint; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | |||
| {$ELSEIF DEFINED(GLB_NATIVE_OGL_STATIC)} | |||
| procedure glEnable(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glDisable(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| function glGetString(name: GLenum): PAnsiChar; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glGetIntegerv(pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glTexParameteri(target: GLenum; pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glTexParameteriv(target: GLenum; pname: GLenum; const params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glTexParameterfv(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glGetTexParameteriv(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glGetTexParameterfv(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glGetTexLevelParameteriv(target: GLenum; level: GLint; pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glGetTexLevelParameterfv(target: GLenum; level: GLint; pname: GLenum; params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glTexGeni(coord: GLenum; pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glGenTextures(n: GLsizei; textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glBindTexture(target: GLenum; texture: GLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glDeleteTextures(n: GLsizei; const textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| function glAreTexturesResident(n: GLsizei; const textures: PGLuint; residences: PGLboolean): GLboolean; {$IFDEF DGL_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glReadPixels(x: GLint; y: GLint; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glPixelStorei(pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glTexImage1D(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glTexImage2D(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; height: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| procedure glGetTexImage(target: GLenum; level: GLint; format: GLenum; _type: GLenum; pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | |||
| function gluBuild1DMipmaps(target: GLEnum; components, width: GLint; format, atype: GLEnum; const data: Pointer): GLint; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libglu; | |||
| function gluBuild2DMipmaps(target: GLEnum; components, width, height: GLint; format, atype: GLEnum; const Data: Pointer): GLint; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libglu; | |||
| {$IFEND} | |||
| var | |||
| GL_VERSION_1_2, | |||
| GL_VERSION_1_3, | |||
| GL_VERSION_1_4, | |||
| GL_VERSION_2_0, | |||
| GL_VERSION_3_3, | |||
| GL_SGIS_generate_mipmap, | |||
| GL_ARB_texture_border_clamp, | |||
| GL_ARB_texture_mirrored_repeat, | |||
| GL_ARB_texture_rectangle, | |||
| GL_ARB_texture_non_power_of_two, | |||
| GL_ARB_texture_swizzle, | |||
| GL_ARB_texture_cube_map, | |||
| GL_IBM_texture_mirrored_repeat, | |||
| GL_NV_texture_rectangle, | |||
| GL_EXT_texture_edge_clamp, | |||
| GL_EXT_texture_rectangle, | |||
| GL_EXT_texture_swizzle, | |||
| GL_EXT_texture_cube_map, | |||
| GL_EXT_texture_filter_anisotropic: Boolean; | |||
| glCompressedTexImage1D: TglCompressedTexImage1D; | |||
| glCompressedTexImage2D: TglCompressedTexImage2D; | |||
| glGetCompressedTexImage: TglGetCompressedTexImage; | |||
| {$IF DEFINED(GLB_WIN)} | |||
| wglGetProcAddress: TwglGetProcAddress; | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| glXGetProcAddress: TglXGetProcAddress; | |||
| glXGetProcAddressARB: TglXGetProcAddress; | |||
| {$IFEND} | |||
| {$IFDEF GLB_NATIVE_OGL_DYNAMIC} | |||
| glEnable: TglEnable; | |||
| glDisable: TglDisable; | |||
| glGetString: TglGetString; | |||
| glGetIntegerv: TglGetIntegerv; | |||
| glTexParameteri: TglTexParameteri; | |||
| glTexParameteriv: TglTexParameteriv; | |||
| glTexParameterfv: TglTexParameterfv; | |||
| glGetTexParameteriv: TglGetTexParameteriv; | |||
| glGetTexParameterfv: TglGetTexParameterfv; | |||
| glGetTexLevelParameteriv: TglGetTexLevelParameteriv; | |||
| glGetTexLevelParameterfv: TglGetTexLevelParameterfv; | |||
| glTexGeni: TglTexGeni; | |||
| glGenTextures: TglGenTextures; | |||
| glBindTexture: TglBindTexture; | |||
| glDeleteTextures: TglDeleteTextures; | |||
| glAreTexturesResident: TglAreTexturesResident; | |||
| glReadPixels: TglReadPixels; | |||
| glPixelStorei: TglPixelStorei; | |||
| glTexImage1D: TglTexImage1D; | |||
| glTexImage2D: TglTexImage2D; | |||
| glGetTexImage: TglGetTexImage; | |||
| gluBuild1DMipmaps: TgluBuild1DMipmaps; | |||
| gluBuild2DMipmaps: TgluBuild2DMipmaps; | |||
| {$ENDIF} | |||
| {$ENDIF} | |||
| type | |||
| {$IFNDEF fpc} | |||
| QWord = System.UInt64; | |||
| @@ -2397,234 +2060,6 @@ begin | |||
| DEPTH_WEIGHT_B * aPixel.Data.b); | |||
| end; | |||
| {$IFDEF GLB_NATIVE_OGL} | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //OpenGLInitialization/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| var | |||
| GL_LibHandle: Pointer = nil; | |||
| function glbGetProcAddress(aProcName: PAnsiChar; aLibHandle: Pointer = nil; const aRaiseOnErr: Boolean = true): Pointer; | |||
| begin | |||
| if not Assigned(aLibHandle) then | |||
| aLibHandle := GL_LibHandle; | |||
| {$IF DEFINED(GLB_WIN)} | |||
| result := GetProcAddress({%H-}HMODULE(aLibHandle), aProcName); | |||
| if Assigned(result) then | |||
| exit; | |||
| if Assigned(wglGetProcAddress) then | |||
| result := wglGetProcAddress(aProcName); | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| if Assigned(glXGetProcAddress) then begin | |||
| result := glXGetProcAddress(aProcName); | |||
| if Assigned(result) then | |||
| exit; | |||
| end; | |||
| if Assigned(glXGetProcAddressARB) then begin | |||
| result := glXGetProcAddressARB(aProcName); | |||
| if Assigned(result) then | |||
| exit; | |||
| end; | |||
| result := dlsym(aLibHandle, aProcName); | |||
| {$IFEND} | |||
| if not Assigned(result) and aRaiseOnErr then | |||
| raise EglBitmap.Create('unable to load procedure form library: ' + aProcName); | |||
| end; | |||
| {$IFDEF GLB_NATIVE_OGL_DYNAMIC} | |||
| var | |||
| GLU_LibHandle: Pointer = nil; | |||
| OpenGLInitialized: Boolean; | |||
| InitOpenGLCS: TCriticalSection; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure glbInitOpenGL; | |||
| //////////////////////////////////////////////////////////////////////////////// | |||
| function glbLoadLibrary(const aName: PChar): Pointer; | |||
| begin | |||
| {$IF DEFINED(GLB_WIN)} | |||
| result := {%H-}Pointer(LoadLibrary(aName)); | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| result := dlopen(Name, RTLD_LAZY); | |||
| {$ELSE} | |||
| result := nil; | |||
| {$IFEND} | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////// | |||
| function glbFreeLibrary(const aLibHandle: Pointer): Boolean; | |||
| begin | |||
| result := false; | |||
| if not Assigned(aLibHandle) then | |||
| exit; | |||
| {$IF DEFINED(GLB_WIN)} | |||
| Result := FreeLibrary({%H-}HINST(aLibHandle)); | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| Result := dlclose(aLibHandle) = 0; | |||
| {$IFEND} | |||
| end; | |||
| begin | |||
| if Assigned(GL_LibHandle) then | |||
| glbFreeLibrary(GL_LibHandle); | |||
| if Assigned(GLU_LibHandle) then | |||
| glbFreeLibrary(GLU_LibHandle); | |||
| GL_LibHandle := glbLoadLibrary(libopengl); | |||
| if not Assigned(GL_LibHandle) then | |||
| raise EglBitmap.Create('unable to load library: ' + libopengl); | |||
| GLU_LibHandle := glbLoadLibrary(libglu); | |||
| if not Assigned(GLU_LibHandle) then | |||
| raise EglBitmap.Create('unable to load library: ' + libglu); | |||
| {$IF DEFINED(GLB_WIN)} | |||
| wglGetProcAddress := glbGetProcAddress('wglGetProcAddress'); | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| glXGetProcAddress := glbGetProcAddress('glXGetProcAddress'); | |||
| glXGetProcAddressARB := glbGetProcAddress('glXGetProcAddressARB'); | |||
| {$IFEND} | |||
| glEnable := glbGetProcAddress('glEnable'); | |||
| glDisable := glbGetProcAddress('glDisable'); | |||
| glGetString := glbGetProcAddress('glGetString'); | |||
| glGetIntegerv := glbGetProcAddress('glGetIntegerv'); | |||
| glTexParameteri := glbGetProcAddress('glTexParameteri'); | |||
| glTexParameteriv := glbGetProcAddress('glTexParameteriv'); | |||
| glTexParameterfv := glbGetProcAddress('glTexParameterfv'); | |||
| glGetTexParameteriv := glbGetProcAddress('glGetTexParameteriv'); | |||
| glGetTexParameterfv := glbGetProcAddress('glGetTexParameterfv'); | |||
| glGetTexLevelParameteriv := glbGetProcAddress('glGetTexLevelParameteriv'); | |||
| glGetTexLevelParameterfv := glbGetProcAddress('glGetTexLevelParameterfv'); | |||
| glTexGeni := glbGetProcAddress('glTexGeni'); | |||
| glGenTextures := glbGetProcAddress('glGenTextures'); | |||
| glBindTexture := glbGetProcAddress('glBindTexture'); | |||
| glDeleteTextures := glbGetProcAddress('glDeleteTextures'); | |||
| glAreTexturesResident := glbGetProcAddress('glAreTexturesResident'); | |||
| glReadPixels := glbGetProcAddress('glReadPixels'); | |||
| glPixelStorei := glbGetProcAddress('glPixelStorei'); | |||
| glTexImage1D := glbGetProcAddress('glTexImage1D'); | |||
| glTexImage2D := glbGetProcAddress('glTexImage2D'); | |||
| glGetTexImage := glbGetProcAddress('glGetTexImage'); | |||
| gluBuild1DMipmaps := glbGetProcAddress('gluBuild1DMipmaps', GLU_LibHandle); | |||
| gluBuild2DMipmaps := glbGetProcAddress('gluBuild2DMipmaps', GLU_LibHandle); | |||
| end; | |||
| {$ENDIF} | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure glbReadOpenGLExtensions; | |||
| var | |||
| Buffer: AnsiString; | |||
| MajorVersion, MinorVersion: Integer; | |||
| /////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TrimVersionString(aBuffer: AnsiString; out aMajor, aMinor: Integer); | |||
| var | |||
| Separator: Integer; | |||
| begin | |||
| aMinor := 0; | |||
| aMajor := 0; | |||
| Separator := Pos(AnsiString('.'), aBuffer); | |||
| if (Separator > 1) and (Separator < Length(aBuffer)) and | |||
| (aBuffer[Separator - 1] in ['0'..'9']) and | |||
| (aBuffer[Separator + 1] in ['0'..'9']) then begin | |||
| Dec(Separator); | |||
| while (Separator > 0) and (aBuffer[Separator] in ['0'..'9']) do | |||
| Dec(Separator); | |||
| Delete(aBuffer, 1, Separator); | |||
| Separator := Pos(AnsiString('.'), aBuffer) + 1; | |||
| while (Separator <= Length(aBuffer)) and (AnsiChar(aBuffer[Separator]) in ['0'..'9']) do | |||
| Inc(Separator); | |||
| Delete(aBuffer, Separator, 255); | |||
| Separator := Pos(AnsiString('.'), aBuffer); | |||
| aMajor := StrToInt(Copy(String(aBuffer), 1, Separator - 1)); | |||
| aMinor := StrToInt(Copy(String(aBuffer), Separator + 1, 1)); | |||
| end; | |||
| end; | |||
| /////////////////////////////////////////////////////////////////////////////////////////// | |||
| function CheckExtension(const Extension: AnsiString): Boolean; | |||
| var | |||
| ExtPos: Integer; | |||
| begin | |||
| ExtPos := Pos(Extension, Buffer); | |||
| result := ExtPos > 0; | |||
| if result then | |||
| result := ((ExtPos + Length(Extension) - 1) = Length(Buffer)) or not (Buffer[ExtPos + Length(Extension)] in ['_', 'A'..'Z', 'a'..'z']); | |||
| end; | |||
| /////////////////////////////////////////////////////////////////////////////////////////// | |||
| function CheckVersion(const aMajor, aMinor: Integer): Boolean; | |||
| begin | |||
| result := (MajorVersion > aMajor) or ((MajorVersion = aMajor) and (MinorVersion >= aMinor)); | |||
| end; | |||
| begin | |||
| {$IFDEF GLB_NATIVE_OGL_DYNAMIC} | |||
| InitOpenGLCS.Enter; | |||
| try | |||
| if not OpenGLInitialized then begin | |||
| glbInitOpenGL; | |||
| OpenGLInitialized := true; | |||
| end; | |||
| finally | |||
| InitOpenGLCS.Leave; | |||
| end; | |||
| {$ENDIF} | |||
| // Version | |||
| Buffer := glGetString(GL_VERSION); | |||
| TrimVersionString(Buffer, MajorVersion, MinorVersion); | |||
| GL_VERSION_1_2 := CheckVersion(1, 2); | |||
| GL_VERSION_1_3 := CheckVersion(1, 3); | |||
| GL_VERSION_1_4 := CheckVersion(1, 4); | |||
| GL_VERSION_2_0 := CheckVersion(2, 0); | |||
| GL_VERSION_3_3 := CheckVersion(3, 3); | |||
| // Extensions | |||
| Buffer := glGetString(GL_EXTENSIONS); | |||
| GL_ARB_texture_border_clamp := CheckExtension('GL_ARB_texture_border_clamp'); | |||
| GL_ARB_texture_non_power_of_two := CheckExtension('GL_ARB_texture_non_power_of_two'); | |||
| GL_ARB_texture_swizzle := CheckExtension('GL_ARB_texture_swizzle'); | |||
| GL_ARB_texture_cube_map := CheckExtension('GL_ARB_texture_cube_map'); | |||
| GL_ARB_texture_rectangle := CheckExtension('GL_ARB_texture_rectangle'); | |||
| GL_ARB_texture_mirrored_repeat := CheckExtension('GL_ARB_texture_mirrored_repeat'); | |||
| GL_EXT_texture_edge_clamp := CheckExtension('GL_EXT_texture_edge_clamp'); | |||
| GL_EXT_texture_filter_anisotropic := CheckExtension('GL_EXT_texture_filter_anisotropic'); | |||
| GL_EXT_texture_rectangle := CheckExtension('GL_EXT_texture_rectangle'); | |||
| GL_EXT_texture_swizzle := CheckExtension('GL_EXT_texture_swizzle'); | |||
| GL_EXT_texture_cube_map := CheckExtension('GL_EXT_texture_cube_map'); | |||
| GL_NV_texture_rectangle := CheckExtension('GL_NV_texture_rectangle'); | |||
| GL_IBM_texture_mirrored_repeat := CheckExtension('GL_IBM_texture_mirrored_repeat'); | |||
| GL_SGIS_generate_mipmap := CheckExtension('GL_SGIS_generate_mipmap'); | |||
| if GL_VERSION_1_3 then begin | |||
| glCompressedTexImage1D := glbGetProcAddress('glCompressedTexImage1D'); | |||
| glCompressedTexImage2D := glbGetProcAddress('glCompressedTexImage2D'); | |||
| glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImage'); | |||
| end else begin | |||
| glCompressedTexImage1D := glbGetProcAddress('glCompressedTexImage1DARB', nil, false); | |||
| glCompressedTexImage2D := glbGetProcAddress('glCompressedTexImage2DARB', nil, false); | |||
| glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImageARB', nil, false); | |||
| end; | |||
| end; | |||
| {$ENDIF} | |||
| {$IFDEF GLB_SDL_IMAGE} | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| // SDL Image Helper ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -6577,9 +6012,6 @@ constructor TglBitmap.Create; | |||
| begin | |||
| if (ClassType = TglBitmap) then | |||
| raise EglBitmap.Create('Don''t create TglBitmap directly. Use one of the deviated classes (TglBitmap2D) instead.'); | |||
| {$IFDEF GLB_NATIVE_OGL} | |||
| glbReadOpenGLExtensions; | |||
| {$ENDIF} | |||
| inherited Create; | |||
| fFormat := glBitmapGetDefaultFormat; | |||
| fFreeDataOnDestroy := true; | |||
| @@ -9528,23 +8960,7 @@ initialization | |||
| TFormatDescriptor.Init; | |||
| {$IFDEF GLB_NATIVE_OGL_DYNAMIC} | |||
| OpenGLInitialized := false; | |||
| InitOpenGLCS := TCriticalSection.Create; | |||
| {$ENDIF} | |||
| finalization | |||
| TFormatDescriptor.Finalize; | |||
| {$IFDEF GLB_NATIVE_OGL} | |||
| if Assigned(GL_LibHandle) then | |||
| glbFreeLibrary(GL_LibHandle); | |||
| {$IFDEF GLB_NATIVE_OGL_DYNAMIC} | |||
| if Assigned(GLU_LibHandle) then | |||
| glbFreeLibrary(GLU_LibHandle); | |||
| FreeAndNil(InitOpenGLCS); | |||
| {$ENDIF} | |||
| {$ENDIF} | |||
| end. | |||