fBumpShaderD.pas 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. unit fBumpShaderD;
  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. GLS.FileMD2,
  29. GLS.FileSMD,
  30. GLSL.Shader,
  31. GLSL.CustomShader,
  32. GLSL.BumpShaders,
  33. Formats.DDSImage;
  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 loading modelexts
  94. var Path: TFileName := GetCurrentAssetPath();
  95. SetCurrentDir(Path + '\modelext');
  96. Fighter.LoadFromFile('TRINITYrage.smd'); //Fighter
  97. Fighter.AddDataFromFile('walk.smd');
  98. Fighter.Animations[1].MakeSkeletalTranslationStatic;
  99. Fighter.AddDataFromFile('run.smd');
  100. Fighter.Animations[2].MakeSkeletalTranslationStatic;
  101. Fighter.AddDataFromFile('long_jump.smd');
  102. Fighter.AddDataFromFile('jump.smd');
  103. Fighter.AddDataFromFile('look_left_right.smd');
  104. Fighter.Animations[5].MakeSkeletalRotationDelta;
  105. Fighter.SwitchToAnimation(1);
  106. (*
  107. // or use a quake md2 model
  108. Fighter.LoadFromFile('waste.md2'); //Fighter
  109. Fighter.SwitchToAnimation(0, True);
  110. Fighter.AnimationMode := aamLoop;
  111. Fighter.Scale.Scale(3);
  112. *)
  113. Fighter.AnimationMode := aamLoop;
  114. Fighter.Scale.Scale(3);
  115. // Fighter.MeshObjects.BuildTangentSpace;
  116. // Loading static models
  117. SetCurrentDir(Path + '\model');
  118. Teapot.LoadFromFile('Teapot.3ds'); //Teapot
  119. Teapot.Scale.Scale(0.8);
  120. // Teapot.MeshObjects.BuildTangentSpace; does not have texture coordinates...
  121. Sphere_big.LoadFromFile('Sphere_big.3DS'); //Sphere_big
  122. Sphere_big.Scale.Scale(70);
  123. Sphere_big.MeshObjects.BuildTangentSpace;
  124. Sphere_little.LoadFromFile('Sphere.3ds'); //Sphere_little
  125. Sphere_little.Scale.Scale(4);
  126. Sphere_little.MeshObjects.BuildTangentSpace;
  127. // Then load textures
  128. SetCurrentDir(Path + '\texture');
  129. MaterialLibrary.LibMaterialByName('Earth').Material.Texture.Image.LoadFromFile('Earth.jpg');
  130. MaterialLibrary.LibMaterialByName('EarthGross').Material.Texture.Image.LoadFromFile('EarthSpec.dds');
  131. MaterialLibrary.LibMaterialByName('EarthNormals').Material.Texture.Image.LoadFromFile('EarthNormals.jpg');
  132. // Create Shader
  133. MultiLightShader := TGLSLMLBumpShader.Create(Self);
  134. MultiLightShader.LightSources := [1, 2];
  135. MultiLightShader.LightCompensation := 0.7;
  136. MultiLightShader.NormalTexture := MaterialLibrary.LibMaterialByName('EarthNormals').Material.Texture;
  137. MultiLightShader.SpecularTexture := MaterialLibrary.LibMaterialByName('EarthGross').Material.Texture;
  138. // Attach shader to the material
  139. MaterialLibrary.LibMaterialByName('Earth').Shader := MyBumpShader;
  140. for I := 0 to TrinityMatlib.Materials.Count - 1 do
  141. TrinityMatlib.Materials[I].Shader := MyBumpShader;
  142. ShowNotGLSceneObjectsCheckBoxClick(Sender);
  143. end;
  144. procedure TFormBumpShader.ShaderEnabledCheckBoxClick(Sender: TObject);
  145. begin
  146. MyBumpShader.Enabled := ShaderEnabledCheckBox.Checked;
  147. MultiLightShader.Enabled := ShaderEnabledCheckBox.Checked;
  148. end;
  149. procedure TFormBumpShader.MultiLightShaderCheckBoxClick(Sender: TObject);
  150. var
  151. I: Integer;
  152. begin
  153. if MultiLightShaderCheckBox.Checked then
  154. begin
  155. MaterialLibrary.LibMaterialByName('Earth').Shader := MultiLightShader;
  156. for I := 0 to TrinityMatlib.Materials.Count - 1 do
  157. TrinityMatlib.Materials[I].Shader := MultiLightShader;
  158. end
  159. else
  160. begin
  161. MaterialLibrary.LibMaterialByName('Earth').Shader := MyBumpShader;
  162. for I := 0 to TrinityMatlib.Materials.Count - 1 do
  163. TrinityMatlib.Materials[I].Shader := MyBumpShader;
  164. end;
  165. Light2.Shining := MultiLightShaderCheckBox.Checked;
  166. LightCube2.Visible := MultiLightShaderCheckBox.Checked;
  167. end;
  168. procedure TFormBumpShader.UseSpecularTextureCheckBoxClick(Sender: TObject);
  169. begin
  170. if UseSpecularTextureCheckBox.Checked then
  171. begin
  172. MyBumpShader.SpecularTexture := MaterialLibrary.LibMaterialByName('EarthGross').Material.Texture;
  173. MultiLightShader.SpecularTexture := MaterialLibrary.LibMaterialByName('EarthGross').Material.Texture;
  174. end
  175. else
  176. begin
  177. MyBumpShader.SpecularTexture := nil;
  178. MultiLightShader.SpecularTexture := nil;
  179. end;
  180. end;
  181. procedure TFormBumpShader.UseNormalTextureCheckBoxClick(Sender: TObject);
  182. begin
  183. if UseNormalTextureCheckBox.Checked then
  184. begin
  185. MyBumpShader.NormalTexture := MaterialLibrary.LibMaterialByName('EarthNormals').Material.Texture;
  186. MultiLightShader.NormalTexture := MaterialLibrary.LibMaterialByName('EarthNormals').Material.Texture;
  187. end
  188. else
  189. begin
  190. MyBumpShader.NormalTexture := nil;
  191. MultiLightShader.NormalTexture := nil;
  192. end;
  193. end;
  194. procedure TFormBumpShader.ShowNotGLSceneObjectsCheckBoxClick(
  195. Sender: TObject);
  196. begin
  197. Teapot.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  198. Fighter.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  199. GLCube.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  200. GLDodecahedron.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  201. GLSphere.Visible := ShowNotGLSceneObjectsCheckBox.Checked;
  202. end;
  203. procedure TFormBumpShader.CadencerProgress(Sender: TObject; const DeltaTime, newTime: Double);
  204. begin
  205. Viewer.Invalidate;
  206. if RollPitchTurnCheckBox.Checked then
  207. begin
  208. Sphere_big.Turn(DeltaTime * 40);
  209. Sphere_big.Roll(DeltaTime * 40);
  210. Sphere_little.Pitch(DeltaTime * 20);
  211. Fighter.Roll(DeltaTime * 20);
  212. Teapot.Roll(-DeltaTime * 10);
  213. GLCube.Pitch(-DeltaTime * 10);
  214. GLDodecahedron.Pitch(DeltaTime * 10);
  215. GLSphere.Roll(-DeltaTime * 10);
  216. end;
  217. end;
  218. procedure TFormBumpShader.ViewerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  219. begin
  220. mx := X;
  221. my := Y;
  222. end;
  223. procedure TFormBumpShader.ViewerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  224. begin
  225. if (ssRight in Shift) and (ssLeft in Shift) then
  226. Camera.AdjustDistanceToTarget(Power(1.01, Y - my))
  227. else
  228. if (ssRight in Shift) or (ssLeft in Shift) then
  229. Camera.MoveAroundTarget(my - Y, mx - X);
  230. mx := X;
  231. my := Y;
  232. end;
  233. procedure TFormBumpShader.Timer1Timer(Sender: TObject);
  234. begin
  235. Caption := 'GLSL Bump Shader - ' + Viewer.FramesPerSecondText;
  236. Viewer.ResetPerformanceMonitor;
  237. end;
  238. procedure TFormBumpShader.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  239. begin
  240. Camera.AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
  241. end;
  242. procedure TFormBumpShader.LightCubeProgress(Sender: TObject; const DeltaTime, newTime: Double);
  243. begin
  244. if LightMovingCheckBox.Checked then
  245. LightCube.MoveObjectAround(Camera.TargetObject, sin(NewTime) * DeltaTime * 10, DeltaTime * 20);
  246. end;
  247. procedure TFormBumpShader.FormClose(Sender: TObject; var Action: TCloseAction);
  248. begin
  249. Cadencer.Enabled := False;
  250. end;
  251. end.