46 procedure DrawLine (X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); |
46 procedure DrawLine (X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); |
47 procedure DrawFillRect (r: TSDL_Rect); |
47 procedure DrawFillRect (r: TSDL_Rect); |
48 procedure DrawHedgehog (X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real); |
48 procedure DrawHedgehog (X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real); |
49 procedure DrawScreenWidget (widget: POnScreenWidget); |
49 procedure DrawScreenWidget (widget: POnScreenWidget); |
50 |
50 |
51 procedure Tint (r, g, b, a: Byte); inline; |
|
52 procedure Tint (c: Longword); inline; |
|
53 |
|
54 // This is just temporary and becomes non public once everything changed to GL2 |
51 // This is just temporary and becomes non public once everything changed to GL2 |
55 procedure UpdateModelview; |
52 procedure UpdateModelview; |
56 procedure ResetModelview; |
53 procedure ResetModelview; |
57 procedure SetOffset(X, Y: Longint); |
54 procedure SetOffset(X, Y: Longint); |
58 procedure ResetRotation; |
55 procedure ResetRotation; |
59 |
56 |
60 |
57 |
61 implementation |
58 implementation |
62 uses uVariables, uStore; |
59 uses uVariables, uStore; |
63 |
|
64 var LastTint: LongWord = 0; |
|
65 |
60 |
66 const DegToRad = 0.01745329252; // 2PI / 360 |
61 const DegToRad = 0.01745329252; // 2PI / 360 |
67 |
62 |
68 procedure UpdateModelview; |
63 procedure UpdateModelview; |
69 begin |
64 begin |
167 VertexBuffer[2].X:= rr.w + X; |
162 VertexBuffer[2].X:= rr.w + X; |
168 VertexBuffer[2].Y:= rr.h + Y; |
163 VertexBuffer[2].Y:= rr.h + Y; |
169 VertexBuffer[3].X:= X; |
164 VertexBuffer[3].X:= X; |
170 VertexBuffer[3].Y:= rr.h + Y; |
165 VertexBuffer[3].Y:= rr.h + Y; |
171 |
166 |
172 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
167 SetVertexPointer(@VertexBuffer[0]); |
173 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); |
168 SetTexCoordPointer(@TextureBuffer[0]); |
174 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
169 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
175 end; |
170 end; |
176 |
171 |
177 procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline; |
172 procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline; |
178 begin |
173 begin |
186 SetScale(Scale); |
181 SetScale(Scale); |
187 UpdateModelview; |
182 UpdateModelview; |
188 |
183 |
189 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); |
184 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); |
190 |
185 |
191 glVertexPointer(2, GL_FLOAT, 0, @Texture^.vb); |
186 SetVertexPointer(@Texture^.vb); |
192 glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb); |
187 SetTexCoordPointer(@Texture^.tb); |
193 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb)); |
188 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb)); |
194 ResetModelview; |
189 ResetModelview; |
195 end; |
190 end; |
196 |
191 |
197 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); |
192 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); |
241 VertexBuffer[2].X:= hw; |
236 VertexBuffer[2].X:= hw; |
242 VertexBuffer[2].Y:= w / 2; |
237 VertexBuffer[2].Y:= w / 2; |
243 VertexBuffer[3].X:= -hw; |
238 VertexBuffer[3].X:= -hw; |
244 VertexBuffer[3].Y:= w / 2; |
239 VertexBuffer[3].Y:= w / 2; |
245 |
240 |
246 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
241 SetVertexPointer(@VertexBuffer[0]); |
247 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); |
242 SetTexCoordPointer(@TextureBuffer[0]); |
248 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
243 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
249 |
244 |
250 ResetModelview; |
245 ResetModelview; |
251 end; |
246 end; |
252 |
247 |
303 VertexBuffer[2].X:= hw; |
298 VertexBuffer[2].X:= hw; |
304 VertexBuffer[2].Y:= hh; |
299 VertexBuffer[2].Y:= hh; |
305 VertexBuffer[3].X:= -hw; |
300 VertexBuffer[3].X:= -hw; |
306 VertexBuffer[3].Y:= hh; |
301 VertexBuffer[3].Y:= hh; |
307 |
302 |
308 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
303 SetVertexPointer(@VertexBuffer[0]); |
309 glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb); |
304 SetTexCoordPointer(@Texture^.tb); |
310 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
305 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
311 |
306 |
312 ResetModelview; |
307 ResetModelview; |
313 end; |
308 end; |
314 |
309 |
382 VertexBuffer[0].X:= X0; |
377 VertexBuffer[0].X:= X0; |
383 VertexBuffer[0].Y:= Y0; |
378 VertexBuffer[0].Y:= Y0; |
384 VertexBuffer[1].X:= X1; |
379 VertexBuffer[1].X:= X1; |
385 VertexBuffer[1].Y:= Y1; |
380 VertexBuffer[1].Y:= Y1; |
386 |
381 |
387 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
382 SetVertexPointer(@VertexBuffer[0]); |
388 glDrawArrays(GL_LINES, 0, Length(VertexBuffer)); |
383 glDrawArrays(GL_LINES, 0, Length(VertexBuffer)); |
389 Tint($FF, $FF, $FF, $FF); |
384 Tint($FF, $FF, $FF, $FF); |
390 |
385 |
391 ResetModelview; |
386 ResetModelview; |
392 |
387 |
418 VertexBuffer[2].X:= r.x + r.w; |
413 VertexBuffer[2].X:= r.x + r.w; |
419 VertexBuffer[2].Y:= r.y + r.h; |
414 VertexBuffer[2].Y:= r.y + r.h; |
420 VertexBuffer[3].X:= r.x; |
415 VertexBuffer[3].X:= r.x; |
421 VertexBuffer[3].Y:= r.y + r.h; |
416 VertexBuffer[3].Y:= r.y + r.h; |
422 |
417 |
423 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); |
418 SetVertexPointer(@VertexBuffer[0]); |
424 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
419 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); |
425 |
420 |
426 Tint($FF, $FF, $FF, $FF); |
421 Tint($FF, $FF, $FF, $FF); |
427 glEnable(GL_TEXTURE_2D); |
422 glEnable(GL_TEXTURE_2D); |
428 |
423 |
449 glEnable(GL_LINE_SMOOTH); |
444 glEnable(GL_LINE_SMOOTH); |
450 SetOffset(0, 0); |
445 SetOffset(0, 0); |
451 ResetRotation; |
446 ResetRotation; |
452 UpdateModelview; |
447 UpdateModelview; |
453 glLineWidth(Width); |
448 glLineWidth(Width); |
454 glVertexPointer(2, GL_FLOAT, 0, @CircleVertex[0]); |
449 SetVertexPointer(@CircleVertex[0]); |
455 glDrawArrays(GL_LINE_LOOP, 0, 60); |
450 glDrawArrays(GL_LINE_LOOP, 0, 60); |
456 glEnable(GL_TEXTURE_2D); |
451 glEnable(GL_TEXTURE_2D); |
457 glDisable(GL_LINE_SMOOTH); |
452 glDisable(GL_LINE_SMOOTH); |
458 ResetModelview; |
453 ResetModelview; |
459 end; |
454 end; |
488 SetRotation(Angle, 1.0); |
483 SetRotation(Angle, 1.0); |
489 UpdateModelview; |
484 UpdateModelview; |
490 |
485 |
491 glBindTexture(GL_TEXTURE_2D, HHTexture^.atlas^.id); |
486 glBindTexture(GL_TEXTURE_2D, HHTexture^.atlas^.id); |
492 if Dir = -1 then |
487 if Dir = -1 then |
493 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffers[1][0]) |
488 SetVertexPointer(@VertexBuffers[1][0]) |
494 else |
489 else |
495 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffers[0][0]); |
490 SetVertexPointer(@VertexBuffers[0][0]); |
496 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); |
491 SetTexCoordPointer(@TextureBuffer[0]); |
497 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
492 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
498 |
493 |
499 ResetModelview; |
494 ResetModelview; |
500 end; |
495 end; |
501 |
496 |
544 begin |
539 begin |
545 widget:= widget; // avoid hint |
540 widget:= widget; // avoid hint |
546 {$ENDIF} |
541 {$ENDIF} |
547 end; |
542 end; |
548 |
543 |
549 procedure Tint(r, g, b, a: Byte); inline; |
|
550 var nc, tw: Longword; |
|
551 begin |
|
552 nc:= (a shl 24) or (b shl 16) or (g shl 8) or r; |
|
553 |
|
554 if nc = lastTint then |
|
555 exit; |
|
556 |
|
557 if GrayScale then |
|
558 begin |
|
559 tw:= round(r * RGB_LUMINANCE_RED + g * RGB_LUMINANCE_GREEN + b * RGB_LUMINANCE_BLUE); |
|
560 if tw > 255 then |
|
561 tw:= 255; |
|
562 r:= tw; |
|
563 g:= tw; |
|
564 b:= tw |
|
565 end; |
|
566 |
|
567 glColor4ub(r, g, b, a); |
|
568 lastTint:= nc; |
|
569 end; |
|
570 |
|
571 procedure Tint(c: Longword); inline; |
|
572 begin |
|
573 Tint(((c shr 24) and $FF), ((c shr 16) and $FF), (c shr 8) and $FF, (c and $FF)) |
|
574 end; |
|
575 |
|
576 end. |
544 end. |