Browse Source

* added Swizzle Support

* updated native OpenGL Support
master
Bergmann89 10 years ago
parent
commit
370c0fbe8e
1 changed files with 184 additions and 92 deletions
  1. +184
    -92
      glBitmap.pas

+ 184
- 92
glBitmap.pas View File

@@ -375,21 +375,19 @@ unit glBitmap;
interface interface


uses uses
{$IFNDEF GLB_NATIVE_OGL} dglOpenGL, {$ENDIF}
{$IFNDEF GLB_NATIVE_OGL} dglOpenGL, {$ENDIF}
{$IF DEFINED(GLB_WIN) AND {$IF DEFINED(GLB_WIN) AND
DEFINED(GLB_NATIVE_OGL)} windows, {$IFEND}
DEFINED(GLB_NATIVE_OGL)} windows, {$IFEND}


{$IFDEF GLB_SDL} SDL, {$ENDIF}
{$IFDEF GLB_LAZARUS} IntfGraphics, GraphType, {$ENDIF}
{$IFDEF GLB_DELPHI} Dialogs, Graphics, {$ENDIF}
{$IFDEF GLB_SDL} SDL, {$ENDIF}
{$IFDEF GLB_LAZARUS} IntfGraphics, GraphType, {$ENDIF}
{$IFDEF GLB_DELPHI} Dialogs, Graphics, {$ENDIF}


{$IFDEF GLB_SDL_IMAGE} SDL_image, {$ENDIF}

{$IFDEF GLB_PNGIMAGE} pngimage, {$ENDIF}
{$IFDEF GLB_LIB_PNG} libPNG, {$ENDIF}

{$IFDEF GLB_DELPHI_JPEG} JPEG, {$ENDIF}
{$IFDEF GLB_LIB_JPEG} libJPEG, {$ENDIF}
{$IFDEF GLB_SDL_IMAGE} SDL_image, {$ENDIF}
{$IFDEF GLB_PNGIMAGE} pngimage, {$ENDIF}
{$IFDEF GLB_LIB_PNG} libPNG, {$ENDIF}
{$IFDEF GLB_DELPHI_JPEG} JPEG, {$ENDIF}
{$IFDEF GLB_LIB_JPEG} libJPEG, {$ENDIF}


Classes, SysUtils; Classes, SysUtils;


@@ -398,6 +396,9 @@ const
GL_TRUE = 1; GL_TRUE = 1;
GL_FALSE = 0; GL_FALSE = 0;


GL_ZERO = 0;
GL_ONE = 1;

GL_VERSION = $1F02; GL_VERSION = $1F02;
GL_EXTENSIONS = $1F03; GL_EXTENSIONS = $1F03;


@@ -405,9 +406,34 @@ const
GL_TEXTURE_2D = $0DE1; GL_TEXTURE_2D = $0DE1;
GL_TEXTURE_RECTANGLE = $84F5; 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_WIDTH = $1000;
GL_TEXTURE_HEIGHT = $1001; GL_TEXTURE_HEIGHT = $1001;
GL_TEXTURE_INTERNAL_FORMAT = $1003; 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_ALPHA = $1906;
GL_ALPHA4 = $803B; GL_ALPHA4 = $803B;
@@ -509,6 +535,8 @@ const


GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE; GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE;
GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF; GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF;
GL_MAX_CUBE_MAP_TEXTURE_SIZE = $851C;
GL_TEXTURE_GEN_MODE = $2500;


{$IF DEFINED(GLB_WIN)} {$IF DEFINED(GLB_WIN)}
libglu = 'glu32.dll'; libglu = 'glu32.dll';
@@ -551,12 +579,14 @@ type
TglGetIntegerv = procedure(pname: GLenum; params: PGLint); {$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} 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} 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} 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} 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} 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} 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} 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} 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} TglDeleteTextures = procedure(n: GLsizei; const textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
@@ -580,12 +610,14 @@ type
procedure glGetIntegerv(pname: GLenum; params: PGLint); {$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 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 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 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 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 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 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 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 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; procedure glDeleteTextures(n: GLsizei; const textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
@@ -607,6 +639,7 @@ var
GL_VERSION_1_3, GL_VERSION_1_3,
GL_VERSION_1_4, GL_VERSION_1_4,
GL_VERSION_2_0, GL_VERSION_2_0,
GL_VERSION_3_3,


GL_SGIS_generate_mipmap, GL_SGIS_generate_mipmap,


@@ -614,6 +647,8 @@ var
GL_ARB_texture_mirrored_repeat, GL_ARB_texture_mirrored_repeat,
GL_ARB_texture_rectangle, GL_ARB_texture_rectangle,
GL_ARB_texture_non_power_of_two, GL_ARB_texture_non_power_of_two,
GL_ARB_texture_swizzle,
GL_ARB_texture_cube_map,


GL_IBM_texture_mirrored_repeat, GL_IBM_texture_mirrored_repeat,


@@ -621,6 +656,8 @@ var


GL_EXT_texture_edge_clamp, GL_EXT_texture_edge_clamp,
GL_EXT_texture_rectangle, GL_EXT_texture_rectangle,
GL_EXT_texture_swizzle,
GL_EXT_texture_cube_map,
GL_EXT_texture_filter_anisotropic: Boolean; GL_EXT_texture_filter_anisotropic: Boolean;


glCompressedTexImage1D: TglCompressedTexImage1D; glCompressedTexImage1D: TglCompressedTexImage1D;
@@ -642,12 +679,14 @@ var
glGetIntegerv: TglGetIntegerv; glGetIntegerv: TglGetIntegerv;


glTexParameteri: TglTexParameteri; glTexParameteri: TglTexParameteri;
glTexParameteriv: TglTexParameteriv;
glTexParameterfv: TglTexParameterfv; glTexParameterfv: TglTexParameterfv;
glGetTexParameteriv: TglGetTexParameteriv; glGetTexParameteriv: TglGetTexParameteriv;
glGetTexParameterfv: TglGetTexParameterfv; glGetTexParameterfv: TglGetTexParameterfv;
glGetTexLevelParameteriv: TglGetTexLevelParameteriv; glGetTexLevelParameteriv: TglGetTexLevelParameteriv;
glGetTexLevelParameterfv: TglGetTexLevelParameterfv; glGetTexLevelParameterfv: TglGetTexLevelParameterfv;


glTexGeni: TglTexGeni;
glGenTextures: TglGenTextures; glGenTextures: TglGenTextures;
glBindTexture: TglBindTexture; glBindTexture: TglBindTexture;
glDeleteTextures: TglDeleteTextures; glDeleteTextures: TglDeleteTextures;
@@ -749,10 +788,11 @@ type
nm5x5); nm5x5);


//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
EglBitmapException = class(Exception);
EglBitmapSizeToLargeException = class(EglBitmapException);
EglBitmapNonPowerOfTwoException = class(EglBitmapException);
EglBitmapUnsupportedFormat = class(EglBitmapException)
EglBitmap = class(Exception);
EglBitmapNotSupported = class(Exception);
EglBitmapSizeToLarge = class(EglBitmap);
EglBitmapNonPowerOfTwo = class(EglBitmap);
EglBitmapUnsupportedFormat = class(EglBitmap)
constructor Create(const aFormat: TglBitmapFormat); overload; constructor Create(const aFormat: TglBitmapFormat); overload;
constructor Create(const aMsg: String; const aFormat: TglBitmapFormat); overload; constructor Create(const aMsg: String; const aFormat: TglBitmapFormat); overload;
end; end;
@@ -811,13 +851,16 @@ type
fRowSize: Integer; fRowSize: Integer;


// Filtering // Filtering
fFilterMin: Cardinal;
fFilterMag: Cardinal;
fFilterMin: GLenum;
fFilterMag: GLenum;


// TexturWarp // TexturWarp
fWrapS: Cardinal;
fWrapT: Cardinal;
fWrapR: Cardinal;
fWrapS: GLenum;
fWrapT: GLenum;
fWrapR: GLenum;

//Swizzle
fSwizzle: array[0..3] of GLenum;


// CustomData // CustomData
fFilename: String; fFilename: String;
@@ -958,11 +1001,12 @@ type
procedure FillWithColorFloat(const aRed, aGreen, aBlue: Single; const aAlpha : Single = 1); procedure FillWithColorFloat(const aRed, aGreen, aBlue: Single; const aAlpha : Single = 1);


//TexParameters //TexParameters
procedure SetFilter(const aMin, aMag: Cardinal);
procedure SetFilter(const aMin, aMag: GLenum);
procedure SetWrap( procedure SetWrap(
const S: Cardinal = GL_CLAMP_TO_EDGE;
const T: Cardinal = GL_CLAMP_TO_EDGE;
const R: Cardinal = GL_CLAMP_TO_EDGE);
const S: GLenum = GL_CLAMP_TO_EDGE;
const T: GLenum = GL_CLAMP_TO_EDGE;
const R: GLenum = GL_CLAMP_TO_EDGE);
procedure SetSwizzle(const r, g, b, a: GLenum);


procedure Bind(const aEnableTextureUnit: Boolean = true); virtual; procedure Bind(const aEnableTextureUnit: Boolean = true); virtual;
procedure Unbind(const aDisableTextureUnit: Boolean = true); virtual; procedure Unbind(const aDisableTextureUnit: Boolean = true); virtual;
@@ -1084,6 +1128,7 @@ var
glBitmapDefaultWrapS: Cardinal; glBitmapDefaultWrapS: Cardinal;
glBitmapDefaultWrapT: Cardinal; glBitmapDefaultWrapT: Cardinal;
glBitmapDefaultWrapR: Cardinal; glBitmapDefaultWrapR: Cardinal;
glDefaultSwizzle: array[0..3] of GLenum;


{$IFDEF GLB_DELPHI} {$IFDEF GLB_DELPHI}
function CreateGrayPalette: HPALETTE; function CreateGrayPalette: HPALETTE;
@@ -1839,7 +1884,7 @@ begin
result := dlsym(aLibHandle, aProcName); result := dlsym(aLibHandle, aProcName);
{$IFEND} {$IFEND}
if not Assigned(result) then if not Assigned(result) then
raise EglBitmapException.Create('unable to load procedure form library: ' + aProcName);
raise EglBitmap.Create('unable to load procedure form library: ' + aProcName);
end; end;


{$IFDEF GLB_NATIVE_OGL_DYNAMIC} {$IFDEF GLB_NATIVE_OGL_DYNAMIC}
@@ -1886,11 +1931,11 @@ begin


GL_LibHandle := glbLoadLibrary(libopengl); GL_LibHandle := glbLoadLibrary(libopengl);
if not Assigned(GL_LibHandle) then if not Assigned(GL_LibHandle) then
raise EglBitmapException.Create('unable to load library: ' + libopengl);
raise EglBitmap.Create('unable to load library: ' + libopengl);


GLU_LibHandle := glbLoadLibrary(libglu); GLU_LibHandle := glbLoadLibrary(libglu);
if not Assigned(GLU_LibHandle) then if not Assigned(GLU_LibHandle) then
raise EglBitmapException.Create('unable to load library: ' + libglu);
raise EglBitmap.Create('unable to load library: ' + libglu);


try try
{$IF DEFINED(GLB_WIN)} {$IF DEFINED(GLB_WIN)}
@@ -1905,11 +1950,13 @@ begin
glGetString := glbGetProcAddress('glGetString'); glGetString := glbGetProcAddress('glGetString');
glGetIntegerv := glbGetProcAddress('glGetIntegerv'); glGetIntegerv := glbGetProcAddress('glGetIntegerv');
glTexParameteri := glbGetProcAddress('glTexParameteri'); glTexParameteri := glbGetProcAddress('glTexParameteri');
glTexParameteriv := glbGetProcAddress('glTexParameteriv');
glTexParameterfv := glbGetProcAddress('glTexParameterfv'); glTexParameterfv := glbGetProcAddress('glTexParameterfv');
glGetTexParameteriv := glbGetProcAddress('glGetTexParameteriv'); glGetTexParameteriv := glbGetProcAddress('glGetTexParameteriv');
glGetTexParameterfv := glbGetProcAddress('glGetTexParameterfv'); glGetTexParameterfv := glbGetProcAddress('glGetTexParameterfv');
glGetTexLevelParameteriv := glbGetProcAddress('glGetTexLevelParameteriv'); glGetTexLevelParameteriv := glbGetProcAddress('glGetTexLevelParameteriv');
glGetTexLevelParameterfv := glbGetProcAddress('glGetTexLevelParameterfv'); glGetTexLevelParameterfv := glbGetProcAddress('glGetTexLevelParameterfv');
glTexGeni := glbGetProcAddress('glTexGeni');
glGenTextures := glbGetProcAddress('glGenTextures'); glGenTextures := glbGetProcAddress('glGenTextures');
glBindTexture := glbGetProcAddress('glBindTexture'); glBindTexture := glbGetProcAddress('glBindTexture');
glDeleteTextures := glbGetProcAddress('glDeleteTextures'); glDeleteTextures := glbGetProcAddress('glDeleteTextures');
@@ -1977,6 +2024,12 @@ var
result := ((ExtPos + Length(Extension) - 1) = Length(Buffer)) or not (Buffer[ExtPos + Length(Extension)] in ['_', 'A'..'Z', 'a'..'z']); result := ((ExtPos + Length(Extension) - 1) = Length(Buffer)) or not (Buffer[ExtPos + Length(Extension)] in ['_', 'A'..'Z', 'a'..'z']);
end; end;


///////////////////////////////////////////////////////////////////////////////////////////
function CheckVersion(const aMajor, aMinor: Integer): Boolean;
begin
result := (MajorVersion > aMajor) or ((MajorVersion = aMajor) and (MinorVersion >= aMinor));
end;

begin begin
{$IFDEF GLB_NATIVE_OGL_DYNAMIC} {$IFDEF GLB_NATIVE_OGL_DYNAMIC}
InitOpenGLCS.Enter; InitOpenGLCS.Enter;
@@ -1994,35 +2047,25 @@ begin
Buffer := glGetString(GL_VERSION); Buffer := glGetString(GL_VERSION);
TrimVersionString(Buffer, MajorVersion, MinorVersion); TrimVersionString(Buffer, MajorVersion, MinorVersion);


GL_VERSION_1_2 := false;
GL_VERSION_1_3 := false;
GL_VERSION_1_4 := false;
GL_VERSION_2_0 := false;
if MajorVersion = 1 then begin
if MinorVersion >= 2 then
GL_VERSION_1_2 := true;

if MinorVersion >= 3 then
GL_VERSION_1_3 := true;

if MinorVersion >= 4 then
GL_VERSION_1_4 := true;
end else if MajorVersion >= 2 then begin
GL_VERSION_1_2 := true;
GL_VERSION_1_3 := true;
GL_VERSION_1_4 := true;
GL_VERSION_2_0 := true;
end;
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 // Extensions
Buffer := glGetString(GL_EXTENSIONS); Buffer := glGetString(GL_EXTENSIONS);
GL_ARB_texture_border_clamp := CheckExtension('GL_ARB_texture_border_clamp'); 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_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_rectangle := CheckExtension('GL_ARB_texture_rectangle');
GL_ARB_texture_mirrored_repeat := CheckExtension('GL_ARB_texture_mirrored_repeat'); 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_edge_clamp := CheckExtension('GL_EXT_texture_edge_clamp');
GL_EXT_texture_filter_anisotropic := CheckExtension('GL_EXT_texture_filter_anisotropic'); GL_EXT_texture_filter_anisotropic := CheckExtension('GL_EXT_texture_filter_anisotropic');
GL_EXT_texture_rectangle := CheckExtension('GL_EXT_texture_rectangle'); 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_NV_texture_rectangle := CheckExtension('GL_NV_texture_rectangle');
GL_IBM_texture_mirrored_repeat := CheckExtension('GL_IBM_texture_mirrored_repeat'); GL_IBM_texture_mirrored_repeat := CheckExtension('GL_IBM_texture_mirrored_repeat');
GL_SGIS_generate_mipmap := CheckExtension('GL_SGIS_generate_mipmap'); GL_SGIS_generate_mipmap := CheckExtension('GL_SGIS_generate_mipmap');
@@ -2117,6 +2160,15 @@ begin
glBitmapDefaultWrapR := R; glBitmapDefaultWrapR := R;
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapSetDefaultSwizzle(const r: GLenum = GL_RED; g: GLenum = GL_GREEN; b: GLenum = GL_BLUE; a: GLenum = GL_ALPHA);
begin
glDefaultSwizzle[0] := r;
glDefaultSwizzle[1] := g;
glDefaultSwizzle[2] := b;
glDefaultSwizzle[3] := a;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function glBitmapGetDefaultDeleteTextureOnFree: Boolean; function glBitmapGetDefaultDeleteTextureOnFree: Boolean;
begin begin
@@ -2142,20 +2194,29 @@ begin
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapGetDefaultFilter(var aMin, aMag: Cardinal);
procedure glBitmapGetDefaultFilter(var aMin, aMag: GLenum);
begin begin
aMin := glBitmapDefaultFilterMin; aMin := glBitmapDefaultFilterMin;
aMag := glBitmapDefaultFilterMag; aMag := glBitmapDefaultFilterMag;
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapGetDefaultTextureWrap(var S, T, R: Cardinal);
procedure glBitmapGetDefaultTextureWrap(var S, T, R: GLenum);
begin begin
S := glBitmapDefaultWrapS; S := glBitmapDefaultWrapS;
T := glBitmapDefaultWrapT; T := glBitmapDefaultWrapT;
R := glBitmapDefaultWrapR; R := glBitmapDefaultWrapR;
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapGetDefaultSwizzle(var r, g, b, a: GLenum);
begin
r := glDefaultSwizzle[0];
g := glDefaultSwizzle[1];
b := glDefaultSwizzle[2];
a := glDefaultSwizzle[3];
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TglBitmapFormatDescriptor/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TglBitmapFormatDescriptor///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -2244,7 +2305,7 @@ function TFormatDescriptor.MaskMatch(const aRedMask, aGreenMask, aBlueMask, aAlp
begin begin
result := false; result := false;
if (aRedMask = 0) and (aGreenMask = 0) and (aBlueMask = 0) and (aAlphaMask = 0) then if (aRedMask = 0) and (aGreenMask = 0) and (aBlueMask = 0) and (aAlphaMask = 0) then
raise EglBitmapException.Create('FormatCheckFormat - All Masks are 0');
raise EglBitmap.Create('FormatCheckFormat - All Masks are 0');
if (aRedMask <> RedMask) then if (aRedMask <> RedMask) then
exit; exit;
if (aGreenMask <> GreenMask) then if (aGreenMask <> GreenMask) then
@@ -3445,12 +3506,12 @@ end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TfdS3tcDtx1RGBA.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); procedure TfdS3tcDtx1RGBA.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer);
begin begin
raise EglBitmapException.Create('mapping for compressed formats is not supported');
raise EglBitmap.Create('mapping for compressed formats is not supported');
end; end;


procedure TfdS3tcDtx1RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); procedure TfdS3tcDtx1RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
begin begin
raise EglBitmapException.Create('mapping for compressed formats is not supported');
raise EglBitmap.Create('mapping for compressed formats is not supported');
end; end;


constructor TfdS3tcDtx1RGBA.Create; constructor TfdS3tcDtx1RGBA.Create;
@@ -3471,12 +3532,12 @@ end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TfdS3tcDtx3RGBA.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); procedure TfdS3tcDtx3RGBA.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer);
begin begin
raise EglBitmapException.Create('mapping for compressed formats is not supported');
raise EglBitmap.Create('mapping for compressed formats is not supported');
end; end;


procedure TfdS3tcDtx3RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); procedure TfdS3tcDtx3RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
begin begin
raise EglBitmapException.Create('mapping for compressed formats is not supported');
raise EglBitmap.Create('mapping for compressed formats is not supported');
end; end;


constructor TfdS3tcDtx3RGBA.Create; constructor TfdS3tcDtx3RGBA.Create;
@@ -3497,12 +3558,12 @@ end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TfdS3tcDtx5RGBA.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); procedure TfdS3tcDtx5RGBA.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer);
begin begin
raise EglBitmapException.Create('mapping for compressed formats is not supported');
raise EglBitmap.Create('mapping for compressed formats is not supported');
end; end;


procedure TfdS3tcDtx5RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); procedure TfdS3tcDtx5RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
begin begin
raise EglBitmapException.Create('mapping for compressed formats is not supported');
raise EglBitmap.Create('mapping for compressed formats is not supported');
end; end;


constructor TfdS3tcDtx5RGBA.Create; constructor TfdS3tcDtx5RGBA.Create;
@@ -3635,7 +3696,7 @@ begin
4: PCardinal(aData)^ := data; 4: PCardinal(aData)^ := data;
8: PQWord(aData)^ := data; 8: PQWord(aData)^ := data;
else else
raise EglBitmapException.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
raise EglBitmap.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
end; end;
inc(aData, s); inc(aData, s);
end; end;
@@ -3653,7 +3714,7 @@ begin
4: data := PCardinal(aData)^; 4: data := PCardinal(aData)^;
8: data := PQWord(aData)^; 8: data := PQWord(aData)^;
else else
raise EglBitmapException.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
raise EglBitmap.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
end; end;
for i := 0 to 3 do for i := 0 to 3 do
aPixel.Data.arr[i] := (data shr fShift.arr[i]) and fRange.arr[i]; aPixel.Data.arr[i] := (data shr fShift.arr[i]) and fRange.arr[i];
@@ -3668,7 +3729,7 @@ var
i: Integer; i: Integer;
begin begin
if not (Format in [tfLuminance4, tfLuminance8, tfR3G3B2]) then if not (Format in [tfLuminance4, tfLuminance8, tfR3G3B2]) then
raise EglBitmapException.Create(UNSUPPORTED_FORMAT);
raise EglBitmap.Create(UNSUPPORTED_FORMAT);


if (Format = tfLuminance4) then if (Format = tfLuminance4) then
SetLength(fColorTable, 16) SetLength(fColorTable, 16)
@@ -3711,7 +3772,7 @@ var
d: Byte; d: Byte;
begin begin
if not (Format in [tfLuminance4, tfLuminance8, tfR3G3B2]) then if not (Format in [tfLuminance4, tfLuminance8, tfR3G3B2]) then
raise EglBitmapException.Create(UNSUPPORTED_FORMAT);
raise EglBitmap.Create(UNSUPPORTED_FORMAT);


case Format of case Format of
tfLuminance4: begin tfLuminance4: begin
@@ -3759,10 +3820,10 @@ begin
4: idx := PCardinal(aData)^; 4: idx := PCardinal(aData)^;
8: idx := PQWord(aData)^; 8: idx := PQWord(aData)^;
else else
raise EglBitmapException.CreateFmt('invalid pixel size: %.3f', [fPixelSize]);
raise EglBitmap.CreateFmt('invalid pixel size: %.3f', [fPixelSize]);
end; end;
if (idx >= Length(fColorTable)) then if (idx >= Length(fColorTable)) then
raise EglBitmapException.CreateFmt('invalid color index: %d', [idx]);
raise EglBitmap.CreateFmt('invalid color index: %d', [idx]);
with fColorTable[idx] do begin with fColorTable[idx] do begin
aPixel.Data.r := r; aPixel.Data.r := r;
aPixel.Data.g := g; aPixel.Data.g := g;
@@ -4087,6 +4148,9 @@ begin
SetAnisotropic(fAnisotropic); SetAnisotropic(fAnisotropic);
SetBorderColor(fBorderColor[0], fBorderColor[1], fBorderColor[2], fBorderColor[3]); SetBorderColor(fBorderColor[0], fBorderColor[1], fBorderColor[2], fBorderColor[3]);


if (GL_ARB_texture_swizzle or GL_EXT_texture_swizzle or GL_VERSION_3_3) then
SetSwizzle(fSwizzle[0], fSwizzle[1], fSwizzle[2], fSwizzle[3]);

// Mip Maps Generation Mode // Mip Maps Generation Mode
aBuildWithGlu := false; aBuildWithGlu := false;
if (MipMap = mmMipmap) then begin if (MipMap = mmMipmap) then begin
@@ -4163,6 +4227,7 @@ begin


glBitmapGetDefaultFilter (fFilterMin, fFilterMag); glBitmapGetDefaultFilter (fFilterMin, fFilterMag);
glBitmapGetDefaultTextureWrap(fWrapS, fWrapT, fWrapR); glBitmapGetDefaultTextureWrap(fWrapS, fWrapT, fWrapR);
glBitmapGetDefaultSwizzle (fSwizzle[0], fSwizzle[1], fSwizzle[2], fSwizzle[3]);
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4195,7 +4260,7 @@ var
fs: TFileStream; fs: TFileStream;
begin begin
if not FileExists(aFilename) then if not FileExists(aFilename) then
raise EglBitmapException.Create('file does not exist: ' + aFilename);
raise EglBitmap.Create('file does not exist: ' + aFilename);
fFilename := aFilename; fFilename := aFilename;
fs := TFileStream.Create(fFilename, fmOpenRead); fs := TFileStream.Create(fFilename, fmOpenRead);
try try
@@ -4218,7 +4283,7 @@ begin
if not LoadDDS(aStream) then if not LoadDDS(aStream) then
if not LoadTGA(aStream) then if not LoadTGA(aStream) then
if not LoadBMP(aStream) then if not LoadBMP(aStream) then
raise EglBitmapException.Create('LoadFromStream - Couldn''t load Stream. It''s possible to be an unknow Streamtype.');
raise EglBitmap.Create('LoadFromStream - Couldn''t load Stream. It''s possible to be an unknow Streamtype.');
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -5293,7 +5358,7 @@ begin
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmap.SetFilter(const aMin, aMag: Cardinal);
procedure TglBitmap.SetFilter(const aMin, aMag: GLenum);
begin begin
//check MIN filter //check MIN filter
case aMin of case aMin of
@@ -5310,7 +5375,7 @@ begin
GL_LINEAR_MIPMAP_LINEAR: GL_LINEAR_MIPMAP_LINEAR:
fFilterMin := GL_LINEAR_MIPMAP_LINEAR; fFilterMin := GL_LINEAR_MIPMAP_LINEAR;
else else
raise EglBitmapException.Create('SetFilter - Unknow MIN filter.');
raise EglBitmap.Create('SetFilter - Unknow MIN filter.');
end; end;


//check MAG filter //check MAG filter
@@ -5320,7 +5385,7 @@ begin
GL_LINEAR: GL_LINEAR:
fFilterMag := GL_LINEAR; fFilterMag := GL_LINEAR;
else else
raise EglBitmapException.Create('SetFilter - Unknow MAG filter.');
raise EglBitmap.Create('SetFilter - Unknow MAG filter.');
end; end;


//apply filter //apply filter
@@ -5343,7 +5408,7 @@ begin
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmap.SetWrap(const S: Cardinal; const T: Cardinal; const R: Cardinal);
procedure TglBitmap.SetWrap(const S: GLenum; const T: GLenum; const R: GLenum);


procedure CheckAndSetWrap(const aValue: Cardinal; var aTarget: Cardinal); procedure CheckAndSetWrap(const aValue: Cardinal; var aTarget: Cardinal);
begin begin
@@ -5372,10 +5437,10 @@ procedure TglBitmap.SetWrap(const S: Cardinal; const T: Cardinal; const R: Cardi
if GL_VERSION_1_4 or GL_ARB_texture_mirrored_repeat or GL_IBM_texture_mirrored_repeat then if GL_VERSION_1_4 or GL_ARB_texture_mirrored_repeat or GL_IBM_texture_mirrored_repeat then
aTarget := GL_MIRRORED_REPEAT aTarget := GL_MIRRORED_REPEAT
else else
raise EglBitmapException.Create('SetWrap - Unsupported Texturewrap GL_MIRRORED_REPEAT (S).');
raise EglBitmap.Create('SetWrap - Unsupported Texturewrap GL_MIRRORED_REPEAT (S).');
end; end;
else else
raise EglBitmapException.Create('SetWrap - Unknow Texturewrap (S).');
raise EglBitmap.Create('SetWrap - Unknow Texturewrap');
end; end;
end; end;


@@ -5392,6 +5457,32 @@ begin
end; end;
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmap.SetSwizzle(const r, g, b, a: GLenum);

procedure CheckAndSetValue(const aValue: GLenum; const aIndex: Integer);
begin
if (aValue = GL_ZERO) or (aValue = GL_ONE) or (aValue = GL_ALPHA) or
(aValue = GL_RED) or (aValue = GL_GREEN) or (aValue = GL_BLUE) then
fSwizzle[aIndex] := aValue
else
raise EglBitmap.Create('SetSwizzle - Unknow Swizle Value');
end;

begin
if not (GL_ARB_texture_swizzle or GL_EXT_texture_swizzle or GL_VERSION_3_3) then
raise EglBitmapNotSupported.Create('texture swizzle is not supported');
CheckAndSetValue(r, 0);
CheckAndSetValue(g, 1);
CheckAndSetValue(b, 2);
CheckAndSetValue(a, 3);

if (ID > 0) then begin
Bind(false);
glTexParameteriv(Target, GL_TEXTURE_SWIZZLE_RGBA, @fSwizzle[0]);
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmap.Bind(const aEnableTextureUnit: Boolean); procedure TglBitmap.Bind(const aEnableTextureUnit: Boolean);
begin begin
@@ -5413,7 +5504,7 @@ end;
constructor TglBitmap.Create; constructor TglBitmap.Create;
begin begin
if (ClassType = TglBitmap) then if (ClassType = TglBitmap) then
raise EglBitmapException.Create('Don''t create TglBitmap directly. Use one of the deviated classes (TglBitmap2D) instead.');
raise EglBitmap.Create('Don''t create TglBitmap directly. Use one of the deviated classes (TglBitmap2D) instead.');
{$IFDEF GLB_NATIVE_OGL} {$IFDEF GLB_NATIVE_OGL}
glbReadOpenGLExtensions; glbReadOpenGLExtensions;
{$ENDIF} {$ENDIF}
@@ -6373,7 +6464,7 @@ function TglBitmap.LoadBMP(const aStream: TStream): Boolean;
case aInfo.biCompression of case aInfo.biCompression of
BMP_COMP_RLE4, BMP_COMP_RLE4,
BMP_COMP_RLE8: begin BMP_COMP_RLE8: begin
raise EglBitmapException.Create('RLE compression is not supported');
raise EglBitmap.Create('RLE compression is not supported');
end; end;
BMP_COMP_BITFIELDS: begin BMP_COMP_BITFIELDS: begin
if (aInfo.biBitCount = 16) or (aInfo.biBitCount = 32) then begin if (aInfo.biBitCount = 16) or (aInfo.biBitCount = 32) then begin
@@ -6382,7 +6473,7 @@ function TglBitmap.LoadBMP(const aStream: TStream): Boolean;
aStream.Read(aMask.b, SizeOf(aMask.b)); aStream.Read(aMask.b, SizeOf(aMask.b));
aStream.Read(aMask.a, SizeOf(aMask.a)); aStream.Read(aMask.a, SizeOf(aMask.a));
end else end else
raise EglBitmapException.Create('Bitfields are only supported for 16bit and 32bit formats');
raise EglBitmap.Create('Bitfields are only supported for 16bit and 32bit formats');
end; end;
end; end;


@@ -6551,7 +6642,7 @@ begin
raise; raise;
end; end;
end else end else
raise EglBitmapException.Create('LoadBMP - No suitable format found');
raise EglBitmap.Create('LoadBMP - No suitable format found');
except except
aStream.Position := StartPos; aStream.Position := StartPos;
raise; raise;
@@ -6989,7 +7080,7 @@ begin
end; end;


if (tgaFormat = tfEmpty) then if (tgaFormat = tfEmpty) then
raise EglBitmapException.Create('LoadTga - unsupported format');
raise EglBitmap.Create('LoadTga - unsupported format');


FormatDesc := TFormatDescriptor.Get(tgaFormat); FormatDesc := TFormatDescriptor.Get(tgaFormat);
PixelSize := FormatDesc.GetSize(1, 1); PixelSize := FormatDesc.GetSize(1, 1);
@@ -7099,11 +7190,11 @@ begin
Size := FormatDesc.GetSize(Dimension); Size := FormatDesc.GetSize(Dimension);
if Format in [tfRGB5, tfRGB5A1, tfRGBA4, tfRGB8, tfRGB10A2, tfRGBA8] then begin if Format in [tfRGB5, tfRGB5A1, tfRGBA4, tfRGB8, tfRGB10A2, tfRGBA8] then begin
if (FormatDesc.RGBInverted = tfEmpty) then if (FormatDesc.RGBInverted = tfEmpty) then
raise EglBitmapException.Create('inverted RGB format is empty');
raise EglBitmap.Create('inverted RGB format is empty');
Converter := TFormatDescriptor.Get(FormatDesc.RGBInverted); Converter := TFormatDescriptor.Get(FormatDesc.RGBInverted);
if not glBitmapColorRecCmp(Converter.Range, FormatDesc.Range) or if not glBitmapColorRecCmp(Converter.Range, FormatDesc.Range) or
(Converter.PixelSize <> FormatDesc.PixelSize) then (Converter.PixelSize <> FormatDesc.PixelSize) then
raise EglBitmapException.Create('invalid inverted RGB format');
raise EglBitmap.Create('invalid inverted RGB format');
end; end;


if Assigned(Converter) then begin if Assigned(Converter) then begin
@@ -7295,12 +7386,12 @@ begin
end; end;


if ((Header.Caps.dwCaps1 and DDSCAPS2_CUBEMAP) > 0) then if ((Header.Caps.dwCaps1 and DDSCAPS2_CUBEMAP) > 0) then
raise EglBitmapException.Create('LoadDDS - CubeMaps are not supported');
raise EglBitmap.Create('LoadDDS - CubeMaps are not supported');


ddsFormat := GetDDSFormat; ddsFormat := GetDDSFormat;
try try
if (ddsFormat = tfEmpty) then if (ddsFormat = tfEmpty) then
raise EglBitmapException.Create('LoadDDS - unsupported Pixelformat found.');
raise EglBitmap.Create('LoadDDS - unsupported Pixelformat found.');


FormatDesc := TFormatDescriptor.Get(ddsFormat); FormatDesc := TFormatDescriptor.Get(ddsFormat);
LineSize := Trunc(Header.dwWidth * FormatDesc.PixelSize); LineSize := Trunc(Header.dwWidth * FormatDesc.PixelSize);
@@ -7350,7 +7441,7 @@ begin
Inc(TmpData, LineSize); Inc(TmpData, LineSize);
end; end;
end else end else
raise EglBitmapException.Create('LoadDDS - unsupported Pixelformat found.');
raise EglBitmap.Create('LoadDDS - unsupported Pixelformat found.');


SetDataPointer(NewImage, ddsFormat, Header.dwWidth, Header.dwHeight); //be careful, Data could be freed by this method SetDataPointer(NewImage, ddsFormat, Header.dwWidth, Header.dwHeight); //be careful, Data could be freed by this method
result := true; result := true;
@@ -7505,12 +7596,12 @@ begin
glGetIntegerv(GL_MAX_TEXTURE_SIZE, @TexSize); glGetIntegerv(GL_MAX_TEXTURE_SIZE, @TexSize);


if (Width > TexSize) then if (Width > TexSize) then
raise EglBitmapSizeToLargeException.Create('TglBitmap1D.GenTexture - The size for the texture is to large. It''s may be not conform with the Hardware.');
raise EglBitmapSizeToLarge.Create('TglBitmap1D.GenTexture - The size for the texture is to large. It''s may be not conform with the Hardware.');


TexRec := (GL_ARB_texture_rectangle or GL_EXT_texture_rectangle or GL_NV_texture_rectangle) and TexRec := (GL_ARB_texture_rectangle or GL_EXT_texture_rectangle or GL_NV_texture_rectangle) and
(Target = GL_TEXTURE_RECTANGLE_ARB);
(Target = GL_TEXTURE_RECTANGLE);
if not (IsPowerOfTwo(Width) or GL_ARB_texture_non_power_of_two or GL_VERSION_2_0 or TexRec) then if not (IsPowerOfTwo(Width) or GL_ARB_texture_non_power_of_two or GL_VERSION_2_0 or TexRec) then
raise EglBitmapNonPowerOfTwoException.Create('TglBitmap1D.GenTexture - Rendercontex dosn''t support non power of two texture.');
raise EglBitmapNonPowerOfTwo.Create('TglBitmap1D.GenTexture - Rendercontex dosn''t support non power of two texture.');
end; end;


CreateId; CreateId;
@@ -7673,12 +7764,12 @@ begin
glGetIntegerv(GL_MAX_TEXTURE_SIZE, @TexSize); glGetIntegerv(GL_MAX_TEXTURE_SIZE, @TexSize);


if ((Height > TexSize) or (Width > TexSize)) then if ((Height > TexSize) or (Width > TexSize)) then
raise EglBitmapSizeToLargeException.Create('TglBitmap2D.GenTexture - The size for the texture is to large. It''s may be not conform with the Hardware.');
raise EglBitmapSizeToLarge.Create('TglBitmap2D.GenTexture - The size for the texture is to large. It''s may be not conform with the Hardware.');


PotTex := IsPowerOfTwo(Height) and IsPowerOfTwo(Width); PotTex := IsPowerOfTwo(Height) and IsPowerOfTwo(Width);
TexRec := (GL_ARB_texture_rectangle or GL_EXT_texture_rectangle or GL_NV_texture_rectangle) and (Target = GL_TEXTURE_RECTANGLE); TexRec := (GL_ARB_texture_rectangle or GL_EXT_texture_rectangle or GL_NV_texture_rectangle) and (Target = GL_TEXTURE_RECTANGLE);
if not (PotTex or GL_ARB_texture_non_power_of_two or GL_VERSION_2_0 or TexRec) then if not (PotTex or GL_ARB_texture_non_power_of_two or GL_VERSION_2_0 or TexRec) then
raise EglBitmapNonPowerOfTwoException.Create('TglBitmap2D.GenTexture - Rendercontex dosn''t support non power of two texture.');
raise EglBitmapNonPowerOfTwo.Create('TglBitmap2D.GenTexture - Rendercontex dosn''t support non power of two texture.');
end; end;


CreateId; CreateId;
@@ -7986,7 +8077,7 @@ begin
inherited; inherited;


if not (GL_VERSION_1_3 or GL_ARB_texture_cube_map or GL_EXT_texture_cube_map) then if not (GL_VERSION_1_3 or GL_ARB_texture_cube_map or GL_EXT_texture_cube_map) then
raise EglBitmapException.Create('TglBitmapCubeMap.AfterConstruction - CubeMaps are unsupported.');
raise EglBitmap.Create('TglBitmapCubeMap.AfterConstruction - CubeMaps are unsupported.');


SetWrap; SetWrap;
Target := GL_TEXTURE_CUBE_MAP; Target := GL_TEXTURE_CUBE_MAP;
@@ -8003,10 +8094,10 @@ begin
glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, @TexSize); glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, @TexSize);


if (Height > TexSize) or (Width > TexSize) then if (Height > TexSize) or (Width > TexSize) then
raise EglBitmapSizeToLargeException.Create('TglBitmapCubeMap.GenTexture - The size for the Cubemap is to large. It''s may be not conform with the Hardware.');
raise EglBitmapSizeToLarge.Create('TglBitmapCubeMap.GenTexture - The size for the Cubemap is to large. It''s may be not conform with the Hardware.');


if not ((IsPowerOfTwo(Height) and IsPowerOfTwo(Width)) or GL_VERSION_2_0 or GL_ARB_texture_non_power_of_two) then if not ((IsPowerOfTwo(Height) and IsPowerOfTwo(Width)) or GL_VERSION_2_0 or GL_ARB_texture_non_power_of_two) then
raise EglBitmapNonPowerOfTwoException.Create('TglBitmapCubeMap.GenTexture - Cubemaps dosn''t support non power of two texture.');
raise EglBitmapNonPowerOfTwo.Create('TglBitmapCubeMap.GenTexture - Cubemaps dosn''t support non power of two texture.');
end; end;


if (ID = 0) then if (ID = 0) then
@@ -8185,10 +8276,11 @@ end;




initialization initialization
glBitmapSetDefaultFormat(tfEmpty);
glBitmapSetDefaultMipmap(mmMipmap);
glBitmapSetDefaultFilter(GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR);
glBitmapSetDefaultWrap (GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE);
glBitmapSetDefaultFormat (tfEmpty);
glBitmapSetDefaultMipmap (mmMipmap);
glBitmapSetDefaultFilter (GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR);
glBitmapSetDefaultWrap (GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE);
glBitmapSetDefaultSwizzle(GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA);


glBitmapSetDefaultFreeDataAfterGenTexture(true); glBitmapSetDefaultFreeDataAfterGenTexture(true);
glBitmapSetDefaultDeleteTextureOnFree (true); glBitmapSetDefaultDeleteTextureOnFree (true);


Loading…
Cancel
Save