Water.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /******************************************************************************/
  2. #if EE_PRIVATE
  3. #define WATER_SMOOTH 0.1f
  4. #endif
  5. /******************************************************************************/
  6. struct WaterMtrl // Water Material
  7. {
  8. Flt density , // density , 0..1 , default=0.3
  9. density_add , // factor added to density , 0..1 , default=0.45
  10. density_underwater , // density when viewed underwater, 0..1 , default=0.02
  11. density_underwater_add, // factor added to density when viewed underwater, 0..1 , default=0.6
  12. scale_color , // scale color texture , 0..Inf , default=200
  13. scale_normal , // scale normal texture , 0..Inf , default=10
  14. scale_bump , // scale bump texture , 0..Inf , default=100
  15. rough , // roughness , 0..Inf , default=1
  16. reflect_tex , // reflection power of texture , 0..1 , default=0.1
  17. reflect_world , // reflection power of world , 0..1 , default=0.18 (0 is the fastest)
  18. refract , // refraction power , 0..1 , default=0.10 (0 is the fastest)
  19. refract_reflection , // refraction of the reflection , 0..1 , default=0.06
  20. refract_underwater , // refraction when viewed underwater , 0..1 , default=0.01 (0 is the fastest)
  21. specular , // specular amount , 0..Inf , default=1.5
  22. wave_scale , // vertical wave scale , 0..1 , default=0.25 (0 is the fastest)
  23. fresnel_pow , // fresnel term power , 0..Inf , default=5.5
  24. fresnel_rough ; // fresnel term roughness , 0..Inf , default=4
  25. Vec fresnel_color , // fresnel term color , (0,0,0)..(1,1,1), default=(0.10, 0.10, 0.10)
  26. color , // color , (0,0,0)..(1,1,1), default=(0.42, 0.50, 0.58)
  27. color_underwater0 , // color when viewed underwater on surface , (0,0,0)..(1,1,1), default=(0.26, 0.35, 0.42)
  28. color_underwater1 ; // color when viewed underwater deep , (0,0,0)..(1,1,1), default=(0.10, 0.20, 0.30)
  29. // set / get
  30. WaterMtrl& colorMap(C ImagePtr &image); C ImagePtr& colorMap()C {return _color_map ;} // set/get color map
  31. WaterMtrl& normalMap(C ImagePtr &image); C ImagePtr& normalMap()C {return _normal_map ;} // set/get normal map
  32. WaterMtrl& reflectionMap(C ImagePtr &image); C ImagePtr& reflectionMap()C {return _reflection_map;} // set/get reflection map
  33. // operations
  34. WaterMtrl& reset (); // reset to default values
  35. WaterMtrl& validate(); // this needs to be called after manually changing the parameters/textures
  36. #if EE_PRIVATE
  37. void set();
  38. #endif
  39. // io
  40. Bool save(C Str &name)C; // save, false on fail
  41. Bool load(C Str &name) ; // load, false on fail
  42. Bool save(File &f, CChar *path=null)C; // save, 'path'=path at which resource is located (this is needed so that the sub-resources can be accessed with relative path), false on fail
  43. Bool load(File &f, CChar *path=null) ; // load, 'path'=path at which resource is located (this is needed so that the sub-resources can be accessed with relative path), false on fail
  44. WaterMtrl();
  45. #if !EE_PRIVATE
  46. private:
  47. #endif
  48. ImagePtr _color_map, _normal_map, _reflection_map, _bump;
  49. };
  50. /******************************************************************************/
  51. DECLARE_CACHE(WaterMtrl, WaterMtrls, WaterMtrlPtr); // Water Material Cache
  52. #if EE_PRIVATE
  53. extern WaterMtrl *WaterMtrlLast; // Last set Water Material
  54. extern WaterMtrlPtr WaterMtrlNull;
  55. #endif
  56. /******************************************************************************/
  57. STRUCT(WaterClass , WaterMtrl) // Main water control
  58. //{
  59. Bool draw , // if draw the water plane , true/false, default=false , it can be drawn only after setting 'draw' to true, and setting valid water images in parameters
  60. reflection_allow , // if allow rendering reflection, true/false, default=true (false for Mobile)
  61. reflection_shadows ; // if use shadows in reflection , true/false, default=false , to have shadows in reflection you must also enable global shadowing, and set reflection renderer != RT_SIMPLE
  62. Byte reflection_resolution; // reflection resolution , 0..4 , default=2 , the bigger value the worse quality but faster rendering
  63. PlaneM plane ; // water plane , , default=(pos(0,0,0), normal(0,1,0))
  64. WaterClass& reflectionRenderer(RENDER_TYPE type); RENDER_TYPE reflectionRenderer()C {return _reflect_renderer;} // set/get Renderer used for rendering the reflaction , default=RT_SIMPLE
  65. WaterClass& max1Light (Bool on); Bool max1Light ()C {return _max_1_light ;} // set/get if use only up to 1 light for water surface, default=true (this greatly increases water rendering performance, however allows only 1 directional light affecting water surface), this affects only RT_DEFERRED renderer, all other renderers are always limited to only 1 directional light
  66. WaterClass& update(C Vec2 &vel); // update wave movement, 'vel'=velocity
  67. #if EE_PRIVATE
  68. enum MODE : Byte
  69. {
  70. MODE_DRAW ,
  71. MODE_REFLECTION,
  72. MODE_UNDERWATER,
  73. };
  74. Bool ocean ();
  75. Shader* shader();
  76. void del ();
  77. void create ();
  78. void prepare ();
  79. void begin (); // this is called just before WaterPlane and WaterMesh drawing
  80. void end (); // this is called at the end of all WaterPlane and WaterMesh drawing
  81. void under (C PlaneM &plane, WaterMtrl &mtrl); // set if camera is under custom water plane
  82. void setImages (Image *src, Image *depth);
  83. void endImages ();
  84. void drawSurfaces ();
  85. void setEyeViewport();
  86. #endif
  87. #if !EE_PRIVATE
  88. private:
  89. #endif
  90. Bool _max_1_light, _draw_plane_surface, _use_secondary_rt, _began, _swapped_ds;
  91. Byte _mode, _shader_shadow, _shader_soft;
  92. Flt _under_step;
  93. Vec2 _offset, _y_mul_add;
  94. Quad _quad;
  95. PlaneM _under_plane;
  96. MeshRender _mshr;
  97. Image _bump_temp;
  98. WaterMtrlPtr _under_mtrl;
  99. RENDER_TYPE _reflect_renderer;
  100. WaterClass();
  101. }extern
  102. Water; // water
  103. /******************************************************************************/
  104. struct WaterMesh // manually specified water mesh, water meshes don't support wave scales and custom density on surface (density is taken from 'Water')
  105. {
  106. Flt depth; // water depth, default=3
  107. // get
  108. Bool is ( )C {return _mshb.is();} // if created
  109. Bool lake ( )C {return _lake ;} // if it's a lake
  110. Bool under (C Vec &pos, Flt *depth=null)C; // if 'pos' position is under water, 'depth'=optional parameter to receive the depth of position when it is under water
  111. C MeshBase & mesh ( )C {return _mshb ;} // get water mesh
  112. C Box & box ( )C {return _box ;} // get water box (not including depth)
  113. C WaterMtrlPtr& material( )C {return _material ;} // get water material
  114. #if EE_PRIVATE
  115. Shader * shader ()C;
  116. WaterMtrl * getMaterial()C {return _material ? _material() : &Water;}
  117. void zero();
  118. #endif
  119. // manage
  120. void del();
  121. void create(C MeshBase &src, Bool lake, Flt depth=3, C WaterMtrlPtr &material=null); // create from 'src' mesh
  122. // draw
  123. void draw()C; // draw water area, this should be called only in RM_WATER mode, automatically uses frustum culling
  124. // io
  125. Bool save(File &f, CChar *path=null)C; // save, 'path'=path at which resource is located (this is needed so that the sub-resources can be accessed with relative path), false on fail
  126. Bool load(File &f, CChar *path=null) ; // load, 'path'=path at which resource is located (this is needed so that the sub-resources can be accessed with relative path), false on fail
  127. WaterMesh();
  128. #if !EE_PRIVATE
  129. private:
  130. #endif
  131. Bool _lake ;
  132. Box _box ;
  133. MeshBase _mshb ;
  134. MeshRender _mshr ;
  135. WaterMtrlPtr _material;
  136. };
  137. /******************************************************************************/