From 5bce73c91972f2b2974b3cef61b5354f517d6b97 Mon Sep 17 00:00:00 2001 From: Bergmann89 Date: Tue, 19 Nov 2013 19:40:02 +0100 Subject: [PATCH] * implemented CubeMaps --- glBitmap.pas | 245 +++++++++++++++++++++++++---------------------------------- 1 file changed, 105 insertions(+), 140 deletions(-) diff --git a/glBitmap.pas b/glBitmap.pas index 0b4d037..513a9e6 100644 --- a/glBitmap.pas +++ b/glBitmap.pas @@ -1008,13 +1008,11 @@ type ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TglBitmap2D = class(TglBitmap) protected - // Bildeinstellungen fLines: array of PByte; - function GetScanline(const aIndex: Integer): Pointer; procedure SetDataPointer(var aData: PByte; const aFormat: TglBitmapFormat; const aWidth: Integer = - 1; const aHeight: Integer = - 1); override; - procedure UploadData(const aBuildWithGlu: Boolean); + procedure UploadData(const aTarget: GLenum; const aBuildWithGlu: Boolean); public property Width; property Height; @@ -1033,34 +1031,25 @@ type const aScale: Single = 2; const aUseAlpha: Boolean = false); end; -(* TODO +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TglBitmapCubeMap = class(TglBitmap2D) protected fGenMode: Integer; - - // Hide GenTexture - procedure GenTexture(TestTextureSize: Boolean = true); reintroduce; + procedure GenTexture(const aTestTextureSize: Boolean = true); reintroduce; public procedure AfterConstruction; override; - - procedure GenerateCubeMap(CubeTarget: Cardinal; TestTextureSize: Boolean = true); - - procedure Unbind(DisableTexCoordsGen: Boolean = true; DisableTextureUnit: Boolean = true); reintroduce; virtual; - procedure Bind(EnableTexCoordsGen: Boolean = true; EnableTextureUnit: Boolean = true); reintroduce; virtual; + procedure GenerateCubeMap(const aCubeTarget: Cardinal; const aTestTextureSize: Boolean = true); + procedure Bind(const aEnableTexCoordsGen: Boolean = true; const aEnableTextureUnit: Boolean = true); reintroduce; virtual; + procedure Unbind(const aDisableTexCoordsGen: Boolean = true; const aDisableTextureUnit: Boolean = true); reintroduce; virtual; end; - +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TglBitmapNormalMap = class(TglBitmapCubeMap) public procedure AfterConstruction; override; - - procedure GenerateNormalMap(Size: Integer = 32; TestTextureSize: Boolean = true); + procedure GenerateNormalMap(const aSize: Integer = 32; const aTestTextureSize: Boolean = true); end; - - -*) - const NULL_SIZE: TglBitmapPixelPosition = (Fields: []; X: 0; Y: 0); @@ -7575,7 +7564,7 @@ begin end; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -procedure TglBitmap2D.UploadData(const aBuildWithGlu: Boolean); +procedure TglBitmap2D.UploadData(const aTarget: GLenum; const aBuildWithGlu: Boolean); var FormatDesc: TFormatDescriptor; begin @@ -7583,12 +7572,12 @@ begin FormatDesc := TFormatDescriptor.Get(Format); if FormatDesc.IsCompressed then begin - glCompressedTexImage2D(Target, 0, FormatDesc.glInternalFormat, Width, Height, 0, FormatDesc.GetSize(fDimension), Data) + glCompressedTexImage2D(aTarget, 0, FormatDesc.glInternalFormat, Width, Height, 0, FormatDesc.GetSize(fDimension), Data) end else if aBuildWithGlu then begin - gluBuild2DMipmaps(Target, FormatDesc.Components, Width, Height, + gluBuild2DMipmaps(aTarget, FormatDesc.Components, Width, Height, FormatDesc.glFormat, FormatDesc.glDataFormat, Data) end else begin - glTexImage2D(Target, 0, FormatDesc.glInternalFormat, Width, Height, 0, + glTexImage2D(aTarget, 0, FormatDesc.glInternalFormat, Width, Height, 0, FormatDesc.glFormat, FormatDesc.glDataFormat, Data); end; @@ -7694,7 +7683,7 @@ begin CreateId; SetupParameters(BuildWithGlu); - UploadData(BuildWithGlu); + UploadData(Target, BuildWithGlu); glAreTexturesResident(1, @fID, @fIsResident); end; end; @@ -7983,20 +7972,15 @@ begin end; end; +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//TglBitmapCubeMap//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure TglBitmapCubeMap.GenTexture(const aTestTextureSize: Boolean); +begin + Assert(false, 'TglBitmapCubeMap.GenTexture - Don''t call GenTextures directly.'); +end; - - - - - - - -(* - - - -{ TglBitmapCubeMap } - +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TglBitmapCubeMap.AfterConstruction; begin inherited; @@ -8004,80 +7988,64 @@ begin 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.'); - SetWrap; // set all to GL_CLAMP_TO_EDGE - Target := GL_TEXTURE_CUBE_MAP; + SetWrap; + Target := GL_TEXTURE_CUBE_MAP; fGenMode := GL_REFLECTION_MAP; end; - -procedure TglBitmapCubeMap.Bind(EnableTexCoordsGen, EnableTextureUnit: Boolean); -begin - inherited Bind (EnableTextureUnit); - - if EnableTexCoordsGen then begin - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, fGenMode); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, fGenMode); - glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, fGenMode); - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glEnable(GL_TEXTURE_GEN_R); - end; -end; - - -procedure TglBitmapCubeMap.GenerateCubeMap(CubeTarget: Cardinal; TestTextureSize: Boolean); +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure TglBitmapCubeMap.GenerateCubeMap(const aCubeTarget: Cardinal; const aTestTextureSize: Boolean); var - glFormat, glInternalFormat, glType: Cardinal; BuildWithGlu: Boolean; TexSize: Integer; begin - // Check Texture Size - if (TestTextureSize) then begin + if (aTestTextureSize) then begin 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.'); - 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.'); end; - // create Texture - if ID = 0 then begin + if (ID = 0) then CreateID; - SetupParameters(BuildWithGlu); - end; - - SelectFormat(InternalFormat, glFormat, glInternalFormat, glType); - - UploadData (CubeTarget, glFormat, glInternalFormat, glType, BuildWithGlu); + SetupParameters(BuildWithGlu); + UploadData(aCubeTarget, BuildWithGlu); end; - -procedure TglBitmapCubeMap.GenTexture(TestTextureSize: Boolean); +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure TglBitmapCubeMap.Bind(const aEnableTexCoordsGen: Boolean; const aEnableTextureUnit: Boolean); begin - Assert(false, 'TglBitmapCubeMap.GenTexture - Don''t call GenTextures directly.'); + inherited Bind (aEnableTextureUnit); + if aEnableTexCoordsGen then begin + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, fGenMode); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, fGenMode); + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, fGenMode); + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_GEN_R); + end; end; - -procedure TglBitmapCubeMap.Unbind(DisableTexCoordsGen, - DisableTextureUnit: Boolean); +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure TglBitmapCubeMap.Unbind(const aDisableTexCoordsGen: Boolean; const aDisableTextureUnit: Boolean); begin - inherited Unbind (DisableTextureUnit); - - if DisableTexCoordsGen then begin + inherited Unbind(aDisableTextureUnit); + if aDisableTexCoordsGen then begin glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); end; end; - -{ TglBitmapNormalMap } - +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//TglBitmapNormalMap////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// type TVec = Array[0..2] of Single; - TglBitmapNormalMapGetVectorFunc = procedure (var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer); + TglBitmapNormalMapGetVectorFunc = procedure (out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer); PglBitmapNormalMapRec = ^TglBitmapNormalMapRec; TglBitmapNormalMapRec = record @@ -8085,62 +8053,63 @@ type Func: TglBitmapNormalMapGetVectorFunc; end; - -procedure glBitmapNormalMapPosX(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer); + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure glBitmapNormalMapPosX(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer); begin - Vec[0] := HalfSize; - Vec[1] := - (Position.Y + 0.5 - HalfSize); - Vec[2] := - (Position.X + 0.5 - HalfSize); + aVec[0] := aHalfSize; + aVec[1] := - (aPosition.Y + 0.5 - aHalfSize); + aVec[2] := - (aPosition.X + 0.5 - aHalfSize); end; - -procedure glBitmapNormalMapNegX(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer); +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure glBitmapNormalMapNegX(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer); begin - Vec[0] := - HalfSize; - Vec[1] := - (Position.Y + 0.5 - HalfSize); - Vec[2] := Position.X + 0.5 - HalfSize; + aVec[0] := - aHalfSize; + aVec[1] := - (aPosition.Y + 0.5 - aHalfSize); + aVec[2] := aPosition.X + 0.5 - aHalfSize; end; - -procedure glBitmapNormalMapPosY(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer); +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure glBitmapNormalMapPosY(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer); begin - Vec[0] := Position.X + 0.5 - HalfSize; - Vec[1] := HalfSize; - Vec[2] := Position.Y + 0.5 - HalfSize; + aVec[0] := aPosition.X + 0.5 - aHalfSize; + aVec[1] := aHalfSize; + aVec[2] := aPosition.Y + 0.5 - aHalfSize; end; - -procedure glBitmapNormalMapNegY(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer); +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure glBitmapNormalMapNegY(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer); begin - Vec[0] := Position.X + 0.5 - HalfSize; - Vec[1] := - HalfSize; - Vec[2] := - (Position.Y + 0.5 - HalfSize); + aVec[0] := aPosition.X + 0.5 - aHalfSize; + aVec[1] := - aHalfSize; + aVec[2] := - (aPosition.Y + 0.5 - aHalfSize); end; - -procedure glBitmapNormalMapPosZ(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer); +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure glBitmapNormalMapPosZ(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer); begin - Vec[0] := Position.X + 0.5 - HalfSize; - Vec[1] := - (Position.Y + 0.5 - HalfSize); - Vec[2] := HalfSize; + aVec[0] := aPosition.X + 0.5 - aHalfSize; + aVec[1] := - (aPosition.Y + 0.5 - aHalfSize); + aVec[2] := aHalfSize; end; - -procedure glBitmapNormalMapNegZ(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer); +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure glBitmapNormalMapNegZ(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer); begin - Vec[0] := - (Position.X + 0.5 - HalfSize); - Vec[1] := - (Position.Y + 0.5 - HalfSize); - Vec[2] := - HalfSize; + aVec[0] := - (aPosition.X + 0.5 - aHalfSize); + aVec[1] := - (aPosition.Y + 0.5 - aHalfSize); + aVec[2] := - aHalfSize; end; - +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure glBitmapNormalMapFunc(var FuncRec: TglBitmapFunctionRec); var - Vec : TVec; + i: Integer; + Vec: TVec; Len: Single; begin with FuncRec do begin - with PglBitmapNormalMapRec (CustomData)^ do begin + with PglBitmapNormalMapRec(Args)^ do begin Func(Vec, Position, HalfSize); // Normalize @@ -8158,66 +8127,62 @@ begin end; // Set Color - Dest.Red := Round(Vec[0] * 255); - Dest.Green := Round(Vec[1] * 255); - Dest.Blue := Round(Vec[2] * 255); + for i := 0 to 2 do + Dest.Data.arr[i] := Round(Vec[i] * 255); end; end; - +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TglBitmapNormalMap.AfterConstruction; begin inherited; - fGenMode := GL_NORMAL_MAP; end; - -procedure TglBitmapNormalMap.GenerateNormalMap(Size: Integer; - TestTextureSize: Boolean); +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +procedure TglBitmapNormalMap.GenerateNormalMap(const aSize: Integer; const aTestTextureSize: Boolean); var Rec: TglBitmapNormalMapRec; SizeRec: TglBitmapPixelPosition; begin - Rec.HalfSize := Size div 2; - + Rec.HalfSize := aSize div 2; FreeDataAfterGenTexture := false; SizeRec.Fields := [ffX, ffY]; - SizeRec.X := Size; - SizeRec.Y := Size; + SizeRec.X := aSize; + SizeRec.Y := aSize; // Positive X Rec.Func := glBitmapNormalMapPosX; - LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec); - GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_X, TestTextureSize); + LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec); + GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_X, aTestTextureSize); // Negative X Rec.Func := glBitmapNormalMapNegX; - LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec); - GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, TestTextureSize); + LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec); + GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, aTestTextureSize); // Positive Y Rec.Func := glBitmapNormalMapPosY; - LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec); - GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, TestTextureSize); + LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec); + GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, aTestTextureSize); // Negative Y Rec.Func := glBitmapNormalMapNegY; - LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec); - GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, TestTextureSize); + LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec); + GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, aTestTextureSize); // Positive Z Rec.Func := glBitmapNormalMapPosZ; - LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec); - GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, TestTextureSize); + LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec); + GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, aTestTextureSize); // Negative Z Rec.Func := glBitmapNormalMapNegZ; - LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec); - GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, TestTextureSize); + LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec); + GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, aTestTextureSize); end; -*) + initialization glBitmapSetDefaultFormat(tfEmpty); -- 2.1.4