Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Last revisionBoth sides next revision
1.0.0:water [2023/02/22 14:57] – created - external edit 127.0.0.11.0.0:water [2023/10/24 14:17] – [Example] admin
Line 135: Line 135:
  
 <file pascal> <file pascal>
-procedure TForm1.CreateWater(const AAssetsPath String); +unit Unit1; 
-var LTexPath : String;+ 
 +interface 
 + 
 +uses 
 +  System.SysUtils, 
 +  System.Types, 
 +  System.UITypes, 
 +  System.Classes, 
 +  System.Variants, 
 +  System.IOUtils, 
 +  System.Math.Vectors, 
 +  FMX.Types, 
 +  FMX.Controls, 
 +  FMX.Forms, 
 +  FMX.Graphics, 
 +  FMX.Dialogs, 
 +  FMX.Types3D, 
 +  FMX.Controls3D, 
 +  FMX.Objects3d, 
 +  FMX.MaterialSources, 
 +  FMX.StdCtrls, 
 +  FMX.Controls.Presentation, 
 +  Gorilla.DefTypes, 
 +  Gorilla.Viewport, 
 +  Gorilla.Skybox, 
 +  Gorilla.Cube, 
 +  Gorilla.Plane, 
 +  Gorilla.Terrain, 
 +  Gorilla.Terrain.Utils, 
 +  Gorilla.Terrain.Algorithm, 
 +  Gorilla.Controller.Passes.CustomBlur, 
 +  Gorilla.Controller.Passes.Reflection, 
 +  Gorilla.Controller.Passes.Refraction, 
 +  Gorilla.Controller.Passes.CustomDepth, 
 +  Gorilla.Controller.Passes.Environment, 
 +  Gorilla.Material.Water, 
 +  Gorilla.Material.Lambert, 
 +  System.Generics.Collections, 
 +  FMX.Edit, FMX.EditBox, FMX.NumberBox, FMX.ListBox, FMX.Colors; 
 + 
 +type 
 +  TForm1 = class(TForm) 
 +    procedure FormCreate(Sender: TObject); 
 +  private 
 +    FGorilla  : TGorillaViewport; 
 +    FLight    : TLight; 
 +    FLightPos : Single; 
 +    FSkyBox   : TGorillaSkyBox; 
 +    FTerrain  : TGorillaTerrain; 
 +    FTerrainMat : TGorillaLambertMaterialSource; 
 +    FWaterPlane : TGorillaPlane; 
 +    FWaterMat   : TGorillaWaterMaterialSource; 
 +    FReflection : TGorillaRenderPassReflection; 
 +    FRefraction : TGorillaRenderPassRefraction; 
 +    FReflectBody : TGorillaCube; 
 +    FReflectBodyMat : TGorillaLambertMaterialSource; 
 +  public 
 +    { Public-Deklarationen } 
 +  end; 
 + 
 +var 
 +  Form1: TForm1; 
 + 
 +implementation 
 + 
 +{$R *.fmx} 
 + 
 +uses 
 +  Gorilla.Utils.Math, 
 +  Gorilla.Control, 
 +  Gorilla.Controller, 
 +  Gorilla.Context.Texturing; 
 + 
 +procedure TForm1.FormCreate(SenderTObject); 
 +var LPath : String;
 begin begin
-  LTexPath := IncludeTrailingPathDelimiter(AAssetsPath + 'water');+  // Get the platform independent assets path 
 +{$IFDEF MSWINDOWS} 
 +  LPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 
 +    IncludeTrailingPathDelimiter('assets'); 
 +{$ELSE} 
 +  LPath := IncludeTrailingPathDelimiter(TPath.GetHomePath()); 
 +{$ENDIF}
  
-  /// create the water plane +  // Create the Gorilla3D viewport 
-  FWaterPlane := TGorillaPlane.Create(FViewport); +  FGorilla := TGorillaViewport.Create(Self); 
-  FWaterPlane.Name := 'WaterPlane1'; +  FGorilla.Name := 'GorillaViewport1'; 
-  FWaterPlane.BeginUpdate();+  FGorilla.Color := TAlphaColorRec.Black; 
 +  FGorilla.OnMouseUp := DoOnViewportMouseUp; 
 +  FGorilla.FXAA := 0; 
 + 
 +  // Create a light source 
 +  FLight := TLight.Create(FGorilla); 
 +  FLight.Parent := FGorilla; 
 +  FLight.Name := 'GorillaLight1'; 
 +  FLight.LightType := TLightType.Point; 
 +  FLight.AbsolutePosition := Vector3D(0, -25, -5); 
 +  FLightPos := 0; 
 + 
 +  // Skybox to have more reflections 
 +  FSkyBox := TGorillaSkyBox.Create(FGorilla); 
 +  FSkyBox.Parent := FGorilla; 
 + 
 +  // Terrain with random generation 
 +  FTerrain := TGorillaTerrain.Create(FGorilla); 
 +  FTerrain.Parent := FGorilla; 
 +  fTerrain.BeginUpdate();
   try   try
-    FWaterPlane.Parent := FViewport+    FTerrain.ResolutionX := 128
-    FWaterPlane.HitTest := false+    FTerrain.ResolutionY := 128
-    FWaterPlane.RotationAngle.X := -90+    FTerrain.HitTest := false
-    FWaterPlane.Width  := MAP_SIZE+    FTerrain.Height := 1
-    FWaterPlane.Height := MAP_SIZE+    FTerrain.Scale.X := 10
-    FWaterPlane.Depth  := 1; +    FTerrain.Scale.Y := 1; 
-    FWaterPlane.SubdivisionsHeight := 64; +    FTerrain.Scale.:= 10
-    FWaterPlane.SubdivisionsWidth  := 64+    FTerrain.RandomTerrain(TRandomTerrainAlgorithmType.DiamondSquare, true);
-    FWaterPlane.Position.Y := -25;+
   finally   finally
-    FWaterPlane.EndUpdate();+    FTerrain.EndUpdate();
   end;   end;
  
-  /// create reflection render pass for water material +  // Create a material for the terrain mesh 
-  FReflection := TGorillaRenderPassReflection.Create(FViewport); +  FTerrainMat := TGorillaLambertMaterialSource.Create(fTerrain); 
-  FReflection.Viewport := FViewport+  FTerrainMat.Parent := FTerrain; 
-  FReflection.Camera := FCamera;+  TGorillaLambertMaterialSource(FTerrainMat).Texture.LoadFromFile(LPath + 'terrain.jpg'); 
 +  FTerrain.MaterialSource := FTerrainMat; 
 +   
 +  // Water surface plane to render water    
 +  FWaterPlane := TGorillaPlane.Create(FGorilla); 
 +  FWaterPlane.SetHitTestValue(false); 
 +  FWaterPlane.Parent := FGorilla; 
 +  FWaterPlane.RotationAngle.X := 90; 
 +  FWaterPlane.Width  := 10; 
 +  FWaterPlane.Height := 10; 
 +  FWaterPlane.Position.Y := -0.5; 
 +   
 +  // High resolution for ripple testing - vertex shader modifies it 
 +  FWaterPlane.SubdivisionsWidth  := 256; 
 +  FWaterPlane.SubdivisionsHeight := 256; 
 + 
 +  // Water shader material attached to our water surface plane 
 +  FWaterMat := TGorillaWaterMaterialSource.Create(FWaterPlane); 
 +  FWaterMat.Parent := FWaterPlane; 
 + 
 +  FWaterMat.DisplacementMap.LoadFromFile(LPath + 'water-height.jpg'); 
 +  FWaterMat.DisplIntensity := 0.1; 
 +  FWaterMat.NormalMap.LoadFromFile(LPath + 'water-normal.jpg'); 
 +  FWaterMat.DUDVTexture.LoadFromFile(LPath + 'water-dudv.jpg'); 
 +  FWaterMat.SpecularMap.LoadFromFile(LPath + 'water-specular.jpg'); 
 +  FWaterMat.FoamTexture.LoadFromFile(LPath + 'water-foam.jpg'); 
 +  FWaterMat.TextureTiling[WATER_TEX_FOAM] := PointF(4, 4); 
 + 
 +  FWaterMat.ShoreTexture.LoadFromFile(LPath + 'water-shore.png'); 
 +  FWaterMat.TextureTiling[WATER_TEX_SHORE] := PointF(2, 2); 
 + 
 +  // Link material to the water surface plane 
 +  FWaterPlane.MaterialSource := FWaterMat; 
 + 
 +  // Reflection render pass 
 +  FReflection := TGorillaRenderPassReflection.Create(FGorilla); 
 +  FReflection.Viewport := FGorilla; 
 +   
 +  // Ignore the water plane, otherwise the rendering might be black
   FReflection.IgnoreControl(FWaterPlane);   FReflection.IgnoreControl(FWaterPlane);
   FReflection.MirrorSize := FWaterPlane.Width;   FReflection.MirrorSize := FWaterPlane.Width;
      
-  // set the current position of the water plane as mirror plane +  // The mirror surface position is important to to render correctly 
-  // this needs to be updatedif water plane moves +  // Because displacement mapping is activatedwe need to render reflections 
-  FReflection.MirrorPosition := TPoint3D(FWaterPlane.AbsolutePosition);+  // with the displacement offset 
 +  FReflection.MirrorPosition.Point := TPoint3D(FWaterPlane.AbsolutePosition) 
 +    Point3D(0, -FWaterMat.DisplIntensity, 0); 
 +  
 +  // We do not need fullscreen rendering for reflections, half of the size is enough 
 +  FReflection.ViewportScale := 0.5;
   FReflection.Enabled := true;   FReflection.Enabled := true;
  
-  /// create refraction render pass for water material +  // Refraction render pass 
-  FRefraction := TGorillaRenderPassRefraction.Create(FViewport); +  FRefraction := TGorillaRenderPassRefraction.Create(fGorilla); 
-  FRefraction.Viewport := FViewport+  FRefraction.Viewport := fGorilla; 
-  FRefraction.IgnoreControl(FWaterPlane);+   
 +  // Ignore the water plane, otherwise the rendering might be black 
 +  FRefraction.IgnoreControl(fWaterPlane); 
 +   
 +  // The mirror surface position is important to to render correctly 
 +  // Because displacement mapping is activated, we need to render reflections 
 +  // with the displacement offset 
 +  FRefraction.SurfacePosition.Point := TPoint3D(FWaterPlane.AbsolutePosition
 +    Point3D(0, -FWaterMat.DisplIntensity, 0); 
 +  
 +  // We do not need fullscreen rendering for refractions, half of the size is enough 
 +  FRefraction.ViewportScale := 0.5;
   FRefraction.Enabled := true;   FRefraction.Enabled := true;
  
-  /// create material source +  // Link reflection and refraction render passes to the material 
-  FWaterMaterial := TGorillaWaterMaterialSource.Create(FWaterPlane)+  FWaterMat.ReflectionPass := fReflection
-  FWaterMaterial.Parent := FWaterPlane+  FWaterMat.Reflections := true
-  FWaterMaterial.NormalMap.LoadFromFile(LTexPath + 'water_normal.png')+  FWaterMat.ReflectionPower := 1
-  FWaterMaterial.DUDVTexture.LoadFromFile(LTexPath + 'water3-dudv.jpg')+  FWaterMat.RefractionPass := fRefraction
-  FWaterMaterial.DisplacementMap.LoadFromFile(LTexPath + 'water_height.png')+  FWaterMat.Refractions := true
-  FWaterMaterial.SpecularMap.LoadFromFile(LTexPath + 'water_height.png'); +  FWaterMat.RefractionPower := 1;
-  FWaterMaterial.FoamTexture.LoadFromFile(LTexPath + 'foam.png');+
  
-  /// link reflection and refraction render pass to water material +  // Create a reflective body and material to test reflections / refraction 
-  FWaterMaterial.ReflectionPass := FReflection+  FReflectBody := TGorillaCube.Create(FGorilla)
-  FWaterMaterial.RefractionPass := FRefraction;+  FReflectBody.Parent := FGorilla;
  
-  FWaterPlane.MaterialSource := FWaterMaterial;+  FReflectBodyMat := TGorillaLambertMaterialSource.Create(FReflectBody); 
 +  FReflectBodyMat.Parent := FReflectBody; 
 +  FReflectBodyMat.UseTexture0 := false; 
 +  FReflectBody.MaterialSource := FReflectBodyMat;
 end; end;
 +
 +end.
 </file> </file>
  
 Next step: [[bokeh|Bokeh]] Next step: [[bokeh|Bokeh]]