fMorphD.pas 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. unit fMorphD;
  2. interface
  3. uses
  4. Winapi.OpenGLext,
  5. Winapi.Windows,
  6. Winapi.Messages,
  7. System.SysUtils,
  8. System.Variants,
  9. System.Classes,
  10. System.Math,
  11. Vcl.Graphics,
  12. Vcl.Controls,
  13. Vcl.Forms,
  14. Vcl.Dialogs,
  15. Vcl.ExtCtrls,
  16. Vcl.StdCtrls,
  17. Vcl.Imaging.Jpeg,
  18. GLS.Texture,
  19. GLS.Cadencer,
  20. GLS.SceneViewer,
  21. GLS.Scene,
  22. GLS.Objects,
  23. GLS.FileTGA,
  24. GLS.VectorLists,
  25. GLS.VectorTypes,
  26. GLSL.UserShader,
  27. GLS.Utils,
  28. GLS.Context,
  29. GLS.VectorFileObjects,
  30. GLS.File3DS,
  31. GLS.VectorGeometry,
  32. GLS.ShadowVolume,
  33. GLS.XOpenGL,
  34. GLS.FileMD2,
  35. GLS.FileMS3D,
  36. GLS.GeomObjects,
  37. GLS.Material,
  38. GLS.Coordinates,
  39. GLS.BaseClasses,
  40. GLS.RenderContextInfo;
  41. type
  42. TGLSLFrm = class(TForm)
  43. GLScene1: TGLScene;
  44. GLViewer: TGLSceneViewer;
  45. GLCadencer1: TGLCadencer;
  46. Cam: TGLCamera;
  47. Scene: TGLDummyCube;
  48. Timer1: TTimer;
  49. CamBox: TGLDummyCube;
  50. MatLib: TGLMaterialLibrary;
  51. Light: TGLLightSource;
  52. SceneMesh: TGLFreeForm;
  53. RenderDirectGL: TGLDirectOpenGL;
  54. procedure FormCreate(Sender: TObject);
  55. procedure GLCadencer1Progress(Sender: TObject;
  56. const deltaTime, newTime: Double);
  57. procedure GLViewerMouseDown(Sender: TObject; Button: TMouseButton;
  58. Shift: TShiftState; X, Y: Integer);
  59. procedure GLViewerMouseMove(Sender: TObject; Shift: TShiftState;
  60. X, Y: Integer);
  61. procedure Timer1Timer(Sender: TObject);
  62. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  63. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  64. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  65. procedure RenderDirectGLRender(Sender: TObject;
  66. var rci: TGLRenderContextInfo);
  67. private
  68. PathToAsset: TFileName;
  69. InitDGL: Boolean;
  70. AltDGL: Boolean;
  71. mx, my: Integer;
  72. GLSLProg: TGLProgramHandle;
  73. end;
  74. var
  75. GLSLFrm: TGLSLFrm;
  76. InitShader: Integer;
  77. implementation
  78. {$R *.dfm}
  79. procedure TGLSLFrm.FormCreate(Sender: TObject);
  80. begin
  81. // SetCurrentDir(ExtractFilePath(ParamStr(0)));
  82. PathToAsset := GetCurrentAssetPath();
  83. SetCurrentDir(PathToAsset + '\model');
  84. SceneMesh.LoadFromFile('morph.3ds');
  85. InitShader := 0;
  86. InitDGL := False;
  87. AltDGL := False;
  88. GLCadencer1.Enabled := True;
  89. Timer1.Enabled := True;
  90. end;
  91. //----------------------------------------------------------
  92. procedure TGLSLFrm.RenderDirectGLRender(Sender: TObject;
  93. var rci: TGLRenderContextInfo);
  94. begin
  95. if (not InitDGL) then
  96. begin
  97. (*
  98. if not(GL_SHADER_OBJECT_ARB and GL_VERTEX_PROGRAM_ARB and
  99. GL_VERTEX_SHADER_ARB and GL_FRAGMENT_SHADER_ARB) = 0 then
  100. begin
  101. ShowMessage
  102. ('Your hardware/driver doesn''t support GLSL and can''t execute this demo!');
  103. Halt;
  104. end;
  105. *)
  106. SetCurrentDir(PathToAsset + '\shader');
  107. GLSLProg := TGLProgramHandle.CreateAndAllocate;
  108. GLSLProg.AddShader(TGLVertexShaderHandle, String(LoadAnsiStringFromFile('morph.vert')),False);
  109. GLSLProg.AddShader(TGLFragmentShaderHandle, String(LoadAnsiStringFromFile('morph.frag')),False);
  110. if (not GLSLProg.LinkProgram) then
  111. raise Exception.Create(GLSLProg.InfoLog);
  112. if (not GLSLProg.ValidateProgram) then
  113. raise Exception.Create(GLSLProg.InfoLog);
  114. // gl.CheckError;
  115. InitDGL := True;
  116. end;
  117. if (InitDGL) and (not AltDGL) then
  118. begin
  119. with GLSLProg do
  120. begin
  121. UseProgramObject;
  122. Uniform4f['lightDir'] := Light.SpotDirection.AsVector;
  123. Uniform1f['speed'] := 0.11;
  124. Uniform1f['lerpMin'] := -2.0;
  125. Uniform1f['lerpMax'] := 2.0;
  126. Uniform1f['time_0_X'] := GLCadencer1.GetCurrentTime;
  127. SceneMesh.Render(rci);
  128. EndUseProgramObject;
  129. end;
  130. end;
  131. end;
  132. //------------------------------------------------------------
  133. procedure TGLSLFrm.GLCadencer1Progress(Sender: TObject;
  134. const deltaTime, newTime: Double);
  135. begin
  136. SceneMesh.Turn(-0.1);
  137. SceneMesh.Pitch(0.1);
  138. GLViewer.Invalidate;
  139. end;
  140. procedure TGLSLFrm.GLViewerMouseDown(Sender: TObject; Button: TMouseButton;
  141. Shift: TShiftState; X, Y: Integer);
  142. begin
  143. mx := X;
  144. my := Y;
  145. end;
  146. procedure TGLSLFrm.GLViewerMouseMove(Sender: TObject; Shift: TShiftState;
  147. X, Y: Integer);
  148. begin
  149. if (ssright in Shift) then
  150. Cam.MoveAroundTarget(my - Y, mx - X);
  151. mx := X;
  152. my := Y;
  153. end;
  154. procedure TGLSLFrm.Timer1Timer(Sender: TObject);
  155. begin
  156. Caption := Format('Morph GLSL Demo. [%.2f] FPS',
  157. [GLViewer.FramesPerSecond]);
  158. GLViewer.ResetPerformanceMonitor;
  159. end;
  160. procedure TGLSLFrm.FormClose(Sender: TObject; var Action: TCloseAction);
  161. begin
  162. AltDGL := True;
  163. InitDGL := False;
  164. Timer1.Enabled := False;
  165. GLCadencer1.Enabled := False;
  166. GLSLProg.Free;
  167. end;
  168. procedure TGLSLFrm.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  169. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  170. begin
  171. Cam.AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
  172. end;
  173. end.