fBumpShader.pas 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. unit fBumpShader;
  2. interface
  3. uses
  4. System.SysUtils,
  5. System.Classes,
  6. System.Math,
  7. System.Types,
  8. Vcl.Controls,
  9. Vcl.Forms,
  10. Vcl.ExtCtrls,
  11. Vcl.StdCtrls,
  12. Vcl.Imaging.Jpeg,
  13. GLS.Texture,
  14. GLS.Cadencer,
  15. GLS.SceneViewer,
  16. GLS.Scene,
  17. GLS.Objects,
  18. GLS.VectorFileObjects,
  19. GLS.Graph,
  20. GLS.GeomObjects,
  21. GLS.VectorGeometry,
  22. GLS.Material,
  23. GLS.Coordinates,
  24. GLS.BaseClasses,
  25. GLS.Utils,
  26. GLS.FileMS3D,
  27. GLS.File3DS,
  28. Formats.DDSImage,
  29. GLS.FileMD2,
  30. GLS.FileSMD,
  31. GLSL.Shader,
  32. GLSL.CustomShader,
  33. GLSL.BumpShaders;
  34. type
  35. TFormBumpShader = class(TForm)
  36. Scene: TGLScene;
  37. Viewer: TGLSceneViewer;
  38. Cadencer: TGLCadencer;
  39. Camera: TGLCamera;
  40. Timer1: TTimer;
  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_little: TGLActor;
  54. MaterialLibrary: TGLMaterialLibrary;
  55. RollPitchTurnCheckBox: TCheckBox;
  56. ShaderEnabledCheckBox: TCheckBox;
  57. GLSphere2: TGLSphere;
  58. Light2: TGLLightSource;
  59. LightCube2: TGLDummyCube;
  60. MultiLightShaderCheckBox: TCheckBox;
  61. UseSpecularTextureCheckBox: TCheckBox;
  62. UseNormalTextureCheckBox: TCheckBox;
  63. MyBumpShader: TGLSLBumpShader;
  64. TrinityMatlib: TGLMaterialLibrary;
  65. GLCube: TGLCube;
  66. GLDodecahedron: TGLDodecahedron;
  67. GLSphere: TGLSphere;
  68. ShowNotGLSceneObjectsCheckBox: TCheckBox;
  69. procedure FormCreate(Sender: TObject);
  70. procedure CadencerProgress(Sender: TObject; const DeltaTime, newTime: Double);
  71. procedure ViewerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  72. procedure ViewerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  73. procedure Timer1Timer(Sender: TObject);
  74. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  75. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  76. procedure LightCubeProgress(Sender: TObject; const DeltaTime, newTime: Double);
  77. procedure ShaderEnabledCheckBoxClick(Sender: TObject);
  78. procedure MultiLightShaderCheckBoxClick(Sender: TObject);
  79. procedure UseSpecularTextureCheckBoxClick(Sender: TObject);
  80. procedure UseNormalTextureCheckBoxClick(Sender: TObject);
  81. procedure ShowNotGLSceneObjectsCheckBoxClick(Sender: TObject);
  82. end;
  83. var
  84. FormBumpShader: TFormBumpShader;
  85. mx, my: Integer;
  86. MultiLightShader: TGLSLMLBumpShader;
  87. implementation
  88. {$R *.dfm}
  89. procedure TFormBumpShader.FormCreate(Sender: TObject);
  90. var
  91. I : Integer;
  92. begin
  93. //First load models
  94. SetGLSceneMediaDir();
  95. Fighter.LoadFromFile('TRINITYrage.smd'); //Fighter
  96. Fighter.AddDataFromFile('walk.smd');
  97. Fighter.Animations[1].MakeSkeletalTranslationStatic;
  98. Fighter.AddDataFromFile('run.smd');
  99. Fighter.Animations[2].MakeSkeletalTranslationStatic;
  100. Fighter.AddDataFromFile('long_jump.smd');
  101. Fighter.AddDataFromFile('jump.smd');
  102. Fighter.AddDataFromFile('look_left_right.smd');
  103. Fighter.Animations[5].MakeSkeletalRotationDelta;
  104. Fighter.SwitchToAnimation(1);
  105. (*
  106. // or use a quake md2 model
  107. Fighter.LoadFromFile('waste.md2'); //Fighter
  108. Fighter.SwitchToAnimation(0, True);
  109. Fighter.AnimationMode := aamLoop;
  110. Fighter.Scale.Scale(3);
  111. *)
  112. Fighter.AnimationMode := aamLoop;
  113. Fighter.Scale.Scale(3);
  114. // Fighter.MeshObjects.BuildTangentSpace;
  115. Teapot.LoadFromFile('Teapot.3ds'); //Teapot
  116. Teapot.Scale.Scale(0.8);
  117. // Teapot.MeshObjects.BuildTangentSpace; does not have texture coordinates...
  118. Sphere_big.LoadFromFile('Sphere_big.3DS'); //Sphere_big
  119. Sphere_big.Scale.Scale(70);
  120. Sphere_big.MeshObjects.BuildTangentSpace;
  121. Sphere_little.LoadFromFile('Sphere_little.3ds'); //Sphere_little
  122. Sphere_little.Scale.Scale(4);
  123. Sphere_little.MeshObjects.BuildTangentSpace;
  124. // Then load textures
  125. MaterialLibrary.LibMaterialByName('Earth').Material.Texture.Image.LoadFromFile('Earth.jpg');
  126. MaterialLibrary.LibMaterialByName('EarthGross').Material.Texture.Image.LoadFromFile('EarthSpec.dds');
  127. MaterialLibrary.LibMaterialByName('EarthNormals').Material.Texture.Image.LoadFromFile('EarthNormals.jpg');
  128. // Create Shader
  129. MultiLightShader := TGLSLMLBumpShader.Create(Self);
  130. MultiLightShader.LightSources := [1, 2];
  131. MultiLightShader.LightCompensation := 0.7;
  132. MultiLightShader.NormalTexture := MaterialLibrary.LibMaterialByName('EarthNormals').Material.Texture;
  133. MultiLightShader.SpecularTexture := MaterialLibrary.LibMaterialByName('EarthGross').Material.Texture;
  134. // Attach shader to the material
  135. MaterialLibrary.LibMaterialByName('Earth').Shader := MyBumpShader;
  136. for I := 0 to TrinityMatlib.Materials.Count - 1 do
  137. TrinityMatlib.Materials[I].Shader := MyBumpShader;
  138. ShowNotGLSceneObjectsCheckBoxClick(Sender);
  139. end;
  140. procedure TFormBumpShader.ShaderEnabledCheckBoxClick(Sender: TObject);
  141. begin
  142. MyBumpShader.Enabled := ShaderEnabledCheckBox.Checked;
  143. MultiLightShader.Enabled := ShaderEnabledCheckBox.Checked;
  144. end;
  145. procedure TFormBumpShader.MultiLightShaderCheckBoxClick(Sender: TObject);
  146. var
  147. I: Integer;
  148. begin
  149. if MultiLightShaderCheckBox.Checked then
  150. begin
  151. MaterialLibrary.LibMaterialByName('Earth').Shader := MultiLightShader;
  152. for I := 0 to TrinityMatlib.Materials.Count - 1 do
  153. TrinityMatlib.Materials[I].Shader := MultiLightShader;
  154. end
  155. else
  156. begin
  157. MaterialLibrary.LibMaterialByName('Earth').Shader := MyBumpShader;
  158. for I := 0 to TrinityMatlib.Materials.Count - 1 do
  159. TrinityMatlib.Materials[I].Shader := MyBumpShader;
  160. end;
  161. Light2.Shining := MultiLightShaderCheckBox.Checked;
  162. LightCube2.Visible := MultiLightShaderCheckBox.Checked;
  163. end;
  164. procedure TFormBumpShader.UseSpecularTextureCheckBoxClick(Sender: TObject);
  165. begin
  166. if UseSpecularTextureCheckBox.Checked then
  167. begin
  168. MyBumpShader.SpecularTexture := MaterialLibrary.LibMaterialByName('EarthGross').Material.Texture;
  169. MultiLightShader.SpecularTexture := MaterialLibrary.LibMaterialByName('EarthGross').Material.Texture;
  170. end
  171. else
  172. begin
  173. MyBumpShader.SpecularTexture := nil;
  174. MultiLightShader.SpecularTexture := nil;
  175. end;
  176. end;
  177. procedure TFormBumpShader.UseNormalTextureCheckBoxClick(Sender: TObject);
  178. begin
  179. if UseNormalTextureCheckBox.Checked then
  180. begin
  181. MyBumpShader.NormalTexture := MaterialLibrary.LibMaterialByName('EarthNormals').Material.Texture;
  182. MultiLightShader.NormalTexture := MaterialLibrary.LibMaterialByName('EarthNormals').Material.Texture;
  183. end
  184. else
  185. begin
  186. MyBumpShader.NormalTexture := nil;
  187. MultiLightShader.NormalTexture := nil;
  188. end;
  189. end;
  190. procedure TFormBumpShader.ShowNotGLSceneObjectsCheckBoxClick(
  191. Sender: TObject);
  192. begin
  193. Teapot.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  194. Fighter.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  195. GLCube.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  196. GLDodecahedron.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  197. GLSphere.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  198. end;
  199. procedure TFormBumpShader.CadencerProgress(Sender: TObject; const DeltaTime, newTime: Double);
  200. begin
  201. Viewer.Invalidate;
  202. if RollPitchTurnCheckBox.Checked then
  203. begin
  204. Sphere_big.Turn(DeltaTime * 40);
  205. Sphere_big.Roll(DeltaTime * 40);
  206. Sphere_little.Pitch(DeltaTime * 20);
  207. Fighter.Roll(DeltaTime * 20);
  208. Teapot.Roll(-DeltaTime * 10);
  209. GLCube.Pitch(-DeltaTime * 10);
  210. GLDodecahedron.Pitch(DeltaTime * 10);
  211. GLSphere.Roll(-DeltaTime * 10);
  212. end;
  213. end;
  214. procedure TFormBumpShader.ViewerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  215. begin
  216. mx := X;
  217. my := Y;
  218. end;
  219. procedure TFormBumpShader.ViewerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  220. begin
  221. if (ssRight in Shift) and (ssLeft in Shift) then
  222. Camera.AdjustDistanceToTarget(Power(1.01, Y - my))
  223. else
  224. if (ssRight in Shift) or (ssLeft in Shift) then
  225. Camera.MoveAroundTarget(my - Y, mx - X);
  226. mx := X;
  227. my := Y;
  228. end;
  229. procedure TFormBumpShader.Timer1Timer(Sender: TObject);
  230. begin
  231. Caption := 'GLSL Bump Shader - ' + Viewer.FramesPerSecondText;
  232. Viewer.ResetPerformanceMonitor;
  233. end;
  234. procedure TFormBumpShader.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  235. begin
  236. Camera.AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
  237. end;
  238. procedure TFormBumpShader.LightCubeProgress(Sender: TObject; const DeltaTime, newTime: Double);
  239. begin
  240. if LightMovingCheckBox.Checked then
  241. LightCube.MoveObjectAround(Camera.TargetObject, sin(NewTime) * DeltaTime * 10, DeltaTime * 20);
  242. end;
  243. procedure TFormBumpShader.FormClose(Sender: TObject; var Action: TCloseAction);
  244. begin
  245. Cadencer.Enabled := False;
  246. end;
  247. end.