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.