author | unc0rr |
Sun, 01 Feb 2009 15:58:44 +0000 | |
changeset 1784 | dfe9bafb4590 |
parent 1779 | 9d88af62a3bb |
child 1792 | c30c6944bd49 |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
883 | 3 |
* Copyright (c) 2005-2008 Andrey Korotaev <unC0Rr@gmail.com> |
4 | 4 |
* |
183 | 5 |
* This program is free software; you can redistribute it and/or modify |
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
4 | 8 |
* |
183 | 9 |
* This program is distributed in the hope that it will be useful, |
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
4 | 13 |
* |
183 | 14 |
* You should have received a copy of the GNU General Public License |
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
4 | 17 |
*) |
18 |
||
19 |
unit uLand; |
|
20 |
interface |
|
755 | 21 |
uses SDLh, uLandTemplates, uFloat, GL, uConsts; |
4 | 22 |
{$include options.inc} |
1760 | 23 |
type TLandArray = packed array[0 .. LAND_HEIGHT - 1, 0 .. LAND_WIDTH - 1] of LongWord; |
24 |
TPreview = packed array[0..127, 0..31] of byte; |
|
25 |
TDirtyTag = packed array[0 .. LAND_HEIGHT div 32 - 1, 0 .. LAND_WIDTH div 32 - 1] of byte; |
|
4 | 26 |
|
27 |
var Land: TLandArray; |
|
768 | 28 |
LandPixels: TLandArray; |
766 | 29 |
LandTexture: PTexture = nil; |
1738
00e8dadce69a
Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents:
1537
diff
changeset
|
30 |
LandDirty: TDirtyTag; |
1776 | 31 |
hasBorder: boolean; // I'm putting this here for now. I'd like it to be toggleable by user (so user can set a border on a non-cave map) - will turn off air attacks |
32 |
hasGirders: boolean; // I think should be on template by template basis. some caverns might have open water and large spaces. Some islands don't need? It might be better to tweak the girder code based upon space above. dunno. |
|
33 |
playHeight, playWidth, leftX, rightX, topY: Longword; // idea is that a template can specify height/width. Or, a map, a height/width by the dimensions of the image. If the map has pixels near top of image, it triggers border. Maybe not a good idea, but, for now? Could also be used to prevent placing a girder outside play area on maps with hasBorder = true |
|
34 |
||
35 |
// in your coding style, it appears to be "isXXXX" for a verb, and "FooBar" for everything else - should be PlayHeight ? |
|
4 | 36 |
|
37 | 37 |
procedure GenMap; |
766 | 38 |
function GenPreview: TPreview; |
367 | 39 |
procedure CheckLandDigest(s: shortstring); |
767
697728ffe39f
Introduce UpdateLandTexture function to update just parts of surface
unc0rr
parents:
766
diff
changeset
|
40 |
procedure UpdateLandTexture(Y, Height: LongInt); |
1779
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
41 |
procedure RealLandTexUpdate; |
4 | 42 |
|
43 |
implementation |
|
1784 | 44 |
uses uConsole, uStore, uMisc, uRandom, uTeams, uLandObjects, uSHA, uIO, uAmmos; |
4 | 45 |
|
46 |
type TPixAr = record |
|
47 |
Count: Longword; |
|
22 | 48 |
ar: array[0..Pred(cMaxEdgePoints)] of TPoint; |
4 | 49 |
end; |
50 |
||
1779
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
51 |
var updTopY: LongInt = LAND_HEIGHT; |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
52 |
updBottomY: LongInt = 0; |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
53 |
|
37 | 54 |
procedure LogLandDigest; |
316 | 55 |
var ctx: TSHA1Context; |
56 |
dig: TSHA1Digest; |
|
57 |
s: shortstring; |
|
37 | 58 |
begin |
316 | 59 |
SHA1Init(ctx); |
60 |
SHA1Update(ctx, @Land, sizeof(Land)); |
|
61 |
dig:= SHA1Final(ctx); |
|
367 | 62 |
s:='M{'+inttostr(dig[0])+':' |
316 | 63 |
+inttostr(dig[1])+':' |
64 |
+inttostr(dig[2])+':' |
|
65 |
+inttostr(dig[3])+':' |
|
66 |
+inttostr(dig[4])+'}'; |
|
699 | 67 |
CheckLandDigest(s); |
367 | 68 |
SendIPCRaw(@s[0], Length(s) + 1) |
69 |
end; |
|
70 |
||
71 |
procedure CheckLandDigest(s: shortstring); |
|
72 |
const digest: shortstring = ''; |
|
73 |
begin |
|
368 | 74 |
{$IFDEF DEBUGFILE} |
75 |
AddFileLog('CheckLandDigest: ' + s); |
|
76 |
{$ENDIF} |
|
367 | 77 |
if digest = '' then |
78 |
digest:= s |
|
79 |
else |
|
700 | 80 |
TryDo(s = digest, 'Different maps generated, sorry', true) |
37 | 81 |
end; |
82 |
||
371 | 83 |
procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword); |
358 | 84 |
var |
371 | 85 |
eX, eY, dX, dY: LongInt; |
86 |
i, sX, sY, x, y, d: LongInt; |
|
358 | 87 |
begin |
88 |
eX:= 0; |
|
89 |
eY:= 0; |
|
90 |
dX:= X2 - X1; |
|
91 |
dY:= Y2 - Y1; |
|
92 |
||
93 |
if (dX > 0) then sX:= 1 |
|
94 |
else |
|
95 |
if (dX < 0) then |
|
96 |
begin |
|
97 |
sX:= -1; |
|
98 |
dX:= -dX |
|
99 |
end else sX:= dX; |
|
100 |
||
101 |
if (dY > 0) then sY:= 1 |
|
102 |
else |
|
103 |
if (dY < 0) then |
|
104 |
begin |
|
105 |
sY:= -1; |
|
106 |
dY:= -dY |
|
107 |
end else sY:= dY; |
|
108 |
||
109 |
if (dX > dY) then d:= dX |
|
110 |
else d:= dY; |
|
111 |
||
112 |
x:= X1; |
|
113 |
y:= Y1; |
|
114 |
||
115 |
for i:= 0 to d do |
|
116 |
begin |
|
117 |
inc(eX, dX); |
|
118 |
inc(eY, dY); |
|
119 |
if (eX > d) then |
|
120 |
begin |
|
121 |
dec(eX, d); |
|
122 |
inc(x, sX); |
|
123 |
end; |
|
124 |
if (eY > d) then |
|
125 |
begin |
|
126 |
dec(eY, d); |
|
127 |
inc(y, sY); |
|
128 |
end; |
|
364 | 129 |
|
1753 | 130 |
if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then |
358 | 131 |
Land[y, x]:= Color; |
132 |
end |
|
133 |
end; |
|
134 |
||
365 | 135 |
procedure DrawEdge(var pa: TPixAr; Color: Longword); |
371 | 136 |
var i: LongInt; |
4 | 137 |
begin |
365 | 138 |
i:= 0; |
4 | 139 |
with pa do |
371 | 140 |
while i < LongInt(Count) - 1 do |
365 | 141 |
if (ar[i + 1].X = NTPX) then inc(i, 2) |
142 |
else begin |
|
143 |
DrawLine(ar[i].x, ar[i].y, ar[i + 1].x, ar[i + 1].y, Color); |
|
144 |
inc(i) |
|
145 |
end |
|
22 | 146 |
end; |
147 |
||
365 | 148 |
procedure Vector(p1, p2, p3: TPoint; var Vx, Vy: hwFloat); |
149 |
var d1, d2, d: hwFloat; |
|
364 | 150 |
begin |
498 | 151 |
Vx:= int2hwFloat(p1.X - p3.X); |
152 |
Vy:= int2hwFloat(p1.Y - p3.Y); |
|
153 |
d:= DistanceI(p2.X - p1.X, p2.Y - p1.Y); |
|
154 |
d1:= DistanceI(p2.X - p3.X, p2.Y - p3.Y); |
|
365 | 155 |
d2:= Distance(Vx, Vy); |
156 |
if d1 < d then d:= d1; |
|
157 |
if d2 < d then d:= d2; |
|
158 |
d:= d * _1div3; |
|
159 |
if d2.QWordValue = 0 then |
|
160 |
begin |
|
498 | 161 |
Vx:= _0; |
162 |
Vy:= _0 |
|
365 | 163 |
end else |
164 |
begin |
|
498 | 165 |
d2:= _1 / d2; |
365 | 166 |
Vx:= Vx * d2; |
167 |
Vy:= Vy * d2; |
|
168 |
||
169 |
Vx:= Vx * d; |
|
170 |
Vy:= Vy * d |
|
171 |
end |
|
172 |
end; |
|
173 |
||
371 | 174 |
procedure AddLoopPoints(var pa, opa: TPixAr; StartI, EndI: LongInt; Delta: hwFloat); |
175 |
var i, pi, ni: LongInt; |
|
365 | 176 |
NVx, NVy, PVx, PVy: hwFloat; |
498 | 177 |
x1, x2, y1, y2: LongInt; |
178 |
tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat; |
|
371 | 179 |
X, Y: LongInt; |
365 | 180 |
begin |
181 |
pi:= EndI; |
|
182 |
i:= StartI; |
|
183 |
ni:= Succ(StartI); |
|
184 |
Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
|
185 |
repeat |
|
186 |
inc(pi); |
|
187 |
if pi > EndI then pi:= StartI; |
|
188 |
inc(i); |
|
189 |
if i > EndI then i:= StartI; |
|
190 |
inc(ni); |
|
191 |
if ni > EndI then ni:= StartI; |
|
192 |
PVx:= NVx; |
|
193 |
PVy:= NVy; |
|
194 |
Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
|
195 |
||
196 |
x1:= opa.ar[pi].x; |
|
197 |
y1:= opa.ar[pi].y; |
|
198 |
x2:= opa.ar[i].x; |
|
199 |
y2:= opa.ar[i].y; |
|
498 | 200 |
cx1:= int2hwFloat(x1) - PVx; |
201 |
cy1:= int2hwFloat(y1) - PVy; |
|
202 |
cx2:= int2hwFloat(x2) + NVx; |
|
203 |
cy2:= int2hwFloat(y2) + NVy; |
|
204 |
t:= _0; |
|
364 | 205 |
while t.Round = 0 do |
206 |
begin |
|
207 |
tsq:= t * t; |
|
208 |
tcb:= tsq * t; |
|
498 | 209 |
r1:= (_1 - t*3 + tsq*3 - tcb); |
210 |
r2:= ( t*3 - tsq*6 + tcb*3); |
|
211 |
r3:= ( tsq*3 - tcb*3); |
|
430 | 212 |
X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2); |
213 |
Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2); |
|
364 | 214 |
t:= t + Delta; |
215 |
pa.ar[pa.Count].x:= X; |
|
216 |
pa.ar[pa.Count].y:= Y; |
|
217 |
inc(pa.Count); |
|
218 |
TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true) |
|
219 |
end; |
|
365 | 220 |
until i = StartI; |
221 |
pa.ar[pa.Count].x:= opa.ar[StartI].X; |
|
222 |
pa.ar[pa.Count].y:= opa.ar[StartI].Y; |
|
364 | 223 |
inc(pa.Count) |
224 |
end; |
|
225 |
||
365 | 226 |
procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat); |
495 | 227 |
var i, StartLoop: LongInt; |
365 | 228 |
opa: TPixAr; |
229 |
begin |
|
230 |
opa:= pa; |
|
231 |
pa.Count:= 0; |
|
232 |
i:= 0; |
|
233 |
StartLoop:= 0; |
|
371 | 234 |
while i < LongInt(opa.Count) do |
365 | 235 |
if (opa.ar[i + 1].X = NTPX) then |
236 |
begin |
|
237 |
AddLoopPoints(pa, opa, StartLoop, i, Delta); |
|
238 |
inc(i, 2); |
|
239 |
StartLoop:= i; |
|
240 |
pa.ar[pa.Count].X:= NTPX; |
|
241 |
inc(pa.Count); |
|
242 |
end else inc(i) |
|
243 |
end; |
|
244 |
||
371 | 245 |
procedure FillLand(x, y: LongInt); |
4 | 246 |
var Stack: record |
247 |
Count: Longword; |
|
248 |
points: array[0..8192] of record |
|
371 | 249 |
xl, xr, y, dir: LongInt; |
4 | 250 |
end |
251 |
end; |
|
252 |
||
371 | 253 |
procedure Push(_xl, _xr, _y, _dir: LongInt); |
4 | 254 |
begin |
75 | 255 |
TryDo(Stack.Count <= 8192, 'FillLand: stack overflow', true); |
4 | 256 |
_y:= _y + _dir; |
1760 | 257 |
if (_y < 0) or (_y >= LAND_HEIGHT) then exit; |
4 | 258 |
with Stack.points[Stack.Count] do |
259 |
begin |
|
260 |
xl:= _xl; |
|
261 |
xr:= _xr; |
|
262 |
y:= _y; |
|
263 |
dir:= _dir |
|
264 |
end; |
|
75 | 265 |
inc(Stack.Count) |
4 | 266 |
end; |
267 |
||
371 | 268 |
procedure Pop(var _xl, _xr, _y, _dir: LongInt); |
4 | 269 |
begin |
270 |
dec(Stack.Count); |
|
271 |
with Stack.points[Stack.Count] do |
|
272 |
begin |
|
273 |
_xl:= xl; |
|
274 |
_xr:= xr; |
|
275 |
_y:= y; |
|
276 |
_dir:= dir |
|
277 |
end |
|
278 |
end; |
|
279 |
||
371 | 280 |
var xl, xr, dir: LongInt; |
351 | 281 |
begin |
4 | 282 |
Stack.Count:= 0; |
283 |
xl:= x - 1; |
|
284 |
xr:= x; |
|
23 | 285 |
Push(xl, xr, y, -1); |
286 |
Push(xl, xr, y, 1); |
|
4 | 287 |
while Stack.Count > 0 do |
288 |
begin |
|
289 |
Pop(xl, xr, y, dir); |
|
51 | 290 |
while (xl > 0) and (Land[y, xl] <> 0) do dec(xl); |
1760 | 291 |
while (xr < LAND_WIDTH - 1) and (Land[y, xr] <> 0) do inc(xr); |
4 | 292 |
while (xl < xr) do |
293 |
begin |
|
51 | 294 |
while (xl <= xr) and (Land[y, xl] = 0) do inc(xl); |
4 | 295 |
x:= xl; |
51 | 296 |
while (xl <= xr) and (Land[y, xl] <> 0) do |
4 | 297 |
begin |
51 | 298 |
Land[y, xl]:= 0; |
4 | 299 |
inc(xl) |
300 |
end; |
|
22 | 301 |
if x < xl then |
302 |
begin |
|
303 |
Push(x, Pred(xl), y, dir); |
|
304 |
Push(x, Pred(xl), y,-dir); |
|
305 |
end; |
|
4 | 306 |
end; |
307 |
end; |
|
308 |
end; |
|
309 |
||
310 |
procedure ColorizeLand(Surface: PSDL_Surface); |
|
311 |
var tmpsurf: PSDL_Surface; |
|
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
312 |
r, rr: TSDL_Rect; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
313 |
x, yd, yu: LongInt; |
4 | 314 |
begin |
567 | 315 |
tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/LandTex', false, true, false); |
4 | 316 |
r.y:= 0; |
1760 | 317 |
while r.y < LAND_HEIGHT do |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
318 |
begin |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
319 |
r.x:= 0; |
1760 | 320 |
while r.x < LAND_WIDTH do |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
321 |
begin |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
322 |
SDL_UpperBlit(tmpsurf, nil, Surface, @r); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
323 |
inc(r.x, tmpsurf^.w) |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
324 |
end; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
325 |
inc(r.y, tmpsurf^.h) |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
326 |
end; |
4 | 327 |
SDL_FreeSurface(tmpsurf); |
328 |
||
351 | 329 |
tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/Border', false, true, true); |
1760 | 330 |
for x:= 0 to LAND_WIDTH - 1 do |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
331 |
begin |
1760 | 332 |
yd:= LAND_HEIGHT - 1; |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
333 |
repeat |
1760 | 334 |
while (yd > 0) and (Land[yd, x] = 0) do dec(yd); |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
335 |
|
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
336 |
if (yd < 0) then yd:= 0; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
337 |
|
1760 | 338 |
while (yd < LAND_HEIGHT) and (Land[yd, x] <> 0) do inc(yd); |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
339 |
dec(yd); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
340 |
yu:= yd; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
341 |
|
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
342 |
while (yu > 0 ) and (Land[yu, x] <> 0) do dec(yu); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
343 |
while (yu < yd ) and (Land[yu, x] = 0) do inc(yu); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
344 |
|
1760 | 345 |
if (yd < LAND_HEIGHT - 1) and ((yd - yu) >= 16) then |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
346 |
begin |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
347 |
rr.x:= x; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
348 |
rr.y:= yd - 15; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
349 |
r.x:= x mod tmpsurf^.w; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
350 |
r.y:= 16; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
351 |
r.w:= 1; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
352 |
r.h:= 16; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
353 |
SDL_UpperBlit(tmpsurf, @r, Surface, @rr); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
354 |
end; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
355 |
if (yu > 0) then |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
356 |
begin |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
357 |
rr.x:= x; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
358 |
rr.y:= yu; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
359 |
r.x:= x mod tmpsurf^.w; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
360 |
r.y:= 0; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
361 |
r.w:= 1; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
362 |
r.h:= min(16, yd - yu + 1); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
363 |
SDL_UpperBlit(tmpsurf, @r, Surface, @rr); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
364 |
end; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
365 |
yd:= yu - 1; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
366 |
until yd < 0; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
367 |
end; |
4 | 368 |
end; |
369 |
||
358 | 370 |
procedure SetPoints(var Template: TEdgeTemplate; var pa: TPixAr); |
371 | 371 |
var i: LongInt; |
22 | 372 |
begin |
23 | 373 |
with Template do |
374 |
begin |
|
358 | 375 |
pa.Count:= BasePointsCount; |
376 |
for i:= 0 to pred(pa.Count) do |
|
23 | 377 |
begin |
371 | 378 |
pa.ar[i].x:= BasePoints^[i].x + LongInt(GetRandom(BasePoints^[i].w)); |
1776 | 379 |
pa.ar[i].y:= BasePoints^[i].y + LongInt(GetRandom(BasePoints^[i].h)) + LAND_HEIGHT - Template.TemplateHeight |
23 | 380 |
end; |
1183
540cea859395
Step 4: repair girder rendering (girder is 32bit now)
unc0rr
parents:
1182
diff
changeset
|
381 |
|
358 | 382 |
if canMirror then |
360 | 383 |
if getrandom(2) = 0 then |
358 | 384 |
begin |
385 |
for i:= 0 to pred(BasePointsCount) do |
|
365 | 386 |
if pa.ar[i].x <> NTPX then |
1760 | 387 |
pa.ar[i].x:= LAND_WIDTH - 1 - pa.ar[i].x; |
358 | 388 |
for i:= 0 to pred(FillPointsCount) do |
1760 | 389 |
FillPoints^[i].x:= LAND_WIDTH - 1 - FillPoints^[i].x; |
358 | 390 |
end; |
22 | 391 |
|
358 | 392 |
if canFlip then |
360 | 393 |
if getrandom(2) = 0 then |
358 | 394 |
begin |
395 |
for i:= 0 to pred(BasePointsCount) do |
|
1760 | 396 |
pa.ar[i].y:= LAND_HEIGHT - 1 - pa.ar[i].y; |
358 | 397 |
for i:= 0 to pred(FillPointsCount) do |
1760 | 398 |
FillPoints^[i].y:= LAND_HEIGHT - 1 - FillPoints^[i].y; |
358 | 399 |
end; |
400 |
end |
|
4 | 401 |
end; |
67 | 402 |
|
561 | 403 |
function CheckIntersect(V1, V2, V3, V4: TPoint): boolean; |
404 |
var c1, c2, dm: LongInt; |
|
405 |
begin |
|
406 |
dm:= (V4.y - V3.y) * (V2.x - V1.x) - (V4.x - V3.x) * (V2.y - V1.y); |
|
407 |
c1:= (V4.x - V3.x) * (V1.y - V3.y) - (V4.y - V3.y) * (V1.x - V3.x); |
|
408 |
if dm = 0 then exit(false); |
|
409 |
||
410 |
c2:= (V2.x - V3.x) * (V1.y - V3.y) - (V2.y - V3.y) * (V1.x - V3.x); |
|
411 |
if dm > 0 then |
|
412 |
begin |
|
413 |
if (c1 < 0) or (c1 > dm) then exit(false); |
|
414 |
if (c2 < 0) or (c2 > dm) then exit(false) |
|
415 |
end else |
|
416 |
begin |
|
417 |
if (c1 > 0) or (c1 < dm) then exit(false); |
|
418 |
if (c2 > 0) or (c2 < dm) then exit(false) |
|
419 |
end; |
|
420 |
||
421 |
//AddFileLog('1 (' + inttostr(V1.x) + ',' + inttostr(V1.y) + ')x(' + inttostr(V2.x) + ',' + inttostr(V2.y) + ')'); |
|
422 |
//AddFileLog('2 (' + inttostr(V3.x) + ',' + inttostr(V3.y) + ')x(' + inttostr(V4.x) + ',' + inttostr(V4.y) + ')'); |
|
423 |
CheckIntersect:= true |
|
424 |
end; |
|
425 |
||
426 |
function CheckSelfIntersect(var pa: TPixAr; ind: Longword): boolean; |
|
427 |
var i: Longword; |
|
428 |
begin |
|
429 |
if (ind <= 0) or (ind >= Pred(pa.Count)) then exit(false); |
|
430 |
for i:= 1 to pa.Count - 3 do |
|
431 |
if (i <= ind - 1) or (i >= ind + 2) then |
|
432 |
begin |
|
433 |
if (i <> ind - 1) and |
|
434 |
CheckIntersect(pa.ar[ind], pa.ar[ind - 1], pa.ar[i], pa.ar[i - 1]) then exit(true); |
|
435 |
if (i <> ind + 2) and |
|
436 |
CheckIntersect(pa.ar[ind], pa.ar[ind + 1], pa.ar[i], pa.ar[i - 1]) then exit(true); |
|
437 |
end; |
|
438 |
CheckSelfIntersect:= false |
|
439 |
end; |
|
440 |
||
429 | 441 |
procedure RandomizePoints(var pa: TPixAr); |
364 | 442 |
const cEdge = 55; |
561 | 443 |
cMinDist = 8; |
371 | 444 |
var radz: array[0..Pred(cMaxEdgePoints)] of LongInt; |
561 | 445 |
i, k, dist, px, py: LongInt; |
364 | 446 |
begin |
447 |
radz[0]:= 0; |
|
448 |
for i:= 0 to Pred(pa.Count) do |
|
449 |
with pa.ar[i] do |
|
365 | 450 |
if x <> NTPX then |
451 |
begin |
|
1760 | 452 |
radz[i]:= Min(Max(x - cEdge, 0), Max(LAND_WIDTH - cEdge - x, 0)); |
453 |
radz[i]:= Min(radz[i], Min(Max(y - cEdge, 0), Max(LAND_HEIGHT - cEdge - y, 0))); |
|
365 | 454 |
if radz[i] > 0 then |
455 |
for k:= 0 to Pred(i) do |
|
364 | 456 |
begin |
429 | 457 |
dist:= Max(abs(x - pa.ar[k].x), abs(y - pa.ar[k].y)); |
365 | 458 |
radz[k]:= Max(0, Min((dist - cMinDist) div 2, radz[k])); |
459 |
radz[i]:= Max(0, Min(dist - radz[k] - cMinDist, radz[i])) |
|
460 |
end |
|
461 |
end; |
|
364 | 462 |
|
463 |
for i:= 0 to Pred(pa.Count) do |
|
464 |
with pa.ar[i] do |
|
1753 | 465 |
if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then |
364 | 466 |
begin |
561 | 467 |
px:= x; |
468 |
py:= y; |
|
371 | 469 |
x:= x + LongInt(GetRandom(7) - 3) * (radz[i] * 5 div 7) div 3; |
561 | 470 |
y:= y + LongInt(GetRandom(7) - 3) * (radz[i] * 5 div 7) div 3; |
471 |
if CheckSelfIntersect(pa, i) then |
|
472 |
begin |
|
473 |
x:= px; |
|
474 |
y:= py |
|
475 |
end; |
|
364 | 476 |
end |
67 | 477 |
end; |
478 |
||
364 | 479 |
|
23 | 480 |
procedure GenBlank(var Template: TEdgeTemplate); |
4 | 481 |
var pa: TPixAr; |
23 | 482 |
i: Longword; |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
483 |
y, x: Longword; |
4 | 484 |
begin |
1760 | 485 |
for y:= 0 to LAND_HEIGHT - 1 do |
486 |
for x:= 0 to LAND_WIDTH - 1 do |
|
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
487 |
Land[y, x]:= COLOR_LAND; |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
488 |
|
358 | 489 |
SetPoints(Template, pa); |
429 | 490 |
for i:= 1 to Template.BezierizeCount do |
491 |
begin |
|
431 | 492 |
BezierizeEdge(pa, _0_5); |
561 | 493 |
RandomizePoints(pa); |
429 | 494 |
RandomizePoints(pa) |
495 |
end; |
|
496 |
for i:= 1 to Template.RandPassesCount do RandomizePoints(pa); |
|
365 | 497 |
BezierizeEdge(pa, _0_1); |
27 | 498 |
|
365 | 499 |
DrawEdge(pa, 0); |
27 | 500 |
|
358 | 501 |
with Template do |
23 | 502 |
for i:= 0 to pred(FillPointsCount) do |
503 |
with FillPoints^[i] do |
|
89 | 504 |
FillLand(x, y); |
505 |
||
1773 | 506 |
DrawEdge(pa, COLOR_LAND); |
507 |
||
1776 | 508 |
hasGirders:= Template.hasGirders; |
509 |
playHeight:= Template.TemplateHeight; |
|
510 |
playWidth:= Template.TemplateWidth; |
|
511 |
//TryDo(playWidth<>0, 'freakin magic man! Why the HELL does having a TryDo here make the following calculations work?', true); |
|
512 |
leftX:= ((LAND_WIDTH - playWidth) div 2); |
|
513 |
rightX:= (playWidth + ((LAND_WIDTH - playWidth) div 2)) - 1; |
|
514 |
topY:= LAND_HEIGHT - playHeight; |
|
515 |
||
1773 | 516 |
if (Template.canInvert and (getrandom(2) = 0)) or |
517 |
(not Template.canInvert and Template.isNegative) then |
|
1776 | 518 |
begin |
519 |
hasBorder:= true; |
|
1773 | 520 |
for y:= 0 to LAND_HEIGHT - 1 do |
521 |
for x:= 0 to LAND_WIDTH - 1 do |
|
1776 | 522 |
if (y < topY) or (x < leftX) or (x > rightX) then |
523 |
Land[y, x]:= 0 |
|
524 |
else |
|
525 |
begin |
|
526 |
if Land[y, x] = 0 then |
|
527 |
Land[y, x]:= COLOR_LAND |
|
528 |
else if Land[y, x] = COLOR_LAND then |
|
529 |
Land[y, x]:= 0; |
|
530 |
end; |
|
531 |
end; |
|
23 | 532 |
end; |
533 |
||
371 | 534 |
function SelectTemplate: LongInt; |
161 | 535 |
begin |
351 | 536 |
SelectTemplate:= getrandom(Succ(High(EdgeTemplates))) |
161 | 537 |
end; |
538 |
||
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
539 |
procedure LandSurface2LandPixels(Surface: PSDL_Surface); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
540 |
var x, y: LongInt; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
541 |
p: PLongwordArray; |
1180
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
542 |
begin |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
543 |
TryDo(Surface <> nil, 'Assert (LandSurface <> nil) failed', true); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
544 |
|
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
545 |
if SDL_MustLock(Surface) then |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
546 |
SDLTry(SDL_LockSurface(Surface) >= 0, true); |
1180
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
547 |
|
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
548 |
p:= Surface^.pixels; |
1760 | 549 |
for y:= 0 to LAND_HEIGHT - 1 do |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
550 |
begin |
1760 | 551 |
for x:= 0 to LAND_WIDTH - 1 do |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
552 |
if Land[y, x] <> 0 then LandPixels[y, x]:= p^[x] or $FF000000; |
1760 | 553 |
|
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
554 |
p:= @(p^[Surface^.pitch div 4]); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
555 |
end; |
1180
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
556 |
|
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
557 |
if SDL_MustLock(Surface) then |
1753 | 558 |
SDL_UnlockSurface(Surface); |
1754 | 559 |
end; |
560 |
||
561 |
procedure GenLandSurface; |
|
562 |
var tmpsurf: PSDL_Surface; |
|
563 |
begin |
|
564 |
WriteLnToConsole('Generating land...'); |
|
565 |
||
566 |
GenBlank(EdgeTemplates[SelectTemplate]); |
|
567 |
||
568 |
AddProgress; |
|
569 |
||
1760 | 570 |
tmpsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, LAND_WIDTH, LAND_HEIGHT, 32, RMask, GMask, BMask, 0); |
1754 | 571 |
|
572 |
TryDo(tmpsurf <> nil, 'Error creating pre-land surface', true); |
|
573 |
ColorizeLand(tmpsurf); |
|
574 |
AddOnLandObjects(tmpsurf); |
|
575 |
||
576 |
LandSurface2LandPixels(tmpsurf); |
|
577 |
SDL_FreeSurface(tmpsurf); |
|
578 |
||
579 |
AddProgress; |
|
580 |
||
581 |
AddProgress |
|
582 |
end; |
|
583 |
||
584 |
procedure MakeFortsMap; |
|
585 |
var tmpsurf: PSDL_Surface; |
|
586 |
begin |
|
1784 | 587 |
// For now, defining a fort's playable area as 3072x1200 - there are no tall forts. The extra height is to avoid triggering border with current code, also if user turns on a border, it'll give a bit more maneuvering room. |
588 |
playHeight:= 1200; |
|
589 |
playWidth:= 3072; |
|
1776 | 590 |
leftX:= (LAND_WIDTH - playWidth) div 2; |
591 |
rightX:= ((playWidth + (LAND_WIDTH - playWidth) div 2) - 1); |
|
592 |
topY:= LAND_HEIGHT - playHeight; |
|
593 |
||
1754 | 594 |
WriteLnToConsole('Generating forts land...'); |
595 |
||
596 |
tmpsurf:= LoadImage(Pathz[ptForts] + '/' + ClansArray[0]^.Teams[0]^.FortName + 'L', true, true, true); |
|
1784 | 597 |
BlitImageAndGenerateCollisionInfo(leftX+150, LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf); |
1754 | 598 |
SDL_FreeSurface(tmpsurf); |
599 |
||
600 |
tmpsurf:= LoadImage(Pathz[ptForts] + '/' + ClansArray[1]^.Teams[0]^.FortName + 'R', true, true, true); |
|
1784 | 601 |
BlitImageAndGenerateCollisionInfo(rightX - 150 - tmpsurf^.w, LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf); |
1754 | 602 |
SDL_FreeSurface(tmpsurf); |
603 |
end; |
|
604 |
||
605 |
procedure LoadMap; |
|
606 |
var tmpsurf: PSDL_Surface; |
|
607 |
begin |
|
608 |
WriteLnToConsole('Loading land from file...'); |
|
609 |
AddProgress; |
|
610 |
tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/map', true, true, true); |
|
1760 | 611 |
TryDo((tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT), 'Map dimensions too big!', true); |
1754 | 612 |
|
1776 | 613 |
playHeight:= tmpsurf^.h; |
614 |
playWidth:= tmpsurf^.w; |
|
615 |
TryDo(playWidth<>0, 'freakin magic man! Why the HELL does having a TryDo here make the following calculations work?', true); |
|
616 |
leftX:= (LAND_WIDTH - playWidth) div 2; |
|
617 |
rightX:= (playWidth + ((LAND_WIDTH - playWidth) div 2)) - 1; |
|
618 |
topY:= LAND_HEIGHT - playHeight; |
|
619 |
||
1754 | 620 |
TryDo(tmpsurf^.format^.BytesPerPixel = 4, 'Map should be 32bit', true); |
621 |
||
1772 | 622 |
BlitImageAndGenerateCollisionInfo( |
623 |
(LAND_WIDTH - tmpsurf^.w) div 2, |
|
624 |
LAND_HEIGHT - tmpsurf^.h, |
|
625 |
tmpsurf^.w, |
|
626 |
tmpsurf); |
|
1754 | 627 |
SDL_FreeSurface(tmpsurf); |
628 |
end; |
|
629 |
||
630 |
procedure GenMap; |
|
1784 | 631 |
var x, y, w, c: Longword; |
1754 | 632 |
begin |
1776 | 633 |
hasBorder:= false; |
634 |
hasGirders:= true; |
|
1754 | 635 |
LoadThemeConfig; |
636 |
||
637 |
if (GameFlags and gfForts) = 0 then |
|
638 |
if Pathz[ptMapCurrent] <> '' then LoadMap |
|
639 |
else GenLandSurface |
|
640 |
else MakeFortsMap; |
|
641 |
AddProgress; |
|
1760 | 642 |
|
1754 | 643 |
{$IFDEF DEBUGFILE}LogLandDigest;{$ENDIF} |
1753 | 644 |
|
1768 | 645 |
// check for land near top |
1784 | 646 |
c:= 0; |
647 |
if (GameFlags and gfBorder) <> 0 then |
|
648 |
hasBorder:= true |
|
649 |
else |
|
650 |
for y:= topY to topY + 5 do |
|
651 |
for x:= leftX to rightX do |
|
652 |
if Land[y, x] <> 0 then |
|
653 |
begin |
|
654 |
inc(c); |
|
655 |
if c > 200 then // avoid accidental triggering |
|
656 |
begin |
|
657 |
hasBorder:= true; |
|
658 |
break; |
|
659 |
end; |
|
660 |
end; |
|
1768 | 661 |
|
1776 | 662 |
if hasBorder then |
1768 | 663 |
begin |
1784 | 664 |
for y:= 0 to LAND_HEIGHT - 1 do |
665 |
for x:= 0 to LAND_WIDTH - 1 do |
|
666 |
if (y < topY) or (x < leftX) or (x > rightX) then |
|
667 |
Land[y, x]:= COLOR_INDESTRUCTIBLE; |
|
1768 | 668 |
// experiment hardcoding cave |
1784 | 669 |
// also try basing cave dimensions on map/template dimensions, if they exist |
670 |
for w:= 0 to 5 do // width of 3 allowed worms to be knocked through with grenade |
|
671 |
begin |
|
672 |
for y:= topY to LAND_HEIGHT - 1 do |
|
673 |
begin |
|
674 |
Land[y, leftX + w]:= COLOR_INDESTRUCTIBLE; |
|
675 |
Land[y, rightX - w]:= COLOR_INDESTRUCTIBLE; |
|
676 |
if (y + w) mod 32 < 16 then |
|
677 |
c:= $FF000000 |
|
678 |
else |
|
679 |
c:= $FF00FFFF; |
|
680 |
LandPixels[y, leftX + w]:= c; |
|
681 |
LandPixels[y, rightX - w]:= c; |
|
682 |
end; |
|
1768 | 683 |
|
1784 | 684 |
for x:= leftX to rightX do |
685 |
begin |
|
686 |
Land[topY + w, x]:= COLOR_INDESTRUCTIBLE; |
|
687 |
if (x + w) mod 32 < 16 then |
|
688 |
c:= $FF000000 |
|
689 |
else |
|
690 |
c:= $FF00FFFF; |
|
691 |
LandPixels[topY + w, x]:= c; |
|
692 |
end; |
|
693 |
end; |
|
1768 | 694 |
end; |
695 |
||
1776 | 696 |
if ((GameFlags and gfForts) = 0) and (Pathz[ptMapCurrent] = '') then AddObjects; |
697 |
||
1754 | 698 |
UpdateLandTexture(0, LAND_HEIGHT); |
37 | 699 |
end; |
700 |
||
566 | 701 |
function GenPreview: TPreview; |
371 | 702 |
var x, y, xx, yy, t, bit: LongInt; |
566 | 703 |
Preview: TPreview; |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
704 |
begin |
160 | 705 |
WriteLnToConsole('Generating preview...'); |
161 | 706 |
GenBlank(EdgeTemplates[SelectTemplate]); |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
707 |
|
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
708 |
for y:= 0 to 127 do |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
709 |
for x:= 0 to 31 do |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
710 |
begin |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
711 |
Preview[y, x]:= 0; |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
712 |
for bit:= 0 to 7 do |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
713 |
begin |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
714 |
t:= 0; |
1760 | 715 |
for yy:= y * (LAND_HEIGHT div 128) to y * (LAND_HEIGHT div 128) + 7 do |
716 |
for xx:= x * (LAND_WIDTH div 32) + bit * 8 to x * (LAND_WIDTH div 32) + bit * 8 + 7 do |
|
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
717 |
if Land[yy, xx] <> 0 then inc(t); |
351 | 718 |
if t > 8 then Preview[y, x]:= Preview[y, x] or ($80 shr bit) |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
719 |
end |
566 | 720 |
end; |
1768 | 721 |
GenPreview:= Preview |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
722 |
end; |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
723 |
|
767
697728ffe39f
Introduce UpdateLandTexture function to update just parts of surface
unc0rr
parents:
766
diff
changeset
|
724 |
procedure UpdateLandTexture(Y, Height: LongInt); |
766 | 725 |
begin |
1180
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
726 |
if (Height <= 0) then exit; |
1760 | 727 |
|
728 |
TryDo((Y >= 0) and (Y < LAND_HEIGHT), 'UpdateLandTexture: wrong Y parameter', true); |
|
729 |
TryDo(Y + Height <= LAND_HEIGHT, 'UpdateLandTexture: wrong Height parameter', true); |
|
768 | 730 |
|
1779
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
731 |
if Y < updTopY then updTopY:= Y; |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
732 |
if Y + Height > updBottomY then updBottomY:= Y + Height |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
733 |
end; |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
734 |
|
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
735 |
procedure RealLandTexUpdate; |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
736 |
begin |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
737 |
if updBottomY = 0 then exit; |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
738 |
|
1180
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
739 |
if LandTexture = nil then |
1760 | 740 |
LandTexture:= NewTexture(LAND_WIDTH, LAND_HEIGHT, @LandPixels) |
1180
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
741 |
else |
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
742 |
begin |
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
743 |
glBindTexture(GL_TEXTURE_2D, LandTexture^.id); |
1779
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
744 |
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, updTopY, LAND_WIDTH, updBottomY - updTopY, GL_RGBA, GL_UNSIGNED_BYTE, @LandPixels[updTopY, 0]); |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
745 |
end; |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
746 |
|
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
747 |
updTopY:= LAND_HEIGHT + 1; |
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
748 |
updBottomY:= 0 |
766 | 749 |
end; |
750 |
||
1779
9d88af62a3bb
Cache land texture update until frame render. This greately improves performance when there are many explosions, or you're using drilling weapon
unc0rr
parents:
1776
diff
changeset
|
751 |
|
51 | 752 |
initialization |
753 |
||
4 | 754 |
end. |