fShaderCompD.pas 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. unit fShaderCompD;
  2. interface
  3. uses
  4. System.SysUtils,
  5. System.Classes,
  6. Vcl.Controls,
  7. Vcl.Forms,
  8. Vcl.ExtCtrls,
  9. Vcl.StdCtrls,
  10. GLS.Texture,
  11. GLS.Cadencer,
  12. GLS.SceneViewer,
  13. GLS.Scene,
  14. GLS.Objects,
  15. GLS.Graph,
  16. GLS.VectorLists,
  17. GLScene.VectorTypes,
  18. GLScene.VectorGeometry,
  19. GLSL.Shader,
  20. GLS.GeomObjects,
  21. GLS.VectorFileObjects,
  22. GLS.SimpleNavigation,
  23. GLSL.CustomShader,
  24. GLS.Material,
  25. GLS.Coordinates,
  26. GLS.BaseClasses,
  27. GLScene.Utils,
  28. GLS.FileMD2,
  29. GLS.FileMS3D,
  30. GLS.File3DS;
  31. type
  32. TGLSLTestForm = class(TForm)
  33. Scene: TGLScene;
  34. Viewer: TGLSceneViewer;
  35. Cadencer: TGLCadencer;
  36. Camera: TGLCamera;
  37. Light: TGLLightSource;
  38. LightCube: TGLDummyCube;
  39. GLSphere1: TGLSphere;
  40. GLXYZGrid1: TGLXYZGrid;
  41. GLArrowLine1: TGLArrowLine;
  42. Panel1: TPanel;
  43. LightMovingCheckBox: TCheckBox;
  44. GUICube: TGLDummyCube;
  45. WorldCube: TGLDummyCube;
  46. Fighter: TGLActor;
  47. Teapot: TGLActor;
  48. Sphere_big: TGLActor;
  49. Sphere_little: TGLActor;
  50. MaterialLibrary: TGLMaterialLibrary;
  51. ShadeEnabledCheckBox: TCheckBox;
  52. TurnPitchrollCheckBox: TCheckBox;
  53. GLSLShader: TGLSLShader;
  54. GLSimpleNavigation1: TGLSimpleNavigation;
  55. procedure FormCreate(Sender: TObject);
  56. procedure CadencerProgress(Sender: TObject; const deltaTime, newTime: double);
  57. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  58. procedure LightCubeProgress(Sender: TObject; const deltaTime,
  59. newTime: Double);
  60. procedure ShadeEnabledCheckBoxClick(Sender: TObject);
  61. procedure GLSLShaderApply(Shader: TGLCustomGLSLShader);
  62. procedure GLSLShaderInitialize(Shader: TGLCustomGLSLShader);
  63. procedure GLSLShaderUnApply(Shader: TGLCustomGLSLShader;
  64. var ThereAreMorePasses: Boolean);
  65. procedure GLSLShaderApplyEx(Shader: TGLCustomGLSLShader;
  66. Sender: TObject);
  67. procedure GLSLShaderInitializeEx(Shader: TGLCustomGLSLShader;
  68. Sender: TObject);
  69. end;
  70. var
  71. GLSLTestForm: TGLSLTestForm;
  72. implementation
  73. {$R *.dfm}
  74. procedure TGLSLTestForm.FormCreate(Sender: TObject);
  75. begin
  76. var Path: TFileName := GetCurrentAssetPath();
  77. // Loading static models
  78. SetCurrentDir(Path + '\model');
  79. Teapot.LoadFromFile('Teapot.3ds'); //Teapot (no texture coordinates)
  80. Teapot.Scale.Scale(0.8);
  81. Sphere_big.LoadFromFile('Sphere_big.3DS'); //Sphere_big
  82. Sphere_big.Scale.Scale(70);
  83. Sphere_little.LoadFromFile('Sphere.3ds'); //Sphere_little
  84. Sphere_little.Scale.Scale(4);
  85. // Loading models with animations and skins
  86. SetCurrentDir(Path + '\modelext');
  87. Fighter.LoadFromFile('waste.md2');
  88. Fighter.SwitchToAnimation(0, True);
  89. Fighter.AnimationMode := aamLoop;
  90. Fighter.Scale.Scale(3);
  91. // Skin texture
  92. MaterialLibrary.LibMaterialByName('WasteSkin').Material.Texture.Image.LoadFromFile('waste.jpg');
  93. // Then load textures.
  94. SetCurrentDir(Path + '\map');
  95. MaterialLibrary.LibMaterialByName('Earth').Material.Texture.Image.LoadFromFile('earth.jpg');
  96. // Loading scripts from shader directory
  97. SetCurrentDir(Path + '\shader');
  98. GLSLShader.LoadShaderPrograms('Shader.Vert','Shader.Frag');
  99. GLSLShader.Enabled := True;
  100. end;
  101. procedure TGLSLTestForm.ShadeEnabledCheckBoxClick(Sender: TObject);
  102. begin
  103. GLSLShader.Enabled := ShadeEnabledCheckBox.Checked;
  104. end;
  105. procedure TGLSLTestForm.GLSLShaderApply(Shader: TGLCustomGLSLShader);
  106. begin
  107. {* Old variant of Apply
  108. with Shader do
  109. begin
  110. Param['DiffuseColor'].AsVector4f := VectorMake(1, 1, 1, 1);
  111. Param['AmbientColor'].AsVector4f := VectorMake(0.2, 0.2, 0.2, 1);
  112. Param['LightIntensity'].AsVector1f := 1;
  113. Param['MainTexture'].AsTexture2D[0] :=
  114. MaterialLibrary.LibMaterialByName('Earth').Material.Texture;
  115. end;
  116. *}
  117. end;
  118. procedure TGLSLTestForm.GLSLShaderApplyEx(Shader: TGLCustomGLSLShader;
  119. Sender: TObject);
  120. begin
  121. with Shader do
  122. begin
  123. Param['DiffuseColor'].AsVector4f := VectorMake(1, 1, 1, 1);
  124. Param['AmbientColor'].AsVector4f := VectorMake(0.2, 0.2, 0.2, 1);
  125. Param['LightIntensity'].AsVector1f := 1;
  126. SetTex('MainTexture', TGLLibMaterial(Sender).Material.Texture);
  127. end;
  128. end;
  129. procedure TGLSLTestForm.GLSLShaderInitialize(Shader: TGLCustomGLSLShader);
  130. begin
  131. with Shader do
  132. begin
  133. // Nothing.
  134. end;
  135. end;
  136. procedure TGLSLTestForm.GLSLShaderInitializeEx(Shader: TGLCustomGLSLShader;
  137. Sender: TObject);
  138. begin
  139. with Shader do
  140. begin
  141. // For AMD's shaders validation
  142. SetTex('MainTexture', TGLLibMaterial(Sender).Material.Texture);
  143. end;
  144. end;
  145. procedure TGLSLTestForm.GLSLShaderUnApply(Shader: TGLCustomGLSLShader;
  146. var ThereAreMorePasses: Boolean);
  147. begin
  148. with Shader do
  149. begin
  150. // Nothing.
  151. end;
  152. end;
  153. procedure TGLSLTestForm.CadencerProgress(Sender: TObject; const deltaTime, newTime: double);
  154. begin
  155. Viewer.Invalidate;
  156. if TurnPitchrollCheckBox.Checked then
  157. begin
  158. Sphere_big.Pitch(40 * deltaTime);
  159. Sphere_big.Turn(40 * deltaTime);
  160. Sphere_little.Roll(40 * deltaTime);
  161. end;
  162. end;
  163. procedure TGLSLTestForm.FormClose(Sender: TObject; var Action: TCloseAction);
  164. begin
  165. Cadencer.Enabled := False;
  166. end;
  167. procedure TGLSLTestForm.LightCubeProgress(Sender: TObject; const deltaTime,
  168. newTime: Double);
  169. begin
  170. if LightMovingCheckBox.Checked then
  171. LightCube.MoveObjectAround(Camera.TargetObject, sin(NewTime) * deltaTime * 10, deltaTime * 20);
  172. end;
  173. end.