- if not Assigned(result) then
- raise EglBitmapException.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;
- {$ENDIF}
- 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;
- {$ENDIF}
- 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 EglBitmapException.Create('unable to load library: ' + libopengl);
-
- GLU_LibHandle := glbLoadLibrary(libglu);
- if not Assigned(GLU_LibHandle) then
- raise EglBitmapException.Create('unable to load library: ' + libglu);
-
- try
- {$IF DEFINED(GLB_WIN)}
- wglGetProcAddress := glbGetProcAddress('wglGetProcAddress');
- {$ELSEIF DEFINED(GLB_LINUX)}
- glXGetProcAddress := glbGetProcAddress('glXGetProcAddress');
- glXGetProcAddressARB := dglGetProcAddress('glXGetProcAddressARB');
- {$ENDIF}
-
- glEnable := glbGetProcAddress('glEnable');
- glDisable := glbGetProcAddress('glDisable');
- glGetString := glbGetProcAddress('glGetString');
- glGetIntegerv := glbGetProcAddress('glGetIntegerv');
- glTexParameteri := glbGetProcAddress('glTexParameteri');
- glTexParameterfv := glbGetProcAddress('glTexParameterfv');
- glGetTexParameteriv := glbGetProcAddress('glGetTexParameteriv');
- glGetTexParameterfv := glbGetProcAddress('glGetTexParameterfv');
- glGetTexLevelParameteriv := glbGetProcAddress('glGetTexLevelParameteriv');
- glGetTexLevelParameterfv := glbGetProcAddress('glGetTexLevelParameterfv');
- 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);
- finally
- glbFreeLibrary(GL_LibHandle);
- glbFreeLibrary(GLU_LibHandle);
- end;
-end;
-{$ENDIF}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure glbReadOpenGLExtensions;
-var
- {$IFDEF GLB_DELPHI}
- Context: HGLRC;
- {$ENDIF}
- 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;
-
-begin
-{$IFDEF GLB_NATIVE_OGL_DYNAMIC}
- InitOpenGLCS.Enter;
- try
- if not OpenGLInitialized then begin
- glbInitOpenGL;
- OpenGLInitialized := true;
- end;
- finally
- InitOpenGLCS.Leave;
- end;
-{$ENDIF}
-
-{$IFDEF GLB_DELPHI}
- Context := wglGetCurrentContext;
- if (Context <> gLastContext) then begin
- gLastContext := Context;
-{$ENDIF}
-
- // Version
- Buffer := glGetString(GL_VERSION);
- 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;
-
- // 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_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_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');
- glCompressedTexImage2D := glbGetProcAddress('glCompressedTexImage2DARB');
- glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImageARB');
- end;
-{$IFDEF GLB_DELPHI}
- end;
-{$ENDIF}
-end;
-{$ENDIF}
-
-(* TODO GLB_DELPHI
-{$IFDEF GLB_DELPHI}
-function CreateGrayPalette: HPALETTE;
-var
- Idx: Integer;
- Pal: PLogPalette;
-begin
- GetMem(Pal, SizeOf(TLogPalette) + (SizeOf(TPaletteEntry) * 256));
-
- Pal.palVersion := $300;
- Pal.palNumEntries := 256;
-
- {$IFOPT R+}
- {$DEFINE GLB_TEMPRANGECHECK}
- {$R-}
- {$ENDIF}
-
- for Idx := 0 to 256 - 1 do begin
- Pal.palPalEntry[Idx].peRed := Idx;
- Pal.palPalEntry[Idx].peGreen := Idx;
- Pal.palPalEntry[Idx].peBlue := Idx;
- Pal.palPalEntry[Idx].peFlags := 0;
- end;
-
- {$IFDEF GLB_TEMPRANGECHECK}
- {$UNDEF GLB_TEMPRANGECHECK}
- {$R+}
- {$ENDIF}
-
- result := CreatePalette(Pal^);
-
- FreeMem(Pal);
-end;
-{$ENDIF}
-*)
-
-{$IFDEF GLB_SDL_IMAGE}
-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// SDL Image Helper /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function glBitmapRWseek(context: PSDL_RWops; offset: Integer; whence: Integer): Integer; cdecl;
-begin
- result := TStream(context^.unknown.data1).Seek(offset, whence);
-end;
-
-function glBitmapRWread(context: PSDL_RWops; Ptr: Pointer; size: Integer; maxnum : Integer): Integer; cdecl;
-begin
- result := TStream(context^.unknown.data1).Read(Ptr^, size * maxnum);
-end;
-
-function glBitmapRWwrite(context: PSDL_RWops; Ptr: Pointer; size: Integer; num: Integer): Integer; cdecl;
-begin
- result := TStream(context^.unknown.data1).Write(Ptr^, size * num);
-end;
-
-function glBitmapRWclose(context: PSDL_RWops): Integer; cdecl;
-begin
- result := 0;
-end;
-
-function glBitmapCreateRWops(Stream: TStream): PSDL_RWops;
-begin
- result := SDL_AllocRW;
-
- if result = nil then
- raise EglBitmapException.Create('glBitmapCreateRWops - SDL_AllocRW failed.');
-
- result^.seek := glBitmapRWseek;
- result^.read := glBitmapRWread;
- result^.write := glBitmapRWwrite;
- result^.close := glBitmapRWclose;
- result^.unknown.data1 := Stream;
-end;
-{$ENDIF}
-
-(* TODO LoadFuncs
-function LoadTexture(Filename: String; var Texture: Cardinal{$IFDEF GLB_DELPHI}; LoadFromRes : Boolean; Instance: Cardinal{$ENDIF}): Boolean;
-var
- glBitmap: TglBitmap2D;
-begin
- result := false;
- Texture := 0;
-
- {$IFDEF GLB_DELPHI}
- if Instance = 0 then
- Instance := HInstance;
-
- if (LoadFromRes) then
- glBitmap := TglBitmap2D.CreateFromResourceName(Instance, FileName)
- else
- {$ENDIF}
- glBitmap := TglBitmap2D.Create(FileName);
-
- try
- glBitmap.DeleteTextureOnFree := false;
- glBitmap.FreeDataAfterGenTexture := false;
- glBitmap.GenTexture(true);
- if (glBitmap.ID > 0) then begin
- Texture := glBitmap.ID;
- result := true;
- end;
- finally
- glBitmap.Free;
- end;
-end;
-
-function LoadCubeMap(PositiveX, NegativeX, PositiveY, NegativeY, PositiveZ, NegativeZ: String; var Texture: Cardinal{$IFDEF GLB_DELPHI}; LoadFromRes : Boolean; Instance: Cardinal{$ENDIF}): Boolean;
-var
- CM: TglBitmapCubeMap;
-begin
- Texture := 0;
-
- {$IFDEF GLB_DELPHI}
- if Instance = 0 then
- Instance := HInstance;
- {$ENDIF}
-
- CM := TglBitmapCubeMap.Create;
- try
- CM.DeleteTextureOnFree := false;
-
- // Maps
- {$IFDEF GLB_DELPHI}
- if (LoadFromRes) then
- CM.LoadFromResource(Instance, PositiveX)
- else
- {$ENDIF}
- CM.LoadFromFile(PositiveX);
- CM.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_X);
-
- {$IFDEF GLB_DELPHI}
- if (LoadFromRes) then
- CM.LoadFromResource(Instance, NegativeX)
- else
- {$ENDIF}
- CM.LoadFromFile(NegativeX);
- CM.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_X);
-
- {$IFDEF GLB_DELPHI}
- if (LoadFromRes) then
- CM.LoadFromResource(Instance, PositiveY)
- else
- {$ENDIF}
- CM.LoadFromFile(PositiveY);
- CM.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Y);
-
- {$IFDEF GLB_DELPHI}
- if (LoadFromRes) then
- CM.LoadFromResource(Instance, NegativeY)
- else
- {$ENDIF}
- CM.LoadFromFile(NegativeY);
- CM.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y);
-
- {$IFDEF GLB_DELPHI}
- if (LoadFromRes) then
- CM.LoadFromResource(Instance, PositiveZ)
- else
- {$ENDIF}
- CM.LoadFromFile(PositiveZ);
- CM.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Z);
-
- {$IFDEF GLB_DELPHI}
- if (LoadFromRes) then
- CM.LoadFromResource(Instance, NegativeZ)
- else
- {$ENDIF}
- CM.LoadFromFile(NegativeZ);
- CM.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
-
- Texture := CM.ID;
- result := true;
- finally
- CM.Free;
- end;
-end;
-
-function LoadNormalMap(Size: Integer; var Texture: Cardinal): Boolean;
-var
- NM: TglBitmapNormalMap;
-begin
- Texture := 0;
-
- NM := TglBitmapNormalMap.Create;
- try
- NM.DeleteTextureOnFree := false;
- NM.GenerateNormalMap(Size);
-
- Texture := NM.ID;
- result := true;
- finally
- NM.Free;
- end;
-end;
-*)
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure glBitmapSetDefaultDeleteTextureOnFree(const aDeleteTextureOnFree: Boolean);
-begin
- glBitmapDefaultDeleteTextureOnFree := aDeleteTextureOnFree;