hedgewars/uAtlas.pas
author Wolfgang Steffens <WolfgangSteff@gmail.com>
Mon, 25 Jun 2012 12:02:54 +0200
changeset 7295 e70b81854fb9
parent 7292 18430abfbcd2
child 7297 af64b509725c
permissions -rw-r--r--
made surface retaining mandatory
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7292
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
     1
{$INCLUDE "options.inc"}
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
     2
{$IF GLunit = GL}{$DEFINE GLunit:=GL,GLext}{$ENDIF}
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
     3
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
     4
unit uAtlas;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
     5
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
     6
interface
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
     7
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
     8
uses SDLh, uTypes;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
     9
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    10
procedure initModule;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    11
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    12
function Surface2Tex_(surf: PSDL_Surface; enableClamp: boolean): PTexture;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    13
procedure FreeTexture_(sprite: PTexture);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    14
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    15
implementation
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    16
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    17
uses GLunit, uBinPacker, uDebug, png, sysutils;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    18
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    19
const
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    20
    MaxAtlases = 1;    // Maximum number of atlases (textures) to allocate
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    21
    MaxTexSize = 4096; // Maximum atlas size in pixels
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    22
    MinTexSize = 128;  // Minimum atlas size in pixels
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    23
    CompressionThreshold = 0.4; // Try to compact (half the size of) an atlas, when occupancy is less than this
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    24
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    25
type
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    26
    AtlasInfo = record
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    27
        PackerInfo: Atlas;     // Rectangle packer context
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    28
        TextureInfo: TAtlas;   // OpenGL texture information
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    29
        Allocated: boolean;    // indicates if this atlas is in use
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    30
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    31
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    32
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    33
    Info: array[0..MaxAtlases-1] of AtlasInfo;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    34
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    35
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    36
////////////////////////////////////////////////////////////////////////////////
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    37
// Debug routines
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    38
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    39
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    40
    DumpID: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    41
    DumpFile: File of byte;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    42
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    43
const
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    44
    PNG_COLOR_TYPE_RGBA = 6;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    45
    PNG_COLOR_TYPE_RGB = 2;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    46
    PNG_INTERLACE_NONE = 0;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    47
    PNG_COMPRESSION_TYPE_DEFAULT = 0;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    48
    PNG_FILTER_TYPE_DEFAULT = 0;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    49
    
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    50
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    51
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    52
procedure writefunc(png: png_structp; buffer: png_bytep; size: QWord); cdecl;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    53
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    54
    p: Pbyte;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    55
    i: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    56
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    57
  //TStream(png_get_io_ptr(png)).Write(buffer^, size);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    58
    BlockWrite(DumpFile, buffer^, size);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    59
{    p:= PByte(buffer^);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    60
    for i:=0 to pred(size) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    61
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    62
        Write(DumpFile, p^);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    63
        inc(p);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    64
    end;}
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    65
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    66
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    67
function IntToStrPad(i: Integer): string;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    68
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    69
  s: string;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    70
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    71
   s:= IntToStr(i);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    72
   if (i < 10) then s:='0' + s;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    73
   if (i < 100) then s:='0' + s;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    74
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    75
   IntToStrPad:=s;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    76
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    77
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    78
procedure DumpAtlas(var info: AtlasInfo);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    79
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    80
    png: png_structp;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    81
    png_info: png_infop;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    82
    w, h, sz: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    83
    filename: string;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    84
    rows: array of png_bytep;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    85
    size: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    86
    i, j: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    87
    mem, p, pp: PByte;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    88
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    89
    filename:= '/home/wolfgangst/hedgewars/dump/atlas_' + IntToStrPad(DumpID) + '.png';
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    90
    Assign(DumpFile, filename);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    91
    inc(DumpID);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    92
    Rewrite(DumpFile);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    93
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    94
    w:= info.TextureInfo.w;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    95
    h:= info.TextureInfo.h;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    96
    size:= w * h * 4;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    97
    SetLength(rows, h);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    98
    GetMem(mem, size);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
    99
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   100
    glBindTexture(GL_TEXTURE_2D, info.TextureInfo.id);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   101
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   102
    glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, mem);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   103
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   104
    p:= mem;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   105
    for i:= 0 to pred(h) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   106
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   107
        rows[i]:= p;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   108
        pp:= p;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   109
        inc(pp, 3);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   110
        {for j:= 0 to pred(w) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   111
        begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   112
            pp^:=255;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   113
            inc(pp, 4);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   114
        end;}
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   115
        inc(p, w * 4);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   116
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   117
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   118
    png := png_create_write_struct(PNG_LIBPNG_VER_STRING, nil, nil, nil);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   119
    png_info := png_create_info_struct(png);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   120
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   121
    png_set_write_fn(png, nil, @writefunc, nil);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   122
    png_set_IHDR(png, png_info, w, h, 8, PNG_COLOR_TYPE_RGBA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   123
    png_write_info(png, png_info);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   124
    png_write_image(png, @rows[0]);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   125
    png_write_end(png, png_info);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   126
    png_destroy_write_struct(@png, @png_info);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   127
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   128
    FreeMem(mem);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   129
    
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   130
    SetLength(rows, 0);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   131
    Close(DumpFile);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   132
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   133
    //if (DumpID >= 30) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   134
    //    halt(0);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   135
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   136
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   137
////////////////////////////////////////////////////////////////////////////////
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   138
// Upload routines
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   139
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   140
function createTexture(width, height: Integer): TAtlas;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   141
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   142
  nullTex: Pointer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   143
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   144
    createTexture.w:= width;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   145
    createTexture.h:= height;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   146
    createTexture.priority:= 0;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   147
    glGenTextures(1, @createTexture.id);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   148
    glBindTexture(GL_TEXTURE_2D, createTexture.id);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   149
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   150
    //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   151
    
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   152
    GetMem(NullTex, width * height * 4);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   153
    FillChar(NullTex^, width * height * 4, 0);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   154
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NullTex);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   155
    FreeMem(NullTex);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   156
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   157
    glBindTexture(GL_TEXTURE_2D, 0);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   158
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   159
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   160
function Min(x, y: Single): Single;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   161
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   162
  if x < y then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   163
    Min:=x
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   164
  else Min:=y;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   165
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   166
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   167
function Max(x, y: Single): Single;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   168
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   169
  if x > y then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   170
    Max:=x
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   171
  else Max:=y;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   172
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   173
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   174
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   175
procedure HSVToRGB(const H, S, V: Single; out R, G, B: Single); 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   176
const 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   177
    SectionSize = 60/360; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   178
var 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   179
    Section: Single; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   180
    SectionIndex: Integer; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   181
    f: single; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   182
    p, q, t: Single; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   183
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   184
    if H < 0 then 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   185
    begin 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   186
        R:= V; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   187
        G:= R; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   188
        B:= R; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   189
    end 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   190
    else 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   191
    begin 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   192
        Section:= H/SectionSize; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   193
        SectionIndex:= Trunc(Section); 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   194
        f:= Section - SectionIndex; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   195
        p:= V * ( 1 - S ); 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   196
        q:= V * ( 1 - S * f ); 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   197
        t:= V * ( 1 - S * ( 1 - f ) ); 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   198
        case SectionIndex of 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   199
            0: 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   200
            begin 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   201
                R:= V; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   202
                G:= t; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   203
                B:= p; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   204
            end; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   205
            1: 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   206
            begin 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   207
                R:= q; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   208
                G:= V; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   209
                B:= p; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   210
            end; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   211
            2: 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   212
            begin 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   213
                R:= p; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   214
                G:= V; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   215
                B:= t; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   216
            end; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   217
            3: 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   218
            begin 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   219
                R:= p; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   220
                G:= q; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   221
                B:= V; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   222
            end; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   223
            4: 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   224
            begin 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   225
                R:= t; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   226
                G:= p; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   227
                B:= V; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   228
            end; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   229
            else 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   230
                R:= V; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   231
                G:= p; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   232
                B:= q; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   233
        end; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   234
    end; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   235
end; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   236
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   237
procedure DebugColorize(surf: PSDL_Surface);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   238
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   239
    sz: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   240
    p: PByte;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   241
    i: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   242
    r, g, b, a, inva: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   243
    randr, randg, randb: Single;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   244
    randh: Single;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   245
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   246
    sz:= surf^.w * surf^.h;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   247
    p:= surf^.pixels;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   248
    //randr:=Random;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   249
    //randg:=Random;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   250
    //randb:=1 - min(randr, randg);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   251
    randh:=Random;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   252
    HSVToRGB(randh, 1.0, 1.0, randr, randg, randb);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   253
    for i:=0 to pred(sz) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   254
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   255
        a:= p[3];
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   256
        inva:= 255 - a;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   257
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   258
        r:=Trunc(inva*randr + p[0]*a/255);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   259
        g:=Trunc(inva*randg + p[1]*a/255);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   260
        b:=Trunc(inva*randb + p[2]*a/255);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   261
        if r > 255 then r:= 255;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   262
        if g > 255 then g:= 255;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   263
        if b > 255 then b:= 255;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   264
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   265
        p[0]:=r;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   266
        p[1]:=g;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   267
        p[2]:=b;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   268
        p[3]:=255;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   269
        inc(p, 4);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   270
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   271
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   272
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   273
procedure Upload(var info: AtlasInfo; sprite: Rectangle; surf: PSDL_Surface);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   274
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   275
    sp: PTexture;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   276
    i, j, stride: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   277
    scanline: PByte;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   278
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   279
    writeln('Uploading sprite to ', sprite.x, ',', sprite.y, ',', sprite.width, ',', sprite.height);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   280
    sp:= PTexture(sprite.UserData);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   281
    sp^.x:= sprite.x;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   282
    sp^.y:= sprite.y;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   283
    sp^.isRotated:= sp^.w <> sprite.width;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   284
    sp^.atlas:= @info.TextureInfo;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   285
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   286
    if SDL_MustLock(surf) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   287
        SDLTry(SDL_LockSurface(surf) >= 0, true);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   288
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   289
    //if GrayScale then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   290
    //    Surface2GrayScale(surf);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   291
    DebugColorize(surf);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   292
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   293
    glBindTexture(GL_TEXTURE_2D, info.TextureInfo.id);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   294
    if (sp^.isRotated) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   295
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   296
        scanline:= surf^.pixels;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   297
        for i:= 0 to pred(sprite.width) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   298
        begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   299
            glTexSubImage2D(GL_TEXTURE_2D, 0, sprite.x + i, sprite.y, 1, sprite.height, GL_RGBA, GL_UNSIGNED_BYTE, scanline);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   300
            inc(scanline, sprite.height * 4);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   301
        end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   302
    end
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   303
    else
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   304
        glTexSubImage2D(GL_TEXTURE_2D, 0, sprite.x, sprite.y, sprite.width, sprite.height, GL_RGBA, GL_UNSIGNED_BYTE, surf^.pixels);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   305
    glBindTexture(GL_TEXTURE_2D, 0);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   306
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   307
    if SDL_MustLock(surf) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   308
        SDL_UnlockSurface(surf);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   309
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   310
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   311
procedure Repack(var info: AtlasInfo; newAtlas: Atlas; newSprite: PTexture; surf: PSDL_Surface);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   312
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   313
    base: PByte;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   314
    oldSize: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   315
    oldWidth: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   316
    offset: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   317
    i,j : Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   318
    r: Rectangle;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   319
    sp: PTexture;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   320
    newIsRotated: boolean;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   321
    newSpriteRect: Rectangle;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   322
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   323
    writeln('Repacking atlas (', info.PackerInfo.width, 'x', info.PackerInfo.height, ')', ' -> (', newAtlas.width, 'x', newAtlas.height, ')');
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   324
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   325
    // delete the old atlas
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   326
    glDeleteTextures(1, @info.TextureInfo.id);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   327
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   328
    // create a new atlas with different size
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   329
    info.TextureInfo:= createTexture(newAtlas.width, newAtlas.height);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   330
    glBindTexture(GL_TEXTURE_2D, info.TextureInfo.id);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   331
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   332
    atlasDelete(info.PackerInfo);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   333
    info.PackerInfo:= newAtlas;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   334
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   335
    // and process all sprites of the new atlas
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   336
    for i:=0 to pred(newAtlas.usedRectangles.count) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   337
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   338
        r:= newAtlas.usedRectangles.data[i];
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   339
        sp:= PTexture(r.UserData);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   340
        Upload(info, r, sp^.surface);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   341
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   342
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   343
    glBindTexture(GL_TEXTURE_2D, 0);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   344
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   345
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   346
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   347
////////////////////////////////////////////////////////////////////////////////
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   348
// Utility functions
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   349
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   350
function SizeForSprite(sprite: PTexture): Size;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   351
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   352
    SizeForSprite.width:= sprite^.w;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   353
    SizeForSprite.height:= sprite^.h;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   354
    SizeForSprite.UserData:= sprite;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   355
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   356
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   357
procedure EnlargeSize(var x: Integer; var y: Integer);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   358
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   359
    if (y < x) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   360
        y:= y + y
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   361
    else
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   362
        x:= x + x;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   363
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   364
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   365
procedure CompactSize(var x: Integer; var y: Integer);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   366
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   367
    if (x > y) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   368
        x:= x div 2
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   369
    else
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   370
        y:= y div 2;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   371
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   372
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   373
////////////////////////////////////////////////////////////////////////////////
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   374
// Sprite allocation logic
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   375
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   376
function TryRepack(var info: AtlasInfo; w, h: Integer; hasNewSprite: boolean; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   377
                   newSprite: Size; surf: PSDL_Surface): boolean;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   378
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   379
    sizes: SizeList;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   380
    repackedAtlas: Atlas;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   381
    sprite: PTexture;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   382
    i: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   383
    rects: RectangleList; // we wont really need this as we do a full repack using the atlas later on
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   384
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   385
    TryRepack:= false;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   386
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   387
    // STEP 1: collect sizes of all existing sprites
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   388
    sizeListInit(sizes);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   389
    for i:= 0 to pred(info.PackerInfo.usedRectangles.count) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   390
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   391
        sprite:= PTexture(info.PackerInfo.usedRectangles.data[i].UserData);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   392
        sizeListAdd(sizes, SizeForSprite(sprite));
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   393
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   394
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   395
    // STEP 2: add the new sprite to the list
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   396
    if hasNewSprite then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   397
        sizeListAdd(sizes, newSprite);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   398
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   399
    // STEP 3: try to create a non adaptive re-packing using the whole list
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   400
    repackedAtlas:= atlasNew(w, h);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   401
    rectangleListInit(rects);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   402
    if atlasInsertSet(repackedAtlas, sizes, rects) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   403
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   404
        TryRepack:= true;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   405
        if hasNewSprite then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   406
            sprite:= PTexture(newSprite.UserData)
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   407
        else
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   408
            sprite:= nil;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   409
        Repack(info, repackedAtlas, sprite, surf);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   410
        // repack assigns repackedAtlas to the current info and deletes the old one
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   411
        // thus we wont do atlasDelete(repackedAtlas); here 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   412
        rectangleListClear(rects);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   413
        sizeListClear(sizes);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   414
        DumpAtlas(info);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   415
        exit;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   416
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   417
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   418
    rectangleListClear(rects);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   419
    sizeListClear(sizes);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   420
    atlasDelete(repackedAtlas);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   421
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   422
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   423
function TryInsert(var info: AtlasInfo; newSprite: Size; surf: PSDL_Surface): boolean;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   424
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   425
    rect: Rectangle;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   426
    sprite: PTexture;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   427
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   428
    TryInsert:= false;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   429
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   430
    if atlasInsertAdaptive(info.PackerInfo, newSprite, rect) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   431
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   432
        // we succeeded adaptivley allocating the sprite to the i'th atlas.
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   433
        Upload(info, rect, surf);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   434
        DumpAtlas(info);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   435
        TryInsert:= true;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   436
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   437
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   438
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   439
function Surface2Tex_(surf: PSDL_Surface; enableClamp: boolean): PTexture;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   440
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   441
    sz: Size;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   442
    sprite: PTexture;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   443
    currentWidth, currentHeight: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   444
    i: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   445
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   446
    if (surf^.w > MaxTexSize) or (surf^.h > MaxTexSize) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   447
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   448
        // we could at best downscale the sprite, abort for now
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   449
        writeln('Sprite size larger than maximum texture size');
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   450
        halt(-1);        
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   451
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   452
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   453
    // allocate the sprite
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   454
    new(sprite);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   455
    Surface2Tex_:= sprite;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   456
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   457
    sprite^.w:= surf^.w;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   458
    sprite^.h:= surf^.h;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   459
    sprite^.x:= 0;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   460
    sprite^.y:= 0;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   461
    sprite^.isRotated:= false;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   462
    sprite^.surface:= surf;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   463
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   464
    sz:= SizeForSprite(sprite);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   465
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   466
    // STEP 1
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   467
    // try to allocate the new sprite in one of the existing atlases
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   468
    for i:= 0 to pred(MaxAtlases) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   469
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   470
        if not Info[i].Allocated then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   471
            continue;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   472
        if TryInsert(Info[i], sz, surf) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   473
            exit; 
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   474
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   475
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   476
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   477
    // STEP 2
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   478
    // none of the atlases has space left for the allocation, try a garbage collection
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   479
    for i:= 0 to pred(MaxAtlases) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   480
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   481
        if not Info[i].Allocated then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   482
            continue;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   483
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   484
        if TryRepack(Info[i], Info[i].PackerInfo.width, Info[i].PackerInfo.height, true, sz, surf) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   485
            exit;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   486
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   487
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   488
    // STEP 3
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   489
    // none of the atlases could be repacked in a way to fit the new sprite, try enlarging
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   490
    for i:= 0 to pred(MaxAtlases) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   491
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   492
        if not Info[i].Allocated then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   493
            continue;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   494
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   495
        currentWidth:= Info[i].PackerInfo.width;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   496
        currentHeight:= Info[i].PackerInfo.height;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   497
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   498
        EnlargeSize(currentWidth, currentHeight);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   499
        while (currentWidth <= MaxTexSize) and (currentHeight <= MaxTexSize) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   500
        begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   501
            if TryRepack(Info[i], currentWidth, currentHeight, true, sz, surf) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   502
                exit;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   503
            EnlargeSize(currentWidth, currentHeight);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   504
        end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   505
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   506
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   507
    // STEP 4
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   508
    // none of the existing atlases could be resized, try to allocate a new atlas
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   509
    for i:= 0 to pred(MaxAtlases) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   510
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   511
        if Info[i].Allocated then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   512
            continue;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   513
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   514
        currentWidth:= MinTexSize;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   515
        currentHeight:= MinTexSize;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   516
        while (sz.width > currentWidth) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   517
            currentWidth:= currentWidth + currentWidth;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   518
        while (sz.height > currentHeight) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   519
            currentHeight:= currentHeight + currentHeight;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   520
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   521
        with Info[i] do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   522
        begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   523
            PackerInfo:= atlasNew(currentWidth, currentHeight);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   524
            TextureInfo:= createTexture(currentWidth, currentHeight);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   525
            Allocated:= true;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   526
        end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   527
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   528
        if TryInsert(Info[i], sz, surf) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   529
            exit;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   530
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   531
        // this shouldnt have happened, the rectpacker should be able to fit the sprite
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   532
        // into an unused rectangle that is the same size or larger than the requested sprite.
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   533
        writeln('Internal error: atlas allocation failed');
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   534
        halt(-1);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   535
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   536
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   537
    // we reached the upperbound of resources we are willing to allocate
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   538
    writeln('Exhausted maximum sprite allocation size');
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   539
    halt(-1);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   540
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   541
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   542
////////////////////////////////////////////////////////////////////////////////
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   543
// Sprite deallocation logic
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   544
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   545
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   546
procedure FreeTexture_(sprite: PTexture);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   547
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   548
    i, j, deleteAt: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   549
    usedArea: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   550
    totalArea: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   551
    r: Rectangle;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   552
    atlasW, atlasH: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   553
    unused: Size;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   554
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   555
    if sprite = nil then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   556
        exit;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   557
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   558
    for i:= 0 to pred(MaxAtlases) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   559
    begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   560
        if sprite^.atlas <> @Info[i].TextureInfo then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   561
            continue;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   562
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   563
        usedArea:= 0;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   564
        for j:=0 to pred(Info[i].PackerInfo.usedRectangles.count) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   565
        begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   566
            r:= Info[i].PackerInfo.usedRectangles.data[j];
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   567
            if r.UserData = sprite then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   568
                deleteAt:= j
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   569
            else
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   570
                inc(usedArea, r.width * r.height);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   571
        end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   572
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   573
        rectangleListRemoveAt(Info[i].PackerInfo.usedRectangles, j);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   574
        dispose(sprite);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   575
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   576
        while true do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   577
        begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   578
            atlasW:= Info[i].PackerInfo.width;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   579
            atlasH:= Info[i].PackerInfo.height;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   580
            totalArea:=  atlasW * atlasH;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   581
            if usedArea >= totalArea * CompressionThreshold then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   582
                exit;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   583
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   584
            if (atlasW = MinTexSize) and (atlasH = MinTexSize) then
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   585
                exit; // we could try to move everything from this to another atlas here
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   586
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   587
            CompactSize(atlasW, atlasH);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   588
            unused:= unused;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   589
            TryRepack(Info[i], atlasW, atlasH, false, unused, nil);
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   590
        end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   591
    end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   592
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   593
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   594
procedure initModule;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   595
var
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   596
    i: Integer;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   597
begin
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   598
    DumpID:=0;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   599
    for i:= 0 to pred(MaxAtlases) do
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   600
        Info[i].Allocated:= false;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   601
end;
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   602
18430abfbcd2 added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff changeset
   603
end.