fDiffuseShader.pas 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. unit fDiffuseShader;
  2. interface
  3. uses
  4. System.SysUtils,
  5. System.Classes,
  6. Vcl.Graphics,
  7. Vcl.Controls,
  8. Vcl.Forms,
  9. Vcl.Dialogs,
  10. Vcl.ExtCtrls,
  11. Vcl.StdCtrls,
  12. GLS.Texture,
  13. GLS.Cadencer,
  14. GLS.SceneViewer,
  15. GLS.Scene,
  16. GLS.Objects,
  17. GLS.Graph,
  18. GLS.VectorTypes,
  19. GLS.Context,
  20. GLS.VectorGeometry,
  21. GLS.GeomObjects,
  22. GLS.VectorFileObjects,
  23. GLSL.Shader,
  24. GLSL.DiffuseSpecularShader,
  25. GLSL.CustomShader,
  26. GLSL.UserShader,
  27. GLS.SimpleNavigation,
  28. GLS.Material,
  29. GLS.Coordinates,
  30. GLS.BaseClasses,
  31. GLS.Utils,
  32. GLS.FileMD2,
  33. GLS.FileMS3D,
  34. GLS.File3DS,
  35. Formats.DDSImage;
  36. type
  37. TFormDiffuseShader = class(TForm)
  38. Scene: TGLScene;
  39. Viewer: TGLSceneViewer;
  40. Cadencer: TGLCadencer;
  41. Camera: TGLCamera;
  42. Light: TGLLightSource;
  43. LightCube: TGLDummyCube;
  44. GLSphere1: TGLSphere;
  45. GLXYZGrid1: TGLXYZGrid;
  46. GLArrowLine1: TGLArrowLine;
  47. Panel1: TPanel;
  48. LightMovingCheckBox: TCheckBox;
  49. GUICube: TGLDummyCube;
  50. WorldCube: TGLDummyCube;
  51. Fighter: TGLActor;
  52. Teapot: TGLActor;
  53. Sphere_big: TGLActor;
  54. Sphere_little: TGLActor;
  55. MaterialLibrary: TGLMaterialLibrary;
  56. ShaderEnabledCheckBox: TCheckBox;
  57. TurnPitchrollCheckBox: TCheckBox;
  58. RealisticSpecularCheckBox: TCheckBox;
  59. LightCube2: TGLDummyCube;
  60. Light2: TGLLightSource;
  61. MultiLightShaderCheckBox: TCheckBox;
  62. DiffuseSpecularShader: TGLSLDiffuseSpecularShader; GLSimpleNavigation1: TGLSimpleNavigation;
  63. EnableFogCheckBox: TCheckBox;
  64. GLArrowLine2: TGLArrowLine;
  65. procedure FormCreate(Sender: TObject);
  66. procedure CadencerProgress(Sender: TObject; const deltaTime, newTime: double);
  67. procedure LightCubeProgress(Sender: TObject; const deltaTime,
  68. newTime: Double);
  69. procedure ShaderEnabledCheckBoxClick(Sender: TObject);
  70. procedure RealisticSpecularCheckBoxClick(Sender: TObject);
  71. procedure MultiLightShaderCheckBoxClick(Sender: TObject);
  72. procedure EnableFogCheckBoxClick(Sender: TObject);
  73. end;
  74. var
  75. FormDiffuseShader: TFormDiffuseShader;
  76. MultiLightShader: TGLSLMLDiffuseSpecularShader;
  77. implementation
  78. {$R *.dfm}
  79. procedure TFormDiffuseShader.FormCreate(Sender: TObject);
  80. begin
  81. // First load models.
  82. SetGLSceneMediaDir();
  83. Fighter.LoadFromFile('waste.md2'); //Fighter
  84. Fighter.SwitchToAnimation(0, True);
  85. Fighter.AnimationMode := aamLoop;
  86. Fighter.Scale.Scale(3);
  87. Teapot.LoadFromFile('Teapot.3ds'); //Teapot (no texture coordinates)
  88. Teapot.Scale.Scale(0.8);
  89. Sphere_big.LoadFromFile('Sphere_big.3DS'); //Sphere_big
  90. Sphere_big.Scale.Scale(70);
  91. Sphere_little.LoadFromFile('Sphere_little.3ds'); //Sphere_little
  92. Sphere_little.Scale.Scale(4);
  93. MaterialLibrary.LibMaterialByName('Earth').Material.Texture.Image.LoadFromFile('Earth.jpg');
  94. MaterialLibrary.LibMaterialByName('Fighter').Material.Texture.Image.LoadFromFile('Waste.jpg');
  95. MaterialLibrary.LibMaterialByName('Earth').Shader := DiffuseSpecularShader;
  96. MaterialLibrary.LibMaterialByName('Fighter').Shader := DiffuseSpecularShader;
  97. // This is how a shader is created in runtime.
  98. MultiLightShader := TGLSLMLDiffuseSpecularShader.Create(Self);
  99. // Disable fog.
  100. EnableFogCheckBoxClick(nil);
  101. end;
  102. procedure TFormDiffuseShader.CadencerProgress(Sender: TObject; const deltaTime, newTime: double);
  103. begin
  104. Viewer.Invalidate;
  105. if TurnPitchrollCheckBox.Checked then
  106. begin
  107. Sphere_big.Pitch(40 * deltaTime);
  108. Fighter.Turn(40 * deltaTime);
  109. Sphere_little.Roll(40 * deltaTime);
  110. Teapot.Roll(-20 * deltaTime);
  111. end;
  112. end;
  113. procedure TFormDiffuseShader.LightCubeProgress(Sender: TObject; const deltaTime,
  114. newTime: Double);
  115. begin
  116. if LightMovingCheckBox.Checked then
  117. LightCube.MoveObjectAround(Camera.TargetObject, sin(NewTime) * deltaTime * 10, deltaTime * 20);
  118. end;
  119. procedure TFormDiffuseShader.ShaderEnabledCheckBoxClick(Sender: TObject);
  120. begin
  121. DiffuseSpecularShader.Enabled := ShaderEnabledCheckBox.Checked;
  122. MultiLightShader.Enabled := ShaderEnabledCheckBox.Checked;
  123. end;
  124. procedure TFormDiffuseShader.RealisticSpecularCheckBoxClick(Sender: TObject);
  125. begin
  126. DiffuseSpecularShader.RealisticSpecular := RealisticSpecularCheckBox.Checked;
  127. MultiLightShader.RealisticSpecular := RealisticSpecularCheckBox.Checked;
  128. if DiffuseSpecularShader.RealisticSpecular then
  129. begin
  130. MaterialLibrary.Materials[0].Material.FrontProperties.Shininess := 20;
  131. MaterialLibrary.Materials[1].Material.FrontProperties.Shininess := 20;
  132. end
  133. else
  134. begin
  135. MaterialLibrary.Materials[0].Material.FrontProperties.Shininess := 8;
  136. MaterialLibrary.Materials[1].Material.FrontProperties.Shininess := 8;
  137. end;
  138. end;
  139. procedure TFormDiffuseShader.MultiLightShaderCheckBoxClick(Sender: TObject);
  140. begin
  141. if MultiLightShaderCheckBox.Checked then
  142. begin
  143. MaterialLibrary.LibMaterialByName('Earth').Shader := MultiLightShader;
  144. MaterialLibrary.LibMaterialByName('Fighter').Shader := MultiLightShader;
  145. end
  146. else
  147. begin
  148. MaterialLibrary.LibMaterialByName('Earth').Shader := DiffuseSpecularShader;
  149. MaterialLibrary.LibMaterialByName('Fighter').Shader := DiffuseSpecularShader;
  150. end;
  151. Light2.Shining := MultiLightShaderCheckBox.Checked;
  152. LightCube2.Visible := MultiLightShaderCheckBox.Checked;
  153. end;
  154. procedure TFormDiffuseShader.EnableFogCheckBoxClick(Sender: TObject);
  155. begin
  156. if EnableFogCheckBox.Checked then
  157. begin
  158. Viewer.Buffer.FogEnable := True;
  159. DiffuseSpecularShader.NotifyChange(Self);
  160. MultiLightShader.NotifyChange(Self);
  161. end
  162. else
  163. begin
  164. Viewer.Buffer.FogEnable := False;
  165. DiffuseSpecularShader.NotifyChange(Self);
  166. MultiLightShader.NotifyChange(Self);
  167. end;
  168. end;
  169. end.