showcase_primitives.mod 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. MODULE showcase_primitives ;
  2. (*
  3. m2SDL3 showcase, ported from SDL upstream
  4. examples/renderer/02-primitives/primitives.c (public domain).
  5. Draws a filled rectangle, 500 random points, an inset outline
  6. and a yellow X across the canvas every frame.
  7. SDL3 native form:
  8. - SDL_RenderRect / SDL_RenderPoints / SDL_RenderFillRect take
  9. SDL_FRect / SDL_FPoint records with SHORTREAL fields.
  10. - Point array passes as ADR(points) + count (see SDL3Render).
  11. - libc rand seeded from SDL_GetTicks replaces SDL_randf.
  12. - Callback structure flattened into a main loop; auto-quit
  13. after 8 s so the showcase also terminates unattended.
  14. *)
  15. FROM SYSTEM IMPORT ADDRESS, ADR, CARDINAL8;
  16. FROM SDL3 IMPORT SDL_Init, SDL_Quit, SDL_Delay,
  17. SDL_GetTicks, SDLInitVideo;
  18. FROM SDL3Video IMPORT WindowHandle, SDL_DestroyWindow, WindowResizable;
  19. FROM SDL3Render IMPORT RendererHandle,
  20. SDL_CreateWindowAndRenderer, SDL_DestroyRenderer,
  21. SDL_SetRenderDrawColor, SDL_RenderClear, SDL_RenderPresent,
  22. SDL_SetRenderLogicalPresentation, LogicalLetterbox,
  23. SDL_RenderLine, SDL_RenderRect, SDL_RenderPoints,
  24. SDL_RenderFillRect;
  25. FROM SDL3Rect IMPORT SDLFRect, SDLFPoint, MakeFRect, MakeFPoint;
  26. FROM SDL3Utils IMPORT DrainEvents;
  27. FROM libc IMPORT printf, rand, srand;
  28. CONST FrameMs = 16; MaxMs = 8000;
  29. CONST WinW = 640; WinH = 480; NPoints = 500;
  30. VAR
  31. win: WindowHandle;
  32. ren: RendererHandle;
  33. points: ARRAY [0..NPoints-1] OF SDLFPoint;
  34. rect: SDLFRect;
  35. quit: BOOLEAN;
  36. start: LONGCARD;
  37. i: INTEGER;
  38. BEGIN
  39. IF NOT SDL_Init(SDLInitVideo) THEN
  40. printf("showcase_primitives: SDL_Init failed\n");
  41. HALT(1)
  42. END;
  43. IF NOT SDL_CreateWindowAndRenderer("m2SDL3 primitives",
  44. WinW, WinH,
  45. VAL(LONGCARD, WindowResizable),
  46. win, ren) THEN
  47. printf("showcase_primitives: CreateWindowAndRenderer failed\n");
  48. SDL_Quit;
  49. HALT(1)
  50. END;
  51. SDL_SetRenderLogicalPresentation(ren, WinW, WinH, LogicalLetterbox);
  52. (* scatter the points inside the blue rectangle, as in the C code. *)
  53. srand(VAL(INTEGER, SDL_GetTicks()));
  54. FOR i := 0 TO NPoints - 1 DO
  55. points[i] := MakeFPoint(VAL(SHORTREAL, VAL(REAL, rand() MOD 440 + 100)),
  56. VAL(SHORTREAL, VAL(REAL, rand() MOD 280 + 100)))
  57. END;
  58. printf("showcase_primitives: close window or wait 8s\n");
  59. quit := FALSE;
  60. start := SDL_GetTicks();
  61. WHILE NOT quit DO
  62. DrainEvents(quit);
  63. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 33), VAL(CARDINAL8, 33),
  64. VAL(CARDINAL8, 33), VAL(CARDINAL8, 255));
  65. SDL_RenderClear(ren);
  66. rect := MakeFRect(VAL(SHORTREAL, 100.0), VAL(SHORTREAL, 100.0),
  67. VAL(SHORTREAL, 440.0), VAL(SHORTREAL, 280.0));
  68. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 0), VAL(CARDINAL8, 0),
  69. VAL(CARDINAL8, 255), VAL(CARDINAL8, 255));
  70. SDL_RenderFillRect(ren, rect);
  71. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 255), VAL(CARDINAL8, 0),
  72. VAL(CARDINAL8, 0), VAL(CARDINAL8, 255));
  73. SDL_RenderPoints(ren, ADR(points), NPoints);
  74. rect := MakeFRect(VAL(SHORTREAL, 130.0), VAL(SHORTREAL, 130.0),
  75. VAL(SHORTREAL, 380.0), VAL(SHORTREAL, 220.0));
  76. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 0), VAL(CARDINAL8, 255),
  77. VAL(CARDINAL8, 0), VAL(CARDINAL8, 255));
  78. SDL_RenderRect(ren, rect);
  79. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 255), VAL(CARDINAL8, 255),
  80. VAL(CARDINAL8, 0), VAL(CARDINAL8, 255));
  81. SDL_RenderLine(ren, VAL(SHORTREAL, 0.0), VAL(SHORTREAL, 0.0),
  82. VAL(SHORTREAL, VAL(REAL, WinW)), VAL(SHORTREAL, VAL(REAL, WinH)));
  83. SDL_RenderLine(ren, VAL(SHORTREAL, 0.0), VAL(SHORTREAL, VAL(REAL, WinH)),
  84. VAL(SHORTREAL, VAL(REAL, WinW)), VAL(SHORTREAL, 0.0));
  85. SDL_RenderPresent(ren);
  86. IF SDL_GetTicks() - start > MaxMs THEN quit := TRUE END;
  87. SDL_Delay(FrameMs)
  88. END;
  89. SDL_DestroyRenderer(ren);
  90. SDL_DestroyWindow(win);
  91. SDL_Quit;
  92. printf("showcase_primitives: bye\n")
  93. END showcase_primitives.