fOceanD.pas 7.5 KB

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