fFogD.pas 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. unit fFogD;
  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. Stage.VectorTypes,
  18. GLS.Objects,
  19. GLS.Cadencer,
  20. GLS.SceneViewer,
  21. GLS.Texture,
  22. GLS.Material,
  23. GLS.Coordinates,
  24. Stage.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. var Path: TFileName := GetCurrentAssetPath();
  159. SetCurrentDir(Path + '\texture');
  160. GLMaterialLibrary1.AddTextureMaterial('glscene', 'glscene.bmp');
  161. for X := -cNb to cNb do
  162. for Y := -cNb to cNb do
  163. for Z := -cNb to cNb do
  164. if (X and Y and Z) <> 0 then
  165. begin
  166. Cube := TGLCube(GLDummyCube1.AddNewChild(TGLCube));
  167. Cube.Material.MaterialLibrary := GLMaterialLibrary1;
  168. Cube.Material.LibMaterialName := 'glscene';
  169. Cube.Position.SetPoint(X * cSpacing, Y * cSpacing, Z * cSpacing);
  170. Cube.CubeWidth := cEdgeLength;
  171. Cube.CubeHeight := cEdgeLength;
  172. Cube.CubeDepth := cEdgeLength;
  173. end;
  174. RGFogModeClick(Self);
  175. end;
  176. procedure TFormFog.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  177. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  178. begin
  179. GLCamera1.AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
  180. Handled := true
  181. end;
  182. // cbapplytobackgroundclick
  183. //
  184. procedure TFormFog.CBApplyToBackgroundClick(Sender: TObject);
  185. begin
  186. ApplyFogSettings;
  187. end;
  188. // cbtextureenabledclick
  189. //
  190. procedure TFormFog.CBTextureEnabledClick(Sender: TObject);
  191. begin
  192. GLMaterialLibrary1.Materials[0].Material.Texture.Enabled :=
  193. CBTextureEnabled.Checked;
  194. end;
  195. // cbtextureignorefogclick
  196. //
  197. procedure TFormFog.CBTextureIgnoreFogClick(Sender: TObject);
  198. begin
  199. if CBTextureIgnoreFog.Checked then
  200. GLMaterialLibrary1.Materials[0].Material.MaterialOptions :=
  201. GLMaterialLibrary1.Materials[0].Material.MaterialOptions + [moIgnoreFog]
  202. else
  203. GLMaterialLibrary1.Materials[0].Material.MaterialOptions :=
  204. GLMaterialLibrary1.Materials[0].Material.MaterialOptions - [moIgnoreFog];
  205. end;
  206. procedure TFormFog.EFogStartChange(Sender: TObject);
  207. begin
  208. if TEdit(Sender).Text <> '' then
  209. ApplyFogSettings;
  210. end;
  211. end.