demo01.pas 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. unit demo01;
  2. {$I zglCustomConfig.cfg}
  3. interface
  4. uses
  5. Classes,
  6. SysUtils,
  7. Forms,
  8. Controls,
  9. Graphics,
  10. Dialogs,
  11. ExtCtrls,
  12. {$IFDEF LINUX}
  13. {$IFDEF LCLGTK2}
  14. GTK2, GDK2x, GTK2Proc,
  15. {$ENDIF}
  16. {$ENDIF}
  17. {$IFDEF MACOSX}
  18. CarbonPrivate,
  19. {$ENDIF}
  20. {$IFDEF USE_ZENGL_STATIC}
  21. zgl_main,
  22. zgl_window,
  23. zgl_screen,
  24. zgl_timers,
  25. zgl_primitives_2d,
  26. zgl_utils
  27. {$ELSE}
  28. zglHeader
  29. {$ENDIF}
  30. ;
  31. type
  32. { TForm1 }
  33. TForm1 = class(TForm)
  34. Panel1: TPanel;
  35. procedure FormActivate(Sender: TObject);
  36. procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  37. procedure Panel1Resize(Sender: TObject);
  38. private
  39. { private declarations }
  40. public
  41. { public declarations }
  42. end;
  43. var
  44. Form1: TForm1;
  45. zglInited : Boolean;
  46. zglResized : Boolean;
  47. implementation
  48. {$R *.lfm}
  49. procedure Init;
  50. begin
  51. // RU: Вертикальная синхронизация поможет избежать загрузки процессора.
  52. // EN: Vertical synchronization will decrease a CPU loading.
  53. scr_SetVSync( TRUE );
  54. // RU: Перед стартом необходимо настроить viewport.
  55. // EN: Before the start need to configure a viewport.
  56. wnd_SetPos( Form1.Panel1.Left, Form1.Panel1.Top );
  57. wnd_SetSize( Form1.Panel1.Width, Form1.Panel1.ClientHeight );
  58. Form1.BringToFront();
  59. end;
  60. procedure Draw;
  61. begin
  62. // RU: Необходимо обновлять viewport как только изменились размеры контрола, куда был инициализирован ZenGL.
  63. // EN: Viewport should be updated as soon as size of control was changed.
  64. if zglResized Then
  65. begin
  66. zglResized := FALSE;
  67. wnd_SetPos( Form1.Panel1.Left, Form1.Panel1.Top );
  68. wnd_SetSize( Form1.Panel1.ClientWidth, Form1.Panel1.ClientHeight );
  69. end;
  70. pr2d_Rect( 10, 10, 800 - 30, 600 - 30, $FF0000, 255 );
  71. // RU: Т.к. ZenGL перехватывает "управление" нужно выполнять обработку интерфейса вручную.
  72. // EN: Because ZenGL intercepts "control" you need to call process of GUI manually.
  73. Application.ProcessMessages();
  74. end;
  75. procedure Timer;
  76. begin
  77. Form1.Caption := '01 - Initialization [ FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]';
  78. end;
  79. procedure UpdateDT( dt : Double );
  80. begin
  81. end;
  82. { TForm1 }
  83. procedure TForm1.FormActivate(Sender: TObject);
  84. {$IFDEF LINUX}
  85. var
  86. widget : PGtkWidget;
  87. {$ENDIF}
  88. begin
  89. if not zglInited Then
  90. begin
  91. zglInited := TRUE;
  92. {$IFNDEF USE_ZENGL_STATIC}
  93. zglLoad( libZenGL );
  94. {$ENDIF}
  95. zgl_Reg( SYS_LOAD, @Init );
  96. zgl_Reg( SYS_DRAW, @Draw );
  97. // RU: Стоит обратить внимание на название регистрируемой функции, т.к. Update является методом TForm.
  98. // EN: Take a look on name of function which will be registered, because Update is a method of TForm.
  99. zgl_Reg( SYS_UPDATE, @UpdateDT );
  100. wnd_ShowCursor( TRUE );
  101. {$IFDEF LINUX}
  102. {$IFDEF LCLGTK2}
  103. widget := GetFixedWidget( PGtkWidget( Panel1.Handle ) );
  104. gtk_widget_realize( widget );
  105. zgl_InitToHandle( GDK_WINDOW_XID( widget.window ) );
  106. {$ENDIF}
  107. {$ENDIF}
  108. {$IFDEF WINDOWS}
  109. zgl_InitToHandle( Panel1.Handle );
  110. {$ENDIF}
  111. {$IFDEF MACOSX}
  112. // RU: В MacOS X инициализироваться нужно в форму, даже если рисовать надо в другом контроле.
  113. // EN: For MacOS X initialization should be done into form, even if rendering will be into another control.
  114. zgl_InitToHandle( LongWord( TCarbonWindow( Form1.Handle ).Window ) );
  115. {$ENDIF}
  116. Application.Terminate();
  117. end;
  118. end;
  119. procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  120. begin
  121. if zglInited Then
  122. begin
  123. zglInited := FALSE;
  124. zgl_Exit();
  125. end;
  126. end;
  127. procedure TForm1.Panel1Resize(Sender: TObject);
  128. begin
  129. // RU: Установим флаг, что размер контрола изменился.
  130. // EN: Set a flag that size of control has been changed.
  131. zglResized := TRUE;
  132. end;
  133. end.