2
0

fDiffuseShaderD.pas 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. unit fDiffuseShaderD;
  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. GLScene.VectorTypes,
  19. GLS.Context,
  20. GLScene.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. GLScene.Utils,
  32. GLS.FileMD2,
  33. GLS.FileMS3D,
  34. GLS.File3DS;
  35. type
  36. TFormDiffuseShader = class(TForm)
  37. Scene: TGLScene;
  38. Viewer: TGLSceneViewer;
  39. Cadencer: TGLCadencer;
  40. Camera: TGLCamera;
  41. Light: TGLLightSource;
  42. LightCube: TGLDummyCube;
  43. GLSphere1: TGLSphere;
  44. GLXYZGrid1: TGLXYZGrid;
  45. GLArrowLine1: TGLArrowLine;
  46. Panel1: TPanel;
  47. LightMovingCheckBox: TCheckBox;
  48. GUICube: TGLDummyCube;
  49. WorldCube: TGLDummyCube;
  50. Fighter: TGLActor;
  51. Teapot: TGLActor;
  52. Sphere_big: TGLActor;
  53. Sphere: TGLActor;
  54. MaterialLibrary: TGLMaterialLibrary;
  55. ShaderEnabledCheckBox: TCheckBox;
  56. TurnPitchrollCheckBox: TCheckBox;
  57. RealisticSpecularCheckBox: TCheckBox;
  58. LightCube2: TGLDummyCube;
  59. Light2: TGLLightSource;
  60. MultiLightShaderCheckBox: TCheckBox;
  61. DiffuseSpecularShader: TGLSLDiffuseSpecularShader;
  62. 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, newTime: double);
  68. procedure ShaderEnabledCheckBoxClick(Sender: TObject);
  69. procedure RealisticSpecularCheckBoxClick(Sender: TObject);
  70. procedure MultiLightShaderCheckBoxClick(Sender: TObject);
  71. procedure EnableFogCheckBoxClick(Sender: TObject);
  72. end;
  73. var
  74. FormDiffuseShader: TFormDiffuseShader;
  75. MultiLightShader: TGLSLMLDiffuseSpecularShader;
  76. implementation
  77. {$R *.dfm}
  78. procedure TFormDiffuseShader.FormCreate(Sender: TObject);
  79. begin
  80. var Path: TFileName := GetCurrentAssetPath();
  81. // First load modelexts with animation and textures
  82. SetCurrentDir(Path + '\modelext');
  83. Fighter.LoadFromFile('waste.md2'); // Fighter
  84. Fighter.SwitchToAnimation(0, True);
  85. Fighter.AnimationMode := aamLoop;
  86. Fighter.Scale.Scale(3);
  87. MaterialLibrary.LibMaterialByName('Fighter').Material.Texture.Image.LoadFromFile('Waste.jpg');
  88. MaterialLibrary.LibMaterialByName('Fighter').Shader := DiffuseSpecularShader;
  89. // Second loading static models.
  90. SetCurrentDir(Path + '\model');
  91. Teapot.LoadFromFile('Teapot.3ds'); // Teapot (no texture coordinates)
  92. Teapot.Scale.Scale(0.8);
  93. Sphere_big.LoadFromFile('Sphere_big.3DS'); // Sphere_big
  94. Sphere_big.Scale.Scale(70);
  95. Sphere.LoadFromFile('Sphere.3ds'); // Sphere_little
  96. Sphere.Scale.Scale(4);
  97. // Loading textures
  98. SetCurrentDir(Path + '\map');
  99. MaterialLibrary.LibMaterialByName('Earth').Material.Texture.Image.LoadFromFile('earth.jpg');
  100. MaterialLibrary.LibMaterialByName('Earth').Shader := DiffuseSpecularShader;
  101. // This is how a shader is created in runtime.
  102. MultiLightShader := TGLSLMLDiffuseSpecularShader.Create(Self);
  103. // Disable fog.
  104. EnableFogCheckBoxClick(nil);
  105. MultiLightShaderCheckBoxClick(nil);
  106. end;
  107. procedure TFormDiffuseShader.CadencerProgress(Sender: TObject; const deltaTime, newTime: double);
  108. begin
  109. Viewer.Invalidate;
  110. if TurnPitchrollCheckBox.Checked then
  111. begin
  112. Sphere_big.Pitch(40 * deltaTime);
  113. Fighter.Turn(40 * deltaTime);
  114. Sphere.Roll(40 * deltaTime);
  115. Teapot.Roll(-20 * deltaTime);
  116. end;
  117. end;
  118. procedure TFormDiffuseShader.LightCubeProgress(Sender: TObject; const deltaTime, newTime: double);
  119. begin
  120. if LightMovingCheckBox.Checked then
  121. LightCube.MoveObjectAround(Camera.TargetObject, sin(newTime) * deltaTime * 10, deltaTime * 20);
  122. end;
  123. procedure TFormDiffuseShader.ShaderEnabledCheckBoxClick(Sender: TObject);
  124. begin
  125. DiffuseSpecularShader.Enabled := ShaderEnabledCheckBox.Checked;
  126. MultiLightShader.Enabled := ShaderEnabledCheckBox.Checked;
  127. end;
  128. procedure TFormDiffuseShader.RealisticSpecularCheckBoxClick(Sender: TObject);
  129. begin
  130. DiffuseSpecularShader.RealisticSpecular := RealisticSpecularCheckBox.Checked;
  131. MultiLightShader.RealisticSpecular := RealisticSpecularCheckBox.Checked;
  132. if DiffuseSpecularShader.RealisticSpecular then
  133. begin
  134. MaterialLibrary.Materials[0].Material.FrontProperties.Shininess := 20;
  135. MaterialLibrary.Materials[1].Material.FrontProperties.Shininess := 20;
  136. end
  137. else
  138. begin
  139. MaterialLibrary.Materials[0].Material.FrontProperties.Shininess := 8;
  140. MaterialLibrary.Materials[1].Material.FrontProperties.Shininess := 8;
  141. end;
  142. end;
  143. procedure TFormDiffuseShader.MultiLightShaderCheckBoxClick(Sender: TObject);
  144. begin
  145. if MultiLightShaderCheckBox.Checked then
  146. begin
  147. MaterialLibrary.LibMaterialByName('Earth').Shader := MultiLightShader;
  148. MaterialLibrary.LibMaterialByName('Fighter').Shader := MultiLightShader;
  149. end
  150. else
  151. begin
  152. MaterialLibrary.LibMaterialByName('Earth').Shader := DiffuseSpecularShader;
  153. MaterialLibrary.LibMaterialByName('Fighter').Shader := DiffuseSpecularShader;
  154. end;
  155. Light2.Shining := MultiLightShaderCheckBox.Checked;
  156. LightCube2.Visible := MultiLightShaderCheckBox.Checked;
  157. end;
  158. procedure TFormDiffuseShader.EnableFogCheckBoxClick(Sender: TObject);
  159. begin
  160. if EnableFogCheckBox.Checked then
  161. begin
  162. Viewer.Buffer.FogEnable := True;
  163. DiffuseSpecularShader.NotifyChange(Self);
  164. MultiLightShader.NotifyChange(Self);
  165. end
  166. else
  167. begin
  168. Viewer.Buffer.FogEnable := False;
  169. DiffuseSpecularShader.NotifyChange(Self);
  170. MultiLightShader.NotifyChange(Self);
  171. end;
  172. end;
  173. end.