author | Wolfgang Steffens <WolfgangSteff@gmail.com> |
Tue, 10 Jul 2012 11:08:35 +0200 | |
changeset 7304 | 8b3575750cd2 |
parent 7301 | bea42438a2ec |
child 7377 | 1aceade403ba |
permissions | -rw-r--r-- |
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); |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
14 |
procedure DebugAtlas; |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
15 |
procedure DumpInfo(tex: PTexture); |
7292
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 |
implementation |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
18 |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
19 |
uses GLunit, uBinPacker, uDebug, png, sysutils, uTextures; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
20 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
21 |
const |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
22 |
MaxAtlases = 4; // Maximum number of atlases (textures) to allocate |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
23 |
MaxTexSize = 1024; // Maximum atlas size in pixels |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
24 |
MinTexSize = 128; // Minimum atlas size in pixels |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
25 |
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
|
26 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
27 |
type |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
28 |
AtlasInfo = record |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
29 |
PackerInfo: Atlas; // Rectangle packer context |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
30 |
TextureInfo: TAtlas; // OpenGL texture information |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
31 |
Allocated: boolean; // indicates if this atlas is in use |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
32 |
DumpID: Integer; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
33 |
end; |
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 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
36 |
Info: array[0..MaxAtlases-1] of AtlasInfo; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
37 |
|
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 |
//////////////////////////////////////////////////////////////////////////////// |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
40 |
// Debug routines |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
41 |
|
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
42 |
procedure DumpInfo(tex: PTexture); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
43 |
var |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
44 |
frame: Integer; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
45 |
i, atlasID: Integer; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
46 |
aw, ah: Integer; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
47 |
begin |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
48 |
if tex = nil then |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
49 |
exit; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
50 |
|
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
51 |
frame:= 0; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
52 |
writeln(stdout, 'Texture: ' + IntToHex(Integer(tex), 8)); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
53 |
|
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
54 |
while tex <> nil do |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
55 |
begin |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
56 |
atlasID:= -1; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
57 |
for i:= 0 to Pred(MaxAtlases) do |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
58 |
if tex^.atlas = @Info[i].TextureInfo then |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
59 |
atlasID:=i; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
60 |
|
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
61 |
aw:= tex^.atlas^.w; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
62 |
ah:= tex^.atlas^.h; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
63 |
|
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
64 |
writeln(stdout, 'Frame : ' + IntToStr(frame)); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
65 |
writeln(stdout, 'Size : ' + IntToStr(tex^.w) + 'x' + IntToStr(tex^.h)); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
66 |
writeln(stdout, 'Atlas : ' + IntToStr(atlasID)); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
67 |
writeln(stdout, 'Location: ' + IntToStr(tex^.x) + 'x' + IntToStr(tex^.y)); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
68 |
writeln(stdout, 'TB : ' + '(' + FloatToStrF(tex^.tb[0].X, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[0].Y, ffFixed, 15, 4) + ') ' |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
69 |
+ '(' + FloatToStrF(tex^.tb[1].X, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[1].Y, ffFixed, 15, 4) + ') ' |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
70 |
+ '(' + FloatToStrF(tex^.tb[2].X, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[2].Y, ffFixed, 15, 4) + ') ' |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
71 |
+ '(' + FloatToStrF(tex^.tb[3].X, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[3].Y, ffFixed, 15, 4) + ')'); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
72 |
|
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
73 |
writeln(stdout, 'TB.ABS : ' + '(' + FloatToStrF(tex^.tb[0].X * aw, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[0].Y * ah, ffFixed, 15, 4) + ') ' |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
74 |
+ '(' + FloatToStrF(tex^.tb[1].X * aw, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[1].Y * ah, ffFixed, 15, 4) + ') ' |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
75 |
+ '(' + FloatToStrF(tex^.tb[2].X * aw, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[2].Y * ah, ffFixed, 15, 4) + ') ' |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
76 |
+ '(' + FloatToStrF(tex^.tb[3].X * aw, ffFixed, 15, 4) + ',' + FloatToStrF(tex^.tb[3].Y * ah, ffFixed, 15, 4) + ')'); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
77 |
|
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
78 |
inc(frame); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
79 |
tex:= tex^.nextFrame; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
80 |
end; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
81 |
halt(0); |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
82 |
end; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
83 |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
84 |
procedure AssertCount(tex: PTexture; count: Integer); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
85 |
var |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
86 |
i, j: Integer; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
87 |
found: Integer; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
88 |
begin |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
89 |
found:= 0; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
90 |
for i:= 0 to pred(MaxAtlases) do |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
91 |
begin |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
92 |
if not Info[i].Allocated then |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
93 |
continue; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
94 |
for j:=0 to pred(Info[i].PackerInfo.usedRectangles.count) do |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
95 |
begin |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
96 |
if Info[i].PackerInfo.usedRectangles.data[j].UserData = tex then |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
97 |
inc(found); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
98 |
end; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
99 |
end; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
100 |
if found <> count then |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
101 |
begin |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
102 |
writeln('AssertCount(', IntToHex(Integer(tex), 8), ') failed, found ', found, ' times'); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
103 |
|
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
104 |
for i:= 0 to pred(MaxAtlases) do |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
105 |
begin |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
106 |
if not Info[i].Allocated then |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
107 |
continue; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
108 |
for j:=0 to pred(Info[i].PackerInfo.usedRectangles.count) do |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
109 |
begin |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
110 |
if Info[i].PackerInfo.usedRectangles.data[j].UserData = tex then |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
111 |
writeln(' found in atlas ', i, ' at slot ', j); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
112 |
end; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
113 |
end; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
114 |
halt(-2); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
115 |
end; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
116 |
end; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
117 |
|
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
118 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
119 |
DumpFile: File of byte; |
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 |
const |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
122 |
PNG_COLOR_TYPE_RGBA = 6; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
123 |
PNG_COLOR_TYPE_RGB = 2; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
124 |
PNG_INTERLACE_NONE = 0; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
125 |
PNG_COMPRESSION_TYPE_DEFAULT = 0; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
126 |
PNG_FILTER_TYPE_DEFAULT = 0; |
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 |
|
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 |
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
|
131 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
132 |
p: Pbyte; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
133 |
i: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
134 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
135 |
//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
|
136 |
BlockWrite(DumpFile, buffer^, size); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
137 |
{ p:= PByte(buffer^); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
138 |
for i:=0 to pred(size) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
139 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
140 |
Write(DumpFile, p^); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
141 |
inc(p); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
142 |
end;} |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
143 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
144 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
145 |
function IntToStrPad(i: Integer): string; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
146 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
147 |
s: string; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
148 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
149 |
s:= IntToStr(i); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
150 |
if (i < 10) then s:='0' + s; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
151 |
if (i < 100) then s:='0' + s; |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
152 |
if (i < 1000) then s:='0' + s; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
153 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
154 |
IntToStrPad:=s; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
155 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
156 |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
157 |
// GL1 ATLAS DEBUG ONLY CODE! |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
158 |
procedure DebugAtlas; |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
159 |
{$IFDEF DEBUG_ATLAS} |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
160 |
var |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
161 |
vp: array[0..3] of GLint; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
162 |
prog: GLint; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
163 |
i: Integer; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
164 |
x, y: Integer; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
165 |
const |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
166 |
SZ = 512; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
167 |
begin |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
168 |
x:= 0; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
169 |
y:= 0; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
170 |
for i:= 0 to pred(MaxAtlases) do |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
171 |
begin |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
172 |
if not Info[i].allocated then |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
173 |
continue; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
174 |
glGetIntegerv(GL_VIEWPORT, @vp); |
7301 | 175 |
{$IFDEF GL2} |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
176 |
glGetIntegerv(GL_CURRENT_PROGRAM, @prog); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
177 |
glUseProgram(0); |
7301 | 178 |
{$ENDIF} |
179 |
glPushMatrix; |
|
180 |
glLoadIdentity; |
|
181 |
glMatrixMode(GL_PROJECTION); |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
182 |
glPushMatrix; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
183 |
glLoadIdentity; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
184 |
glOrtho(0, vp[2], vp[3], 0, -1, 1); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
185 |
|
7301 | 186 |
glDisable(GL_CULL_FACE); |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
187 |
|
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
188 |
glBindTexture(GL_TEXTURE_2D, Info[i].TextureInfo.id); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
189 |
glBegin(GL_QUADS); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
190 |
glTexCoord2f(0.0, 0.0); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
191 |
glVertex2i(x * SZ, y * SZ); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
192 |
glTexCoord2f(1.0, 0.0); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
193 |
glVertex2i((x + 1) * SZ, y * SZ); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
194 |
glTexCoord2f(1.0, 1.0); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
195 |
glVertex2i((x + 1) * SZ, (y + 1) * SZ); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
196 |
glTexCoord2f(0.0, 1.0); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
197 |
glVertex2i(x * SZ, (y + 1) * SZ); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
198 |
glEnd(); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
199 |
|
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
200 |
glPopMatrix; |
7301 | 201 |
glMatrixMode(GL_MODELVIEW); |
202 |
glPopMatrix; |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
203 |
|
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
204 |
inc(x); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
205 |
if (x = 2) then |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
206 |
begin |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
207 |
x:=0; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
208 |
inc(y); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
209 |
end; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
210 |
|
7301 | 211 |
{$IFDEF GL2} |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
212 |
glUseProgram(prog); |
7301 | 213 |
{$ENDIF} |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
214 |
end; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
215 |
end; |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
216 |
{$ELSE} |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
217 |
begin; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
218 |
end; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
219 |
{$ENDIF} |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
220 |
|
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
221 |
procedure DumpAtlas(var dinfo: AtlasInfo); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
222 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
223 |
png: png_structp; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
224 |
png_info: png_infop; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
225 |
w, h, sz: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
226 |
filename: string; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
227 |
rows: array of png_bytep; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
228 |
size: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
229 |
i, j: Integer; |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
230 |
idx: Integer; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
231 |
mem, p, pp: PByte; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
232 |
begin |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
233 |
idx:= -1; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
234 |
for i:= 0 to Pred(MaxAtlases) do |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
235 |
if @dinfo = @Info[i] then |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
236 |
idx:=i; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
237 |
|
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
238 |
filename:= '/home/wolfgangst/hedgewars/dump/atlas_' + IntToStr(idx) + '_' + IntToStrPad(dinfo.DumpID) + '.png'; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
239 |
Assign(DumpFile, filename); |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
240 |
inc(dinfo.DumpID); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
241 |
Rewrite(DumpFile); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
242 |
|
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
243 |
w:= dinfo.TextureInfo.w; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
244 |
h:= dinfo.TextureInfo.h; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
245 |
size:= w * h * 4; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
246 |
SetLength(rows, h); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
247 |
GetMem(mem, size); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
248 |
|
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
249 |
glBindTexture(GL_TEXTURE_2D, dinfo.TextureInfo.id); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
250 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
251 |
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
|
252 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
253 |
p:= mem; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
254 |
for i:= 0 to pred(h) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
255 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
256 |
rows[i]:= p; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
257 |
pp:= p; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
258 |
inc(pp, 3); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
259 |
{for j:= 0 to pred(w) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
260 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
261 |
pp^:=255; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
262 |
inc(pp, 4); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
263 |
end;} |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
264 |
inc(p, w * 4); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
265 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
266 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
267 |
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
|
268 |
png_info := png_create_info_struct(png); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
269 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
270 |
png_set_write_fn(png, nil, @writefunc, nil); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
271 |
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
|
272 |
png_write_info(png, png_info); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
273 |
png_write_image(png, @rows[0]); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
274 |
png_write_end(png, png_info); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
275 |
png_destroy_write_struct(@png, @png_info); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
276 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
277 |
FreeMem(mem); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
278 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
279 |
SetLength(rows, 0); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
280 |
Close(DumpFile); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
281 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
282 |
//if (DumpID >= 30) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
283 |
// halt(0); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
284 |
end; |
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 |
//////////////////////////////////////////////////////////////////////////////// |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
287 |
// Upload routines |
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 |
function createTexture(width, height: Integer): TAtlas; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
290 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
291 |
nullTex: Pointer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
292 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
293 |
createTexture.w:= width; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
294 |
createTexture.h:= height; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
295 |
createTexture.priority:= 0; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
296 |
glGenTextures(1, @createTexture.id); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
297 |
glBindTexture(GL_TEXTURE_2D, createTexture.id); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
298 |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
299 |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
300 |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
301 |
|
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
302 |
//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
|
303 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
304 |
GetMem(NullTex, width * height * 4); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
305 |
FillChar(NullTex^, width * height * 4, 0); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
306 |
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
|
307 |
FreeMem(NullTex); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
308 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
309 |
glBindTexture(GL_TEXTURE_2D, 0); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
310 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
311 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
312 |
function Min(x, y: Single): Single; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
313 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
314 |
if x < y then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
315 |
Min:=x |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
316 |
else Min:=y; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
317 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
318 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
319 |
function Max(x, y: Single): Single; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
320 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
321 |
if x > y then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
322 |
Max:=x |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
323 |
else Max:=y; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
324 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
325 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
326 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
327 |
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
|
328 |
const |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
329 |
SectionSize = 60/360; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
330 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
331 |
Section: Single; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
332 |
SectionIndex: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
333 |
f: single; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
334 |
p, q, t: Single; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
335 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
336 |
if H < 0 then |
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:= V; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
339 |
G:= R; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
340 |
B:= R; |
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 |
else |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
343 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
344 |
Section:= H/SectionSize; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
345 |
SectionIndex:= Trunc(Section); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
346 |
f:= Section - SectionIndex; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
347 |
p:= V * ( 1 - S ); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
348 |
q:= V * ( 1 - S * f ); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
349 |
t:= V * ( 1 - S * ( 1 - f ) ); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
350 |
case SectionIndex of |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
351 |
0: |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
352 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
353 |
R:= V; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
354 |
G:= t; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
355 |
B:= p; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
356 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
357 |
1: |
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 |
R:= q; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
360 |
G:= V; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
361 |
B:= p; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
362 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
363 |
2: |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
364 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
365 |
R:= p; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
366 |
G:= V; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
367 |
B:= t; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
368 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
369 |
3: |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
370 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
371 |
R:= p; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
372 |
G:= q; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
373 |
B:= V; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
374 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
375 |
4: |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
376 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
377 |
R:= t; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
378 |
G:= p; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
379 |
B:= V; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
380 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
381 |
else |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
382 |
R:= V; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
383 |
G:= p; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
384 |
B:= q; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
385 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
386 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
387 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
388 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
389 |
procedure DebugColorize(surf: PSDL_Surface); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
390 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
391 |
sz: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
392 |
p: PByte; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
393 |
i: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
394 |
r, g, b, a, inva: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
395 |
randr, randg, randb: Single; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
396 |
randh: Single; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
397 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
398 |
sz:= surf^.w * surf^.h; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
399 |
p:= surf^.pixels; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
400 |
//randr:=Random; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
401 |
//randg:=Random; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
402 |
//randb:=1 - min(randr, randg); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
403 |
randh:=Random; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
404 |
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
|
405 |
for i:=0 to pred(sz) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
406 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
407 |
a:= p[3]; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
408 |
inva:= 255 - a; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
409 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
410 |
r:=Trunc(inva*randr + p[0]*a/255); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
411 |
g:=Trunc(inva*randg + p[1]*a/255); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
412 |
b:=Trunc(inva*randb + p[2]*a/255); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
413 |
if r > 255 then r:= 255; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
414 |
if g > 255 then g:= 255; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
415 |
if b > 255 then b:= 255; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
416 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
417 |
p[0]:=r; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
418 |
p[1]:=g; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
419 |
p[2]:=b; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
420 |
p[3]:=255; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
421 |
inc(p, 4); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
422 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
423 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
424 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
425 |
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
|
426 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
427 |
sp: PTexture; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
428 |
i, j, stride: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
429 |
scanline: PByte; |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
430 |
r: TSDL_Rect; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
431 |
begin |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
432 |
//writeln('Uploading sprite to ', sprite.x, ',', sprite.y, ',', sprite.width, ',', sprite.height); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
433 |
sp:= PTexture(sprite.UserData); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
434 |
sp^.x:= sprite.x; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
435 |
sp^.y:= sprite.y; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
436 |
sp^.isRotated:= sp^.w <> sprite.width; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
437 |
sp^.atlas:= @info.TextureInfo; |
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 |
if SDL_MustLock(surf) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
440 |
SDLTry(SDL_LockSurface(surf) >= 0, true); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
441 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
442 |
//if GrayScale then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
443 |
// Surface2GrayScale(surf); |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
444 |
//DebugColorize(surf); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
445 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
446 |
glBindTexture(GL_TEXTURE_2D, info.TextureInfo.id); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
447 |
if (sp^.isRotated) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
448 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
449 |
scanline:= surf^.pixels; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
450 |
for i:= 0 to pred(sprite.width) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
451 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
452 |
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
|
453 |
inc(scanline, sprite.height * 4); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
454 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
455 |
end |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
456 |
else |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
457 |
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
|
458 |
glBindTexture(GL_TEXTURE_2D, 0); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
459 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
460 |
if SDL_MustLock(surf) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
461 |
SDL_UnlockSurface(surf); |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
462 |
|
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
463 |
r.x:= 0; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
464 |
r.y:= 0; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
465 |
r.w:= sp^.w; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
466 |
r.h:= sp^.h; |
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
467 |
ComputeTexcoords(sp, @r, @sp^.tb); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
468 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
469 |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
470 |
procedure Repack(var info: AtlasInfo; newAtlas: Atlas); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
471 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
472 |
base: PByte; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
473 |
oldSize: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
474 |
oldWidth: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
475 |
offset: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
476 |
i,j : Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
477 |
r: Rectangle; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
478 |
sp: PTexture; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
479 |
newIsRotated: boolean; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
480 |
newSpriteRect: Rectangle; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
481 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
482 |
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
|
483 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
484 |
// delete the old atlas |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
485 |
glDeleteTextures(1, @info.TextureInfo.id); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
486 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
487 |
// create a new atlas with different size |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
488 |
info.TextureInfo:= createTexture(newAtlas.width, newAtlas.height); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
489 |
glBindTexture(GL_TEXTURE_2D, info.TextureInfo.id); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
490 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
491 |
atlasDelete(info.PackerInfo); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
492 |
info.PackerInfo:= newAtlas; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
493 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
494 |
// and process all sprites of the new atlas |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
495 |
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
|
496 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
497 |
r:= newAtlas.usedRectangles.data[i]; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
498 |
sp:= PTexture(r.UserData); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
499 |
Upload(info, r, sp^.surface); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
500 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
501 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
502 |
glBindTexture(GL_TEXTURE_2D, 0); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
503 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
504 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
505 |
|
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 |
// Utility functions |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
508 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
509 |
function SizeForSprite(sprite: PTexture): Size; |
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 |
SizeForSprite.width:= sprite^.w; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
512 |
SizeForSprite.height:= sprite^.h; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
513 |
SizeForSprite.UserData:= sprite; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
514 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
515 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
516 |
procedure EnlargeSize(var x: Integer; var y: Integer); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
517 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
518 |
if (y < x) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
519 |
y:= y + y |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
520 |
else |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
521 |
x:= x + x; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
522 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
523 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
524 |
procedure CompactSize(var x: Integer; var y: Integer); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
525 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
526 |
if (x > y) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
527 |
x:= x div 2 |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
528 |
else |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
529 |
y:= y div 2; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
530 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
531 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
532 |
//////////////////////////////////////////////////////////////////////////////// |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
533 |
// Sprite allocation logic |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
534 |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
535 |
function TryRepack(var info: AtlasInfo; w, h: Integer; hasNewSprite: boolean; newSprite: Size): boolean; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
536 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
537 |
sizes: SizeList; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
538 |
repackedAtlas: Atlas; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
539 |
sprite: PTexture; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
540 |
i: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
541 |
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
|
542 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
543 |
TryRepack:= false; |
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 |
// STEP 1: collect sizes of all existing sprites |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
546 |
sizeListInit(sizes); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
547 |
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
|
548 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
549 |
sprite:= PTexture(info.PackerInfo.usedRectangles.data[i].UserData); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
550 |
sizeListAdd(sizes, SizeForSprite(sprite)); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
551 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
552 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
553 |
// 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
|
554 |
if hasNewSprite then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
555 |
sizeListAdd(sizes, newSprite); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
556 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
557 |
// 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
|
558 |
repackedAtlas:= atlasNew(w, h); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
559 |
rectangleListInit(rects); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
560 |
if atlasInsertSet(repackedAtlas, sizes, rects) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
561 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
562 |
TryRepack:= true; |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
563 |
Repack(info, repackedAtlas); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
564 |
// 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
|
565 |
// thus we wont do atlasDelete(repackedAtlas); here |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
566 |
rectangleListClear(rects); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
567 |
sizeListClear(sizes); |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
568 |
//DumpAtlas(info); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
569 |
exit; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
570 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
571 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
572 |
rectangleListClear(rects); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
573 |
sizeListClear(sizes); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
574 |
atlasDelete(repackedAtlas); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
575 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
576 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
577 |
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
|
578 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
579 |
rect: Rectangle; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
580 |
sprite: PTexture; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
581 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
582 |
TryInsert:= false; |
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 atlasInsertAdaptive(info.PackerInfo, newSprite, rect) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
585 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
586 |
// 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
|
587 |
Upload(info, rect, surf); |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
588 |
//DumpAtlas(info); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
589 |
TryInsert:= true; |
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 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
593 |
function Surface2Tex_(surf: PSDL_Surface; enableClamp: boolean): PTexture; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
594 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
595 |
sz: Size; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
596 |
sprite: PTexture; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
597 |
currentWidth, currentHeight: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
598 |
i: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
599 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
600 |
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
|
601 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
602 |
// 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
|
603 |
writeln('Sprite size larger than maximum texture size'); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
604 |
halt(-1); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
605 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
606 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
607 |
// allocate the sprite |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
608 |
new(sprite); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
609 |
Surface2Tex_:= sprite; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
610 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
611 |
sprite^.w:= surf^.w; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
612 |
sprite^.h:= surf^.h; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
613 |
sprite^.x:= 0; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
614 |
sprite^.y:= 0; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
615 |
sprite^.isRotated:= false; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
616 |
sprite^.surface:= surf; |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
617 |
sprite^.shared:= true; |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
618 |
sprite^.nextFrame:= nil; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
619 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
620 |
sz:= SizeForSprite(sprite); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
621 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
622 |
// STEP 1 |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
623 |
// 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
|
624 |
for i:= 0 to pred(MaxAtlases) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
625 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
626 |
if not Info[i].Allocated then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
627 |
continue; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
628 |
if TryInsert(Info[i], sz, surf) then |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
629 |
exit; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
630 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
631 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
632 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
633 |
// STEP 2 |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
634 |
// 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
|
635 |
for i:= 0 to pred(MaxAtlases) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
636 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
637 |
if not Info[i].Allocated then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
638 |
continue; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
639 |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
640 |
if TryRepack(Info[i], Info[i].PackerInfo.width, Info[i].PackerInfo.height, true, sz) then |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
641 |
exit; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
642 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
643 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
644 |
// STEP 3 |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
645 |
// 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
|
646 |
for i:= 0 to pred(MaxAtlases) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
647 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
648 |
if not Info[i].Allocated then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
649 |
continue; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
650 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
651 |
currentWidth:= Info[i].PackerInfo.width; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
652 |
currentHeight:= Info[i].PackerInfo.height; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
653 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
654 |
EnlargeSize(currentWidth, currentHeight); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
655 |
while (currentWidth <= MaxTexSize) and (currentHeight <= MaxTexSize) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
656 |
begin |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
657 |
if TryRepack(Info[i], currentWidth, currentHeight, true, sz) then |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
658 |
exit; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
659 |
EnlargeSize(currentWidth, currentHeight); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
660 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
661 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
662 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
663 |
// STEP 4 |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
664 |
// 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
|
665 |
for i:= 0 to pred(MaxAtlases) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
666 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
667 |
if Info[i].Allocated then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
668 |
continue; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
669 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
670 |
currentWidth:= MinTexSize; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
671 |
currentHeight:= MinTexSize; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
672 |
while (sz.width > currentWidth) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
673 |
currentWidth:= currentWidth + currentWidth; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
674 |
while (sz.height > currentHeight) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
675 |
currentHeight:= currentHeight + currentHeight; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
676 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
677 |
with Info[i] do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
678 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
679 |
PackerInfo:= atlasNew(currentWidth, currentHeight); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
680 |
TextureInfo:= createTexture(currentWidth, currentHeight); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
681 |
Allocated:= true; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
682 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
683 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
684 |
if TryInsert(Info[i], sz, surf) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
685 |
exit; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
686 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
687 |
// 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
|
688 |
// 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
|
689 |
writeln('Internal error: atlas allocation failed'); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
690 |
halt(-1); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
691 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
692 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
693 |
// 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
|
694 |
writeln('Exhausted maximum sprite allocation size'); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
695 |
halt(-1); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
696 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
697 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
698 |
//////////////////////////////////////////////////////////////////////////////// |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
699 |
// Sprite deallocation logic |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
700 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
701 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
702 |
procedure FreeTexture_(sprite: PTexture); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
703 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
704 |
i, j, deleteAt: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
705 |
usedArea: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
706 |
totalArea: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
707 |
r: Rectangle; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
708 |
atlasW, atlasH: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
709 |
unused: Size; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
710 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
711 |
if sprite = nil then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
712 |
exit; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
713 |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
714 |
deleteAt:= -1; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
715 |
for i:= 0 to pred(MaxAtlases) do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
716 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
717 |
if sprite^.atlas <> @Info[i].TextureInfo then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
718 |
continue; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
719 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
720 |
usedArea:= 0; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
721 |
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
|
722 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
723 |
r:= Info[i].PackerInfo.usedRectangles.data[j]; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
724 |
if r.UserData = sprite then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
725 |
deleteAt:= j |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
726 |
else |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
727 |
inc(usedArea, r.width * r.height); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
728 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
729 |
|
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
730 |
rectangleListRemoveAt(Info[i].PackerInfo.usedRectangles, deleteAt); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
731 |
dispose(sprite); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
732 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
733 |
while true do |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
734 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
735 |
atlasW:= Info[i].PackerInfo.width; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
736 |
atlasH:= Info[i].PackerInfo.height; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
737 |
totalArea:= atlasW * atlasH; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
738 |
if usedArea >= totalArea * CompressionThreshold then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
739 |
exit; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
740 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
741 |
if (atlasW = MinTexSize) and (atlasH = MinTexSize) then |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
742 |
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
|
743 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
744 |
CompactSize(atlasW, atlasH); |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
745 |
unused:= unused; |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
746 |
TryRepack(Info[i], atlasW, atlasH, false, unused); |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
747 |
end; |
7297
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
748 |
|
af64b509725c
using atlas for rendering now
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7295
diff
changeset
|
749 |
exit; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
750 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
751 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
752 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
753 |
procedure initModule; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
754 |
var |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
755 |
i: Integer; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
756 |
begin |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
757 |
for i:= 0 to pred(MaxAtlases) do |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
758 |
begin |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
759 |
Info[i].Allocated:= false; |
7304
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
760 |
Info[i].DumpID:=0; |
8b3575750cd2
Added auto cropping to atlasing
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
7301
diff
changeset
|
761 |
end; |
7292
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
762 |
end; |
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
763 |
|
18430abfbcd2
added missing uBinPacker.pas and uAtlas.pas
Wolfgang Steffens <WolfgangSteff@gmail.com>
parents:
diff
changeset
|
764 |
end. |