Index » Empathy Jukebox : Blob 1e64a7 / opengl / glUtils.pas
unit glUtils;

interface
uses gl,glu,windows,jpeg,graphics,loadjpegorbmp,math;


type TCubePositions = record
  front,prev,next,rear : integer;
end;

type tgl2DCoord = record
     x,y : double;
end;

type tgl3DCoord = record
  x,y,z : double;
end;

type TGLImage = array of byte;

type tglVertices = record
   v1 :  tgl3DCoord;
   v2 :  tgl3DCoord;
   v3 :  tgl3DCoord;
   v4 :  tgl3DCoord;
end;

type tglTexCoord = record
    v1 : tgl2DCoord;
    v2 : tgl2DCoord;
    v3 : tgl2DCoord;
    v4 : tgl2DCoord;
end;


type ttexture = record
  texture : GLuint;
  slot : cardinal;
end;

type Tarea = record
  v1 : tgl3DCoord;
  v2 : tgl3DCoord;
  v3 : tgl3DCoord;
  v4 : tgl3DCoord;
end;

var
textures: array of ttexture;    // Storage For One Texture ( NEW )
texturecount : cardinal;
slotcount : cardinal;
currentrotation : integer = 0;


Procedure LoadTexturefromFile(texture : ttexture;Const FName:String;width : integer;height : integer);
Procedure LoadTexturefromBitmap(texture : ttexture;bitmap : TBitmap);
Procedure LoadTexturefromResource(texture : ttexture; Const res:String;width : integer;height : integer);

procedure LoadGLImagefromBitmap(bitmap : TBitmap;var BitmapImage: TGLImage);

function getnextpow2(a : double) : integer;


function addtexture : ttexture;
procedure deltexture(i : integer);
function gl3d(x,y,z : double) : tgl3DCoord;
function gl2d(x,y : double) : tgl2DCoord;

function getGLPos(x,y: integer) : tgl3DCoord;
function getGLPosZ(x,y : integer;z : double) : tgl3DCoord;

function getRealWorldPos(coord : tgl3Dcoord) : tgl3DCoord;

function transformtorealworld(i : tgl3dcoord;matrix : T16darray) : tgl3dcoord;


implementation
procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;



function gl3d(x,y,z : double) : tgl3DCoord;
begin
result.x:=x;
result.y:=y;
result.z:=z;
end;

function gl2d(x,y : double) : tgl2DCoord;
begin
result.x:=x;
result.y:=y;
end;

function transformtorealworld(i : tgl3dcoord;matrix : T16darray) : tgl3dcoord;
begin
result.x:=i.x*matrix[0]+i.y*matrix[4]+i.z*matrix[8]+matrix[12];
result.y:=i.x*matrix[1]+i.y*matrix[5]+i.z*matrix[9]+matrix[13];
result.z:=i.x*matrix[2]+i.y*matrix[6]+i.z*matrix[10]+matrix[14];

end;

function getGLPos(x,y: integer) : tgl3DCoord;
var
  viewport : TViewPortArray;
  modelview : T16dArray;
  projection : T16dArray;
  winz : single;
begin
  glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);
  glGetDoublev(GL_PROJECTION_MATRIX, @projection);
  glGetIntegerv(GL_VIEWPORT, @viewport);

  if (y=0) then y:=1;
  glReadPixels(	x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @winZ );
  gluUnProject(	x, viewport[3]-y, winz, modelview, projection, viewport, @result.x, @result.y, @result.z);
end;

function getGLPosZ(x,y : integer;z : double) : tgl3DCoord;
var
  viewport : TViewPortArray;
  modelview : T16dArray;
  projection : T16dArray;
begin
  glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);
  glGetDoublev(GL_PROJECTION_MATRIX, @projection);
  glGetIntegerv(GL_VIEWPORT, @viewport);

  if (y=0) then y:=1;
  //glReadPixels(	x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @winZ );
  gluUnProject(	x, viewport[3]-y, z, modelview, projection, viewport, @result.x, @result.y, @result.z);
end;



function getRealWorldPos(coord : tgl3Dcoord) : tgl3DCoord;
var
  viewport : TViewPortArray;
  modelview : T16dArray;
  projection : T16dArray;
begin
  glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);
  glGetDoublev(GL_PROJECTION_MATRIX, @projection);
  glGetIntegerv(GL_VIEWPORT, @viewport);
  gluProject(coord.x, coord.y, coord.z, modelview, projection, viewport, @result.x, @result.y, @result.z);
  result.y:=viewport[3]-result.y;
end;




function addtexture : ttexture;
begin
inc(texturecount);
inc(slotcount);
setlength(textures,texturecount);
textures[texturecount-1].slot:=slotcount-1;
glGenTextures(1, textures[texturecount-1].texture);
result:=textures[texturecount-1];
end;

procedure deltexture(i : integer);
var
  n: Integer;
begin
glDeleteTextures(1,@textures[i].texture);
for n := 0 to texturecount do begin
    textures[n]:=textures[n+1];
end;
dec(texturecount);
setlength(textures,texturecount);
end;


procedure LoadGLImagefromBitmap(bitmap : TBitmap;var BitmapImage: TGLImage);
var
  BitmapHeader: TBitmapInfo;
  BitmapLength : dword;
  HeaderSize, ImageSize : DWord;

begin
  GetDIBSizes(bitmap.Handle, HeaderSize, ImageSize);
  BitmapLength:=(ImageSize);
  setlength(bitmapimage,bitmaplength);
  GetDIB(bitmap.Handle,bitmap.Palette,BitmapHeader,BitmapImage[0]);
end;

procedure LoadTexturefromBitmap(texture : ttexture;bitmap : TBitmap);
var
  BitmapHeader: TBitmapInfo;
  BitmapImage: array of  byte;
  BitmapLength : dword;
  HeaderSize, ImageSize : DWord;
begin

  GetDIBSizes(bitmap.Handle, HeaderSize, ImageSize);
  BitmapLength:=(ImageSize);
  setlength(bitmapimage,bitmaplength);
  GetDIB(bitmap.Handle,bitmap.Palette,BitmapHeader,BitmapImage[0]);


    if (Assigned(bitmapimage)) then
    begin
      glBindTexture(GL_TEXTURE_2D, texture.texture);
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Linear Filtering
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // Linear Filtering
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); // Linear Filtering
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); // Linear Filtering
      glTexImage2D(GL_TEXTURE_2D, 0, 4, bitmap.width, bitmap.height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, @BitmapImage[0]);
    end;
end;


Procedure LoadTexturefromFile(texture : ttexture; Const FName:String;width : integer;height : integer);
var
  bitmap : Tbitmap;
  tr : trect;
  ibitmap : Tbitmap;

begin
  bitmap:=Tbitmap.create;
  ibitmap:=Tbitmap.create;
  loadjpegbmp(fname,ibitmap);
  bitmap.Width:=width;
  bitmap.Height:=height;
 // jpeg:=Tjpegimage.create;
 // jpeg.LoadFromFile(FName);
  tr.Left:=0;
  tr.Top:=0;
  tr.Right:=bitmap.Width;
  tr.Bottom:=bitmap.Height;

  bitmap.Canvas.StretchDraw(tr,ibitmap);

  LoadTextureFromBitmap(texture,bitmap);

  BitMap.Free;
end;


Procedure LoadTexturefromResource(texture : ttexture; Const res:String;width : integer;height : integer);
var
  obitmap : Tbitmap;
  bitmap : Tbitmap;
  tr : trect;

begin
  bitmap:=Tbitmap.create;
  bitmap.LoadFromResourceName(hinstance,res);
  obitmap:=Tbitmap.create;
  obitmap.Width:=width;
  obitmap.Height:=height;

  tr.Left:=0;
  tr.Top:=0;
  tr.Right:=bitmap.Width;
  tr.Bottom:=bitmap.Height;

  obitmap.Canvas.StretchDraw(tr,bitmap);

  LoadTextureFromBitmap(texture,obitmap);

  BitMap.Free;
  obitmap.free;
end;

function getnextpow2(a : double) : integer;
var
i : integer;
begin
i:=trunc(a);
dec(i);
i := (i shr 1) or i;
i := (i shr 2) or i;
i := (i shr 4) or i;
i := (i shr 8) or i;
i := (i shr 16) or i;
inc(i);
result:=i;
end;


end.