120 mModelview[0,1]:= 0.0; mModelview[1,1]:=1.0; |
120 mModelview[0,1]:= 0.0; mModelview[1,1]:=1.0; |
121 end; |
121 end; |
122 |
122 |
123 procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); |
123 procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); |
124 begin |
124 begin |
125 r.y:= r.y + Height * Position; |
125 r.y:= r.y + Height * Position; |
126 r.h:= Height; |
126 r.h:= Height; |
127 DrawTextureFromRect(X, Y, @r, SpritesData[Sprite].Texture) |
127 DrawTextureFromRect(X, Y, @r, SpritesData[Sprite].Texture) |
128 end; |
128 end; |
129 |
129 |
130 procedure DrawTextureFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); |
130 procedure DrawTextureFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); |
131 begin |
131 begin |
132 DrawTextureFromRect(X, Y, r^.w, r^.h, r, SourceTexture) |
132 DrawTextureFromRect(X, Y, r^.w, r^.h, r, SourceTexture) |
133 end; |
133 end; |
134 |
134 |
135 procedure DrawTextureFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); |
135 procedure DrawTextureFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); |
136 var |
136 var |
137 rr: TSDL_Rect; |
137 rr: TSDL_Rect; |
172 VertexBuffer[3].Y:= _b; |
172 VertexBuffer[3].Y:= _b; |
173 |
173 |
174 SetVertexPointer(@VertexBuffer[0]); |
174 SetVertexPointer(@VertexBuffer[0]); |
175 //SetTexCoordPointer(@TextureBuffer[0]); |
175 //SetTexCoordPointer(@TextureBuffer[0]); |
176 SetTexCoordPointer(@SourceTexture^.tb[0]); |
176 SetTexCoordPointer(@SourceTexture^.tb[0]); |
177 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
177 //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
178 end; |
178 end; |
179 |
179 |
180 procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline; |
180 procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline; |
181 begin |
181 begin |
182 DrawTexture(X, Y, Texture, 1.0); |
182 DrawTexture(X, Y, Texture, 1.0); |
183 end; |
183 end; |
184 |
184 |
185 procedure DrawTexture(X, Y: LongInt; Texture: PTexture; Scale: GLfloat); |
185 procedure DrawTexture(X, Y: LongInt; Texture: PTexture; Scale: GLfloat); |
186 begin |
186 begin |
187 SetOffset(X, Y); |
187 SetOffset(X, Y); |
188 ResetRotation; |
188 ResetRotation; |
189 SetScale(Scale); |
189 SetScale(Scale); |
190 UpdateModelview; |
190 UpdateModelview; |
191 |
191 |
192 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); |
192 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); |
193 |
193 SetVertexPointer(@Texture^.vb); |
194 SetVertexPointer(@Texture^.vb); |
194 SetTexCoordPointer(@Texture^.tb); |
195 SetTexCoordPointer(@Texture^.tb); |
195 //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb)); |
196 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb)); |
196 glBindTexture(GL_TEXTURE_2D, 0); // DEBUG |
197 ResetModelview; |
197 |
|
198 ResetModelview; |
198 end; |
199 end; |
199 |
200 |
200 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); |
201 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); |
201 begin |
202 begin |
202 DrawTextureRotatedF(Texture, Scale, 0, 0, X, Y, Frame, Dir, w, h, 0) |
203 DrawTextureRotatedF(Texture, Scale, 0, 0, X, Y, Frame, Dir, w, h, 0) |
216 end; |
217 end; |
217 |
218 |
218 if Texture = nil then |
219 if Texture = nil then |
219 exit; |
220 exit; |
220 |
221 |
221 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) |
222 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) |
222 if (abs(X) > W) and ((abs(X + dir * OffsetX) - W / 2) * cScaleFactor > cScreenWidth) then |
223 if (abs(X) > W) and ((abs(X + dir * OffsetX) - W / 2) * cScaleFactor > cScreenWidth) then |
223 exit; |
224 exit; |
224 if (abs(Y) > H) and ((abs(Y + OffsetY - (0.5 * cScreenHeight)) - W / 2) * cScaleFactor > cScreenHeight) then |
225 if (abs(Y) > H) and ((abs(Y + OffsetY - (0.5 * cScreenHeight)) - W / 2) * cScaleFactor > cScreenHeight) then |
225 exit; |
226 exit; |
226 |
227 |
227 SetOffset(X, Y); |
228 |
228 if Dir = 0 then Dir:= 1; |
229 SetOffset(X, Y); |
229 |
230 if Dir = 0 then |
230 SetRotation(Angle, Dir); |
231 Dir:= 1; |
231 AddOffset(Dir*OffsetX, OffsetY); |
232 |
232 AddScale(Scale); |
233 SetRotation(Angle, Dir); |
233 UpdateModelview; |
234 AddOffset(Dir*OffsetX, OffsetY); |
|
235 AddScale(Scale); |
|
236 UpdateModelview; |
234 |
237 |
235 // Any reason for this call? And why only in t direction, not s? |
238 // Any reason for this call? And why only in t direction, not s? |
236 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
239 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
237 |
240 |
238 hw:= w div (2 div Dir); |
241 hw:= w div (2 div Dir); |
239 |
242 |
240 r.y:=0; |
243 r.y:=0; |
241 r.x:=0; |
244 r.x:=0; |
242 r.w:=w; |
245 r.w:=w; |
243 r.h:=h; |
246 r.h:=h; |
244 ComputeTexcoords(Texture, @r, @TextureBuffer); |
247 ComputeTexcoords(Texture, @r, @TextureBuffer); |
|
248 |
|
249 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); |
|
250 |
|
251 _l:= -hw + Texture^.cropInfo.l; |
|
252 _t:= w/-2 + Texture^.cropInfo.t; |
|
253 _r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r; |
|
254 _b:= w/2 - Texture^.cropInfo.t - Texture^.cropInfo.b; |
|
255 |
|
256 VertexBuffer[0].X:= _l; |
|
257 VertexBuffer[0].Y:= _t; |
|
258 VertexBuffer[1].X:= _r; |
|
259 VertexBuffer[1].Y:= _t; |
|
260 VertexBuffer[2].X:= _r; |
|
261 VertexBuffer[2].Y:= _b; |
|
262 VertexBuffer[3].X:= _l; |
|
263 VertexBuffer[3].Y:= _b; |
|
264 |
|
265 //SetVertexPointer(@VertexBuffer[0]); |
|
266 //SetTexCoordPointer(@TextureBuffer[0]); |
|
267 |
|
268 SetVertexPointer(@Texture^.vb[0]); |
|
269 SetTexCoordPointer(@Texture^.tb[0]); |
|
270 //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
|
271 |
|
272 ResetModelview; |
|
273 end; |
|
274 |
|
275 procedure DrawSpriteRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real); |
|
276 begin |
|
277 DrawTextureRotated(SpritesData[Sprite].Texture, |
|
278 SpritesData[Sprite].Width, |
|
279 SpritesData[Sprite].Height, |
|
280 X, Y, Dir, Angle) |
|
281 end; |
|
282 |
|
283 procedure DrawTextureRotated(Texture: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real); |
|
284 var VertexBuffer: array [0..3] of TVertex2f; |
|
285 _l, _r, _t, _b: GLfloat; |
|
286 begin |
|
287 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) |
|
288 if (abs(X) > 2 * hw) and ((abs(X) - hw) > cScreenWidth / cScaleFactor) then |
|
289 exit; |
|
290 if (abs(Y) > 2 * hh) and ((abs(Y - 0.5 * cScreenHeight) - hh) > cScreenHeight / cScaleFactor) then |
|
291 exit; |
|
292 |
|
293 SetOffset(X, Y); |
|
294 |
|
295 if Dir < 0 then |
|
296 begin |
|
297 hw:= - hw; |
|
298 SetRotation(Angle, -1.0); |
|
299 end |
|
300 else |
|
301 SetRotation(Angle, 1.0); |
|
302 UpdateModelview; |
245 |
303 |
246 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); |
304 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); |
247 |
305 |
248 _l:= -hw + Texture^.cropInfo.l; |
306 _l:= -hw + Texture^.cropInfo.l; |
249 _t:= w/-2 + Texture^.cropInfo.t; |
307 _t:= -hh + Texture^.cropInfo.t; |
250 _r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r; |
308 _r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r; |
251 _b:= w/2 - Texture^.cropInfo.t - Texture^.cropInfo.b; |
309 _b:= hh - Texture^.cropInfo.t - Texture^.cropInfo.b; |
252 |
310 |
253 VertexBuffer[0].X:= _l; |
311 VertexBuffer[0].X:= _l; |
254 VertexBuffer[0].Y:= _t; |
312 VertexBuffer[0].Y:= _t; |
255 VertexBuffer[1].X:= _r; |
313 VertexBuffer[1].X:= _r; |
256 VertexBuffer[1].Y:= _t; |
314 VertexBuffer[1].Y:= _t; |
258 VertexBuffer[2].Y:= _b; |
316 VertexBuffer[2].Y:= _b; |
259 VertexBuffer[3].X:= _l; |
317 VertexBuffer[3].X:= _l; |
260 VertexBuffer[3].Y:= _b; |
318 VertexBuffer[3].Y:= _b; |
261 |
319 |
262 SetVertexPointer(@VertexBuffer[0]); |
320 SetVertexPointer(@VertexBuffer[0]); |
263 //SetTexCoordPointer(@TextureBuffer[0]); |
321 SetTexCoordPointer(@Texture^.tb); |
264 SetTexCoordPointer(@Texture^.tb[0]); |
322 //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
265 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
|
266 |
323 |
267 ResetModelview; |
324 ResetModelview; |
268 end; |
325 end; |
269 |
326 |
270 procedure DrawSpriteRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real); |
327 |
271 begin |
|
272 DrawTextureRotated(SpritesData[Sprite].Texture, |
|
273 SpritesData[Sprite].Width, |
|
274 SpritesData[Sprite].Height, |
|
275 X, Y, Dir, Angle) |
|
276 end; |
|
277 |
328 |
278 procedure DrawSpriteRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real); |
329 procedure DrawSpriteRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real); |
279 begin |
330 var |
280 SetOffset(X, Y); |
|
281 if Dir < 0 then |
|
282 SetRotation(Angle, -1.0) |
|
283 else |
|
284 SetRotation(Angle, 1.0); |
|
285 if Dir < 0 then |
|
286 AddScale(-1.0, 1.0); |
|
287 UpdateModelview; |
|
288 |
|
289 DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame); |
|
290 |
|
291 ResetModelview; |
|
292 end; |
|
293 |
|
294 procedure DrawTextureRotated(Texture: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real); |
|
295 var VertexBuffer: array [0..3] of TVertex2f; |
|
296 _l, _r, _t, _b: GLfloat; |
|
297 begin |
|
298 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) |
|
299 if (abs(X) > 2 * hw) and ((abs(X) - hw) > cScreenWidth / cScaleFactor) then |
|
300 exit; |
|
301 if (abs(Y) > 2 * hh) and ((abs(Y - 0.5 * cScreenHeight) - hh) > cScreenHeight / cScaleFactor) then |
|
302 exit; |
|
303 |
|
304 SetOffset(X, Y); |
|
305 |
|
306 if Dir < 0 then |
|
307 begin |
|
308 hw:= - hw; |
|
309 SetRotation(Angle, -1.0); |
|
310 end |
|
311 else |
|
312 SetRotation(Angle, 1.0); |
|
313 UpdateModelview; |
|
314 |
|
315 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); |
|
316 |
|
317 _l:= -hw + Texture^.cropInfo.l; |
|
318 _t:= -hh + Texture^.cropInfo.t; |
|
319 _r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r; |
|
320 _b:= hh - Texture^.cropInfo.t - Texture^.cropInfo.b; |
|
321 |
|
322 VertexBuffer[0].X:= _l; |
|
323 VertexBuffer[0].Y:= _t; |
|
324 VertexBuffer[1].X:= _r; |
|
325 VertexBuffer[1].Y:= _t; |
|
326 VertexBuffer[2].X:= _r; |
|
327 VertexBuffer[2].Y:= _b; |
|
328 VertexBuffer[3].X:= _l; |
|
329 VertexBuffer[3].Y:= _b; |
|
330 |
|
331 SetVertexPointer(@VertexBuffer[0]); |
|
332 SetTexCoordPointer(@Texture^.tb); |
|
333 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
|
334 |
|
335 ResetModelview; |
|
336 end; |
|
337 |
|
338 procedure DrawSprite(Sprite: TSprite; X, Y, Frame: LongInt); |
|
339 var |
|
340 r: TSDL_Rect; |
|
341 tex: PTexture; |
331 tex: PTexture; |
342 begin |
332 begin |
343 if SpritesData[Sprite].imageHeight = 0 then |
333 if SpritesData[Sprite].imageHeight = 0 then |
344 exit; |
334 exit; |
345 |
335 |
352 end; |
342 end; |
353 |
343 |
354 if (tex = nil) or (tex^.w = 0) or (tex^.h = 0) then |
344 if (tex = nil) or (tex^.w = 0) or (tex^.h = 0) then |
355 exit; |
345 exit; |
356 |
346 |
357 r.x:= 0; |
347 SetOffset(X, Y); |
358 r.w:= SpritesData[Sprite].Width; |
348 |
359 r.y:= 0; |
349 if Dir < 0 then |
360 r.h:= SpritesData[Sprite].Height; |
350 begin |
361 DrawTextureFromRect(X, Y, @r, tex) |
351 SetRotation(Angle, -1.0); |
|
352 AddScale(-1.0, 1.0); |
|
353 end |
|
354 else |
|
355 SetRotation(Angle, 1.0); |
|
356 |
|
357 UpdateModelview; |
|
358 |
|
359 glBindTexture(GL_TEXTURE_2D, tex^.atlas^.id); |
|
360 SetVertexPointer(@tex^.vb); |
|
361 SetTexCoordPointer(@tex^.tb); |
|
362 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(tex^.vb)); |
|
363 glBindTexture(GL_TEXTURE_2D, 0); // DEBUG |
|
364 |
|
365 ResetModelview; |
|
366 end; |
|
367 |
|
368 |
|
369 procedure DrawSprite(Sprite: TSprite; X, Y, Frame: LongInt); |
|
370 begin |
|
371 DrawSpriteRotatedF(Sprite, X, Y, Frame, 1, 0.0); |
362 end; |
372 end; |
363 |
373 |
364 procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt); |
374 procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt); |
365 var r: TSDL_Rect; |
375 var r: TSDL_Rect; |
366 begin |
376 begin |
411 VertexBuffer[0].Y:= Y0; |
421 VertexBuffer[0].Y:= Y0; |
412 VertexBuffer[1].X:= X1; |
422 VertexBuffer[1].X:= X1; |
413 VertexBuffer[1].Y:= Y1; |
423 VertexBuffer[1].Y:= Y1; |
414 |
424 |
415 SetVertexPointer(@VertexBuffer[0]); |
425 SetVertexPointer(@VertexBuffer[0]); |
416 glDrawArrays(GL_LINES, 0, Length(VertexBuffer)); |
426 //glDrawArrays(GL_LINES, 0, Length(VertexBuffer)); |
417 Tint($FF, $FF, $FF, $FF); |
427 Tint($FF, $FF, $FF, $FF); |
418 |
428 |
419 ResetModelview; |
429 ResetModelview; |
420 |
430 |
421 glEnable(GL_TEXTURE_2D); |
431 glEnable(GL_TEXTURE_2D); |
447 VertexBuffer[2].Y:= r.y + r.h; |
457 VertexBuffer[2].Y:= r.y + r.h; |
448 VertexBuffer[3].X:= r.x; |
458 VertexBuffer[3].X:= r.x; |
449 VertexBuffer[3].Y:= r.y + r.h; |
459 VertexBuffer[3].Y:= r.y + r.h; |
450 |
460 |
451 SetVertexPointer(@VertexBuffer[0]); |
461 SetVertexPointer(@VertexBuffer[0]); |
452 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
462 //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
453 |
463 |
454 Tint($FF, $FF, $FF, $FF); |
464 Tint($FF, $FF, $FF, $FF); |
455 glEnable(GL_TEXTURE_2D); |
465 glEnable(GL_TEXTURE_2D); |
456 |
466 |
457 ResetModelview; |
467 ResetModelview; |