Переглянути джерело

* implemented CubeMaps

master
Bergmann89 12 роки тому
джерело
коміт
5bce73c919
1 змінених файлів з 105 додано та 140 видалено
  1. +105
    -140
      glBitmap.pas

+ 105
- 140
glBitmap.pas Переглянути файл

@@ -1008,13 +1008,11 @@ type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TglBitmap2D = class(TglBitmap) TglBitmap2D = class(TglBitmap)
protected protected
// Bildeinstellungen
fLines: array of PByte; fLines: array of PByte;

function GetScanline(const aIndex: Integer): Pointer; function GetScanline(const aIndex: Integer): Pointer;
procedure SetDataPointer(var aData: PByte; const aFormat: TglBitmapFormat; procedure SetDataPointer(var aData: PByte; const aFormat: TglBitmapFormat;
const aWidth: Integer = - 1; const aHeight: Integer = - 1); override; const aWidth: Integer = - 1; const aHeight: Integer = - 1); override;
procedure UploadData(const aBuildWithGlu: Boolean);
procedure UploadData(const aTarget: GLenum; const aBuildWithGlu: Boolean);
public public
property Width; property Width;
property Height; property Height;
@@ -1033,34 +1031,25 @@ type
const aScale: Single = 2; const aUseAlpha: Boolean = false); const aScale: Single = 2; const aUseAlpha: Boolean = false);
end; end;


(* TODO
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TglBitmapCubeMap = class(TglBitmap2D) TglBitmapCubeMap = class(TglBitmap2D)
protected protected
fGenMode: Integer; fGenMode: Integer;

// Hide GenTexture
procedure GenTexture(TestTextureSize: Boolean = true); reintroduce;
procedure GenTexture(const aTestTextureSize: Boolean = true); reintroduce;
public public
procedure AfterConstruction; override; 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; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TglBitmapNormalMap = class(TglBitmapCubeMap) TglBitmapNormalMap = class(TglBitmapCubeMap)
public public
procedure AfterConstruction; override; procedure AfterConstruction; override;

procedure GenerateNormalMap(Size: Integer = 32; TestTextureSize: Boolean = true);
procedure GenerateNormalMap(const aSize: Integer = 32; const aTestTextureSize: Boolean = true);
end; end;




*)

const const
NULL_SIZE: TglBitmapPixelPosition = (Fields: []; X: 0; Y: 0); NULL_SIZE: TglBitmapPixelPosition = (Fields: []; X: 0; Y: 0);


@@ -7575,7 +7564,7 @@ begin
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmap2D.UploadData(const aBuildWithGlu: Boolean);
procedure TglBitmap2D.UploadData(const aTarget: GLenum; const aBuildWithGlu: Boolean);
var var
FormatDesc: TFormatDescriptor; FormatDesc: TFormatDescriptor;
begin begin
@@ -7583,12 +7572,12 @@ begin


FormatDesc := TFormatDescriptor.Get(Format); FormatDesc := TFormatDescriptor.Get(Format);
if FormatDesc.IsCompressed then begin 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 end else if aBuildWithGlu then begin
gluBuild2DMipmaps(Target, FormatDesc.Components, Width, Height,
gluBuild2DMipmaps(aTarget, FormatDesc.Components, Width, Height,
FormatDesc.glFormat, FormatDesc.glDataFormat, Data) FormatDesc.glFormat, FormatDesc.glDataFormat, Data)
end else begin end else begin
glTexImage2D(Target, 0, FormatDesc.glInternalFormat, Width, Height, 0,
glTexImage2D(aTarget, 0, FormatDesc.glInternalFormat, Width, Height, 0,
FormatDesc.glFormat, FormatDesc.glDataFormat, Data); FormatDesc.glFormat, FormatDesc.glDataFormat, Data);
end; end;


@@ -7694,7 +7683,7 @@ begin


CreateId; CreateId;
SetupParameters(BuildWithGlu); SetupParameters(BuildWithGlu);
UploadData(BuildWithGlu);
UploadData(Target, BuildWithGlu);
glAreTexturesResident(1, @fID, @fIsResident); glAreTexturesResident(1, @fID, @fIsResident);
end; end;
end; end;
@@ -7983,20 +7972,15 @@ begin
end; end;
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TglBitmapCubeMap////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmapCubeMap.GenTexture(const aTestTextureSize: Boolean);
begin
Assert(false, 'TglBitmapCubeMap.GenTexture - Don''t call GenTextures directly.');
end;









(*



{ TglBitmapCubeMap }

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmapCubeMap.AfterConstruction; procedure TglBitmapCubeMap.AfterConstruction;
begin begin
inherited; 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 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 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; fGenMode := GL_REFLECTION_MAP;
end; 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 var
glFormat, glInternalFormat, glType: Cardinal;
BuildWithGlu: Boolean; BuildWithGlu: Boolean;
TexSize: Integer; TexSize: Integer;
begin begin
// Check Texture Size
if (TestTextureSize) then begin
if (aTestTextureSize) then 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 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.'); raise EglBitmapNonPowerOfTwoException.Create('TglBitmapCubeMap.GenTexture - Cubemaps dosn''t support non power of two texture.');
end; end;


// create Texture
if ID = 0 then begin
if (ID = 0) then
CreateID; CreateID;
SetupParameters(BuildWithGlu);
end;

SelectFormat(InternalFormat, glFormat, glInternalFormat, glType);

UploadData (CubeTarget, glFormat, glInternalFormat, glType, BuildWithGlu);
SetupParameters(BuildWithGlu);
UploadData(aCubeTarget, BuildWithGlu);
end; end;


procedure TglBitmapCubeMap.GenTexture(TestTextureSize: Boolean);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmapCubeMap.Bind(const aEnableTexCoordsGen: Boolean; const aEnableTextureUnit: Boolean);
begin 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; end;



procedure TglBitmapCubeMap.Unbind(DisableTexCoordsGen,
DisableTextureUnit: Boolean);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmapCubeMap.Unbind(const aDisableTexCoordsGen: Boolean; const aDisableTextureUnit: Boolean);
begin begin
inherited Unbind (DisableTextureUnit);

if DisableTexCoordsGen then begin
inherited Unbind(aDisableTextureUnit);
if aDisableTexCoordsGen then begin
glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R); glDisable(GL_TEXTURE_GEN_R);
end; end;
end; end;


{ TglBitmapNormalMap }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TglBitmapNormalMap//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type type
TVec = Array[0..2] of Single; 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; PglBitmapNormalMapRec = ^TglBitmapNormalMapRec;
TglBitmapNormalMapRec = record TglBitmapNormalMapRec = record
@@ -8085,62 +8053,63 @@ type
Func: TglBitmapNormalMapGetVectorFunc; Func: TglBitmapNormalMapGetVectorFunc;
end; end;


procedure glBitmapNormalMapPosX(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapNormalMapPosX(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
begin 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; end;


procedure glBitmapNormalMapNegX(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapNormalMapNegX(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
begin 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; end;


procedure glBitmapNormalMapPosY(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapNormalMapPosY(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
begin 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; end;


procedure glBitmapNormalMapNegY(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapNormalMapNegY(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
begin 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; end;


procedure glBitmapNormalMapPosZ(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapNormalMapPosZ(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
begin 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; end;


procedure glBitmapNormalMapNegZ(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapNormalMapNegZ(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
begin 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; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure glBitmapNormalMapFunc(var FuncRec: TglBitmapFunctionRec); procedure glBitmapNormalMapFunc(var FuncRec: TglBitmapFunctionRec);
var var
Vec : TVec;
i: Integer;
Vec: TVec;
Len: Single; Len: Single;
begin begin
with FuncRec do begin with FuncRec do begin
with PglBitmapNormalMapRec (CustomData)^ do begin
with PglBitmapNormalMapRec(Args)^ do begin
Func(Vec, Position, HalfSize); Func(Vec, Position, HalfSize);


// Normalize // Normalize
@@ -8158,66 +8127,62 @@ begin
end; end;


// Set Color // 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;
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmapNormalMap.AfterConstruction; procedure TglBitmapNormalMap.AfterConstruction;
begin begin
inherited; inherited;

fGenMode := GL_NORMAL_MAP; fGenMode := GL_NORMAL_MAP;
end; end;



procedure TglBitmapNormalMap.GenerateNormalMap(Size: Integer;
TestTextureSize: Boolean);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmapNormalMap.GenerateNormalMap(const aSize: Integer; const aTestTextureSize: Boolean);
var var
Rec: TglBitmapNormalMapRec; Rec: TglBitmapNormalMapRec;
SizeRec: TglBitmapPixelPosition; SizeRec: TglBitmapPixelPosition;
begin begin
Rec.HalfSize := Size div 2;

Rec.HalfSize := aSize div 2;
FreeDataAfterGenTexture := false; FreeDataAfterGenTexture := false;


SizeRec.Fields := [ffX, ffY]; SizeRec.Fields := [ffX, ffY];
SizeRec.X := Size;
SizeRec.Y := Size;
SizeRec.X := aSize;
SizeRec.Y := aSize;


// Positive X // Positive X
Rec.Func := glBitmapNormalMapPosX; 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 // Negative X
Rec.Func := glBitmapNormalMapNegX; 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 // Positive Y
Rec.Func := glBitmapNormalMapPosY; 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 // Negative Y
Rec.Func := glBitmapNormalMapNegY; 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 // Positive Z
Rec.Func := glBitmapNormalMapPosZ; 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 // Negative Z
Rec.Func := glBitmapNormalMapNegZ; 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; end;
*)


initialization initialization
glBitmapSetDefaultFormat(tfEmpty); glBitmapSetDefaultFormat(tfEmpty);


Завантаження…
Відмінити
Зберегти