fFog.pas 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. unit fFog;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. System.SysUtils,
  6. System.UITypes,
  7. System.Types,
  8. System.Classes,
  9. System.Math,
  10. Vcl.Graphics,
  11. Vcl.Controls,
  12. Vcl.Forms,
  13. Vcl.Dialogs,
  14. Vcl.ExtCtrls,
  15. Vcl.StdCtrls,
  16. GLS.Scene,
  17. GLS.VectorTypes,
  18. GLS.Objects,
  19. GLS.Cadencer,
  20. GLS.SceneViewer,
  21. GLS.Texture,
  22. GLS.Material,
  23. GLS.Coordinates,
  24. GLS.Utils,
  25. GLS.BaseClasses;
  26. type
  27. TFormFog = class(TForm)
  28. GLSceneViewer1: TGLSceneViewer;
  29. GLScene1: TGLScene;
  30. GLCadencer1: TGLCadencer;
  31. GLCamera1: TGLCamera;
  32. GLDummyCube1: TGLDummyCube;
  33. ColorDialog1: TColorDialog;
  34. GLMaterialLibrary1: TGLMaterialLibrary;
  35. GLLightSource1: TGLLightSource;
  36. Panel1: TPanel;
  37. CBFogEnable: TCheckBox;
  38. LFogStart: TLabel;
  39. LFogEnd: TLabel;
  40. EFogStart: TEdit;
  41. EFogEnd: TEdit;
  42. RGFogDistance: TRadioGroup;
  43. RGFogMode: TRadioGroup;
  44. GBTexture: TGroupBox;
  45. CBTextureEnabled: TCheckBox;
  46. CBTextureIgnoreFog: TCheckBox;
  47. LFogColor: TLabel;
  48. SFogColor: TShape;
  49. CBApplyToBackground: TCheckBox;
  50. LFogDensity: TLabel;
  51. EFogDensity: TEdit;
  52. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  53. Shift: TShiftState; X, Y: Integer);
  54. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  55. X, Y: Integer);
  56. procedure CBFogEnableClick(Sender: TObject);
  57. procedure SEFogStartChange(Sender: TObject);
  58. procedure SFogColorMouseDown(Sender: TObject; Button: TMouseButton;
  59. Shift: TShiftState; X, Y: Integer);
  60. procedure RGFogModeClick(Sender: TObject);
  61. procedure FormCreate(Sender: TObject);
  62. procedure CBApplyToBackgroundClick(Sender: TObject);
  63. procedure CBTextureEnabledClick(Sender: TObject);
  64. procedure CBTextureIgnoreFogClick(Sender: TObject);
  65. procedure EFogStartChange(Sender: TObject);
  66. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  67. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  68. private
  69. MX: Integer;
  70. MY: Integer;
  71. procedure ApplyFogSettings;
  72. public
  73. end;
  74. var
  75. FormFog: TFormFog;
  76. implementation
  77. {$R *.dfm}
  78. // applyfogsettings
  79. //
  80. procedure TFormFog.ApplyFogSettings;
  81. begin
  82. with GLSceneViewer1.Buffer.FogEnvironment do
  83. begin
  84. FogMode := TFogMode(RGFogMode.ItemIndex);
  85. FogDistance := TFogDistance(RGFogDistance.ItemIndex);
  86. FogColor.AsWinColor := SFogColor.Brush.Color;
  87. FogColor.Alpha := StrToInt(EFogDensity.Text) / 1000;
  88. if CBApplyToBackground.Checked then
  89. GLSceneViewer1.Buffer.BackgroundColor := SFogColor.Brush.Color;
  90. FogStart := StrToInt(EFogStart.Text);
  91. FogEnd := StrToInt(EFogEnd.Text);
  92. end;
  93. GLSceneViewer1.Buffer.FogEnable := CBFogEnable.Checked;
  94. end;
  95. // glsceneviewer1mousedown
  96. //
  97. procedure TFormFog.GLSceneViewer1MouseDown(Sender: TObject;
  98. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  99. begin
  100. MX := X;
  101. MY := Y;
  102. end;
  103. // glsceneviewer1mousemove
  104. //
  105. procedure TFormFog.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  106. X, Y: Integer);
  107. begin
  108. if Shift <> [] then
  109. GLSceneViewer1.Camera.MoveAroundTarget(MY - Y, MX - X);
  110. MX := X;
  111. MY := Y;
  112. end;
  113. // cbfogenableclick
  114. //
  115. procedure TFormFog.CBFogEnableClick(Sender: TObject);
  116. begin
  117. ApplyFogSettings;
  118. end;
  119. // sestartfogchange
  120. //
  121. procedure TFormFog.SEFogStartChange(Sender: TObject);
  122. begin
  123. try
  124. ApplyFogSettings;
  125. except
  126. end;
  127. end;
  128. // sgfogcolormousedown
  129. //
  130. procedure TFormFog.SFogColorMouseDown(Sender: TObject; Button: TMouseButton;
  131. Shift: TShiftState; X, Y: Integer);
  132. begin
  133. if ColorDialog1.Execute then
  134. begin
  135. SFogColor.Brush.Color := ColorDialog1.Color;
  136. ApplyFogSettings;
  137. end;
  138. end;
  139. // rgfogmodeclick
  140. //
  141. procedure TFormFog.RGFogModeClick(Sender: TObject);
  142. begin
  143. ApplyFogSettings;
  144. end;
  145. // formcreate
  146. //
  147. procedure TFormFog.FormCreate(Sender: TObject);
  148. const
  149. cSpacing = 2;
  150. cEdgeLength = 0.7;
  151. cNb = 5;
  152. var
  153. X: Integer;
  154. Y: Integer;
  155. Z: Integer;
  156. Cube: TGLCube;
  157. begin
  158. SetGLSceneMediaDir();
  159. GLMaterialLibrary1.AddTextureMaterial('glscene', 'glscene.bmp');
  160. for X := -cNb to cNb do
  161. for Y := -cNb to cNb do
  162. for Z := -cNb to cNb do
  163. if (X and Y and Z) <> 0 then
  164. begin
  165. Cube := TGLCube(GLDummyCube1.AddNewChild(TGLCube));
  166. Cube.Material.MaterialLibrary := GLMaterialLibrary1;
  167. Cube.Material.LibMaterialName := 'glscene';
  168. Cube.Position.SetPoint(X * cSpacing, Y * cSpacing, Z * cSpacing);
  169. Cube.CubeWidth := cEdgeLength;
  170. Cube.CubeHeight := cEdgeLength;
  171. Cube.CubeDepth := cEdgeLength;
  172. end;
  173. RGFogModeClick(Self);
  174. end;
  175. procedure TFormFog.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  176. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  177. begin
  178. GLCamera1.AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
  179. Handled := true
  180. end;
  181. // cbapplytobackgroundclick
  182. //
  183. procedure TFormFog.CBApplyToBackgroundClick(Sender: TObject);
  184. begin
  185. ApplyFogSettings;
  186. end;
  187. // cbtextureenabledclick
  188. //
  189. procedure TFormFog.CBTextureEnabledClick(Sender: TObject);
  190. begin
  191. GLMaterialLibrary1.Materials[0].Material.Texture.Enabled :=
  192. CBTextureEnabled.Checked;
  193. end;
  194. // cbtextureignorefogclick
  195. //
  196. procedure TFormFog.CBTextureIgnoreFogClick(Sender: TObject);
  197. begin
  198. if CBTextureIgnoreFog.Checked then
  199. GLMaterialLibrary1.Materials[0].Material.MaterialOptions :=
  200. GLMaterialLibrary1.Materials[0].Material.MaterialOptions + [moIgnoreFog]
  201. else
  202. GLMaterialLibrary1.Materials[0].Material.MaterialOptions :=
  203. GLMaterialLibrary1.Materials[0].Material.MaterialOptions - [moIgnoreFog];
  204. end;
  205. procedure TFormFog.EFogStartChange(Sender: TObject);
  206. begin
  207. if TEdit(Sender).Text <> '' then
  208. ApplyFogSettings;
  209. end;
  210. end.