rendered paste bodyunit SDL_GL;
{$MODE OBJFPC}
interface
uses Sdl, Gl, sdl_image;
function SDL_GL_LoadTexture(surface: PSDL_Surface ; texcoord: PGLFloat): GLuint;
function load_texture(filename: pchar; t: integer): integer;
implementation
function power_of_two(input: integer): Integer;
var
value: integer = 1;
begin
while ( value < input ) do value := value shl 1;
Result := value;
end;
function SDL_GL_LoadTexture(surface: PSDL_Surface ; texcoord: PGLFloat): GLuint;
var
texture: GLuint;
w, h: integer;
image: PSDL_Surface;
area: TSDL_Rect;
saved_flags: LongWord;
saved_alpha: byte;
begin
//* Use the surface width and height expanded to powers of 2 */
w := power_of_two(surface^.w);
h := power_of_two(surface^.h);
texcoord[0] := 0.0;//f; /* Min X */
texcoord[1] := 0.0;//f; /* Min Y */
texcoord[2] := GLfloat(surface^.w) / w; //* Max X */
texcoord[3] := GLfloat(surface^.h) / h; //* Max Y */
image := SDL_CreateRGBSurface(
SDL_SWSURFACE,
w, h,
32,
{$IFDEF ENDIAN_Little}///* OpenGL RGBA masks */
$000000FF,
$0000FF00,
$00FF0000,
$FF000000
{$ELSE}
$FF000000,
$00FF0000,
$0000FF00,
$000000FF
{$ENDIF}
);
if ( image = nil ) then exit(0);
//* Save the alpha blending attributes */
saved_flags := surface^.flags and (SDL_SRCALPHA or SDL_RLEACCELOK);
saved_alpha := 0;//surface^.format^.alpha;
// if ( (saved_flags and SDL_SRCALPHA) = SDL_SRCALPHA ) then
// SDL_SetAlpha(surface, 0, 0);
//* Copy the surface into the GL texture image */
area.x := 0;
area.y := 0;
area.w := surface^.w;
area.h := surface^.h;
SDL_BlitSurface(surface, @area, image, @area);
//* Restore the alpha blending attributes */
//if ( (saved_flags and SDL_SRCALPHA) = SDL_SRCALPHA ) then
// SDL_SetAlpha(surface, saved_flags, saved_alpha);
//* Create an OpenGL texture for the image */
glGenTextures(1, @texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA,
w, h,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
image^.pixels);
SDL_FreeSurface(image); //* No longer needed */
Result := texture;
end;
function load_texture(filename: pchar; t: integer): integer;
var
tex: PSDL_Surface =nil;
monkey: GLuint;
begin
//exit;
tex := IMG_Load(filename);
if (tex = Nil) then begin
// fprintf(stderr, "error: IMG_Load() failed\n");
// return -1;
end;
//* We shouldn't need to lock it, but whatever */
if (SDL_MUSTLOCK(tex)) then
SDL_LockSurface(tex);
//glActiveTextureARB_ptr(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, @monkey);
glBindTexture(GL_TEXTURE_2D, monkey);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
{if(t <> 2) then
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)
else
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);}
//if (tex^.format^.BytesPerPixel = 4) then
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex^.w, tex^.h, 0,
GL_RGBA, GL_UNSIGNED_BYTE, tex^.pixels)
//else
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex^.w, tex^.h, 0,
// GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
;if (SDL_MUSTLOCK(tex)) then
SDL_UnlockSurface(tex);
SDL_FreeSurface(tex);
//if(glGetError())
//return -1;
//return 0;
result := monkey
end;
end.