fOceanD.pas 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. unit fOceanD;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. Winapi.OpenGLext,
  6. System.SysUtils,
  7. System.Classes,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.Dialogs,
  12. Vcl.ExtCtrls,
  13. Vcl.ComCtrls,
  14. GLS.SceneViewer,
  15. GLS.Scene,
  16. GLS.Texture,
  17. GLS.Objects,
  18. GLS.Context,
  19. GLScene.VectorGeometry,
  20. GLS.GeomObjects,
  21. GLS.Cadencer,
  22. GLSL.UserShader,
  23. GLScene.Utils,
  24. GLS.Graph,
  25. GLScene.VectorTypes,
  26. GLS.SkyDome,
  27. GLS.VectorLists,
  28. GLS.FileDDS,
  29. GLS.Material,
  30. GLS.Coordinates,
  31. GLS.BaseClasses,
  32. GLS.RenderContextInfo,
  33. GLS.SimpleNavigation,
  34. GLS.TextureFormat,
  35. GLS.Color;
  36. type
  37. TForm1 = class(TForm)
  38. GLScene1: TGLScene;
  39. GLSceneViewer1: TGLSceneViewer;
  40. GLCamera: TGLCamera;
  41. MatLib: TGLMaterialLibrary;
  42. GLLightSource1: TGLLightSource;
  43. GLCadencer1: TGLCadencer;
  44. GLSphere1: TGLSphere;
  45. DOInitialize: TGLDirectOpenGL;
  46. GLUserShader1: TGLUserShader;
  47. GLHeightField1: TGLHeightField;
  48. GLMemoryViewer1: TGLMemoryViewer;
  49. GLScene2: TGLScene;
  50. CameraCubeMap: TGLCamera;
  51. GLEarthSkyDome1: TGLEarthSkyDome;
  52. GLSphere2: TGLSphere;
  53. DOOceanPlane: TGLDirectOpenGL;
  54. GLSimpleNavigation1: TGLSimpleNavigation;
  55. procedure FormCreate(Sender: TObject);
  56. procedure DOInitializeRender(Sender: TObject;
  57. var rci: TGLRenderContextInfo);
  58. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  59. X, Y: Integer);
  60. procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
  61. newTime: Double);
  62. procedure GLUserShader1DoApply(Sender: TObject;
  63. var rci: TGLRenderContextInfo);
  64. procedure GLUserShader1DoUnApply(Sender: TObject; Pass: Integer;
  65. var rci: TGLRenderContextInfo; var Continue: Boolean);
  66. procedure GLHeightField1GetHeight(const x, y: Single; var z: Single;
  67. var color: TVector4f; var texPoint: TTexPoint);
  68. procedure DOOceanPlaneRender(Sender: TObject;
  69. var rci: TGLRenderContextInfo);
  70. procedure GLMemoryViewer1BeforeRender(Sender: TObject);
  71. public
  72. Path: TFileName;
  73. mx, my, dmx, dmy: Integer;
  74. programObject: TGLProgramHandle;
  75. end;
  76. var
  77. Form1: TForm1;
  78. PathCM: TFileName;
  79. CubeMap: TGLTexture;
  80. implementation
  81. {$R *.dfm}
  82. procedure TForm1.FormCreate(Sender: TObject);
  83. begin
  84. Path := GetCurrentAssetPath();
  85. // Loading noise texture
  86. SetCurrentDir(Path + '\texture');
  87. MatLib.LibMaterialByName('water').Material.Texture.Image.LoadFromFile('noise.bmp');
  88. // Load the cube map which is used both for environment and as reflection texture
  89. SetCurrentDir(Path + '\cubemap');
  90. CubeMap := TGLTexture.Create(Self);
  91. Cubemap.ImageClassName := 'TGLCompositeImage';
  92. Cubemap.Image.LoadFromFile('Skybox.dds'); // if loading all 6 images
  93. Cubemap.TextureWrap := twNone;
  94. Cubemap.FilteringQuality := tfAnisotropic;
  95. Cubemap.Disabled := False;
  96. with MatLib.LibMaterialByName('cubeMap').Material.Texture do
  97. begin
  98. ImageClassName := TGLCubeMapImage.ClassName;
  99. with Image as TGLCubeMapImage do
  100. with Cubemap do
  101. begin
  102. // Load all 6 texture map components of the cube map
  103. // The 'PX', 'NX', etc. refer to 'positive X', 'negative X', etc.
  104. // and follow the RenderMan specs/conventions
  105. Picture[cmtPX].LoadFromFile('cm_left.jpg');
  106. Picture[cmtNX].LoadFromFile('cm_right.jpg');
  107. Picture[cmtPY].LoadFromFile('cm_top.jpg');
  108. Picture[cmtNY].LoadFromFile('cm_bottom.jpg');
  109. Picture[cmtPZ].LoadFromFile('cm_back.jpg');
  110. Picture[cmtNZ].LoadFromFile('cm_front.jpg');
  111. end;
  112. end;
  113. end;
  114. procedure TForm1.DoInitializeRender(Sender: TObject;
  115. var rci: TGLRenderContextInfo);
  116. begin
  117. if not (GL.ARB_shader_objects and
  118. GL.ARB_vertex_program and GL.ARB_vertex_shader
  119. and GL.ARB_fragment_shader) then
  120. begin
  121. ShowMessage('Your hardware/driver doesn''t support GLSL and can''t execute this demo!');
  122. Halt;
  123. end;
  124. if DOInitialize.Tag <> 0 then
  125. Exit;
  126. DOInitialize.Tag := 1;
  127. GLSceneViewer1.Buffer.RenderingContext.Deactivate;
  128. GLMemoryViewer1.RenderCubeMapTextures(matLib.LibMaterialByName('cubeMap').Material.Texture);
  129. GLSceneViewer1.Buffer.RenderingContext.Activate;
  130. programObject := TGLProgramHandle.CreateAndAllocate;
  131. SetCurrentDir(Path + '\shader');
  132. programObject.AddShader(TGLVertexShaderHandle, string(LoadAnsiStringFromFile('ocean_vp.glsl')), True);
  133. programObject.AddShader(TGLFragmentShaderHandle, string(LoadAnsiStringFromFile('ocean_fp.glsl')), True);
  134. if not programObject.LinkProgram then
  135. raise Exception.Create(programObject.InfoLog);
  136. programObject.UseProgramObject;
  137. programObject.Uniform1i['NormalMap'] := 0;
  138. programObject.Uniform1i['EnvironmentMap'] := 1;
  139. programObject.EndUseProgramObject;
  140. // initialize the heightmap
  141. with MatLib.LibMaterialByName('water') do
  142. rci.GLStates.TextureBinding[0, ttTexture2D] := Material.Texture.Handle;
  143. // initialize the heightmap
  144. with MatLib.LibMaterialByName('cubeMap') do
  145. rci.GLStates.TextureBinding[1, ttTextureCube] := Material.Texture.Handle;
  146. if not programObject.ValidateProgram then
  147. raise Exception.Create(programObject.InfoLog);
  148. end;
  149. procedure TForm1.GLUserShader1DoApply(Sender: TObject;
  150. var rci: TGLRenderContextInfo);
  151. var
  152. camPos: TGLVector;
  153. begin
  154. programObject.UseProgramObject;
  155. programObject.Uniform1f['Time'] := GLCadencer1.CurrentTime * 0.05;
  156. camPos := GLCamera.AbsolutePosition;
  157. programObject.Uniform4f['EyePos'] := camPos;
  158. end;
  159. procedure TForm1.GLUserShader1DoUnApply(Sender: TObject; Pass: Integer;
  160. var rci: TGLRenderContextInfo; var Continue: Boolean);
  161. begin
  162. programObject.EndUseProgramObject;
  163. end;
  164. procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  165. Shift: TShiftState; X, Y: Integer);
  166. begin
  167. if ssLeft in Shift then
  168. begin
  169. Inc(dmx, mx - x);
  170. Inc(dmy, my - y);
  171. end;
  172. mx := x;
  173. my := y;
  174. end;
  175. procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
  176. newTime: Double);
  177. begin
  178. if (dmx <> 0) or (dmy <> 0) then
  179. begin
  180. GLCamera.MoveAroundTarget(dmy * 0.3, dmx * 0.3);
  181. dmx := 0;
  182. dmy := 0;
  183. end;
  184. GLSceneViewer1.Invalidate;
  185. end;
  186. procedure TForm1.GLHeightField1GetHeight(const x, y: Single; var z: Single;
  187. var color: TVector4f; var texPoint: TTexPoint);
  188. begin
  189. z := 0;
  190. end;
  191. const
  192. cExtent = 200;
  193. var
  194. vbo: TGLVBOArrayBufferHandle;
  195. nbVerts: Integer;
  196. procedure TForm1.DOOceanPlaneRender(Sender: TObject;
  197. var rci: TGLRenderContextInfo);
  198. var
  199. x, y: Integer;
  200. v: TGLTexPointList;
  201. cont: Boolean;
  202. begin
  203. GLUserShader1DoApply(Self, rci);
  204. gl.EnableClientState(GL_VERTEX_ARRAY);
  205. if not Assigned(vbo) then
  206. begin
  207. v := TGLTexPointList.Create;
  208. v.Capacity := Sqr(cExtent + 1);
  209. y := -cExtent;
  210. while y < cExtent do
  211. begin
  212. x := -cExtent;
  213. while x <= cExtent do
  214. begin
  215. v.Add(y, x);
  216. v.Add(y + 2, x);
  217. Inc(x, 2);
  218. end;
  219. Inc(y, 2);
  220. v.Add(y, cExtent);
  221. v.Add(y, -cExtent);
  222. end;
  223. vbo := TGLVBOArrayBufferHandle.CreateAndAllocate();
  224. vbo.Bind;
  225. vbo.BufferData(v.List, v.DataSize, GL_STATIC_DRAW_ARB);
  226. nbVerts := v.Count;
  227. gl.VertexPointer(2, GL_FLOAT, 0, nil);
  228. gl.DrawArrays(GL_QUAD_STRIP, 0, nbVerts);
  229. vbo.UnBind;
  230. v.Free;
  231. end
  232. else
  233. begin
  234. vbo.Bind;
  235. gl.VertexPointer(2, GL_FLOAT, 0, nil);
  236. gl.DrawArrays(GL_TRIANGLE_STRIP, 0, nbVerts);
  237. vbo.UnBind;
  238. end;
  239. gl.DisableClientState(GL_VERTEX_ARRAY);
  240. GLUserShader1DoUnApply(Self, 0, rci, cont);
  241. end;
  242. procedure TForm1.GLMemoryViewer1BeforeRender(Sender: TObject);
  243. begin
  244. GLMemoryViewer1.Buffer.RenderingContext.ShareLists(GLSceneViewer1.Buffer.RenderingContext);
  245. GLMemoryViewer1.BeforeRender := nil;
  246. end;
  247. end.