| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /******************************************************************************/
- #if EE_PRIVATE
- #define WATER_SMOOTH 0.1f
- #endif
- /******************************************************************************/
- struct WaterMtrl // Water Material
- {
- Flt density , // density , 0..1 , default=0.3
- density_add , // factor added to density , 0..1 , default=0.45
- density_underwater , // density when viewed underwater, 0..1 , default=0.02
- density_underwater_add, // factor added to density when viewed underwater, 0..1 , default=0.6
- scale_color , // scale color texture , 0..Inf , default=200
- scale_normal , // scale normal texture , 0..Inf , default=10
- scale_bump , // scale bump texture , 0..Inf , default=100
- rough , // roughness , 0..Inf , default=1
- reflect_tex , // reflection power of texture , 0..1 , default=0.1
- reflect_world , // reflection power of world , 0..1 , default=0.18 (0 is the fastest)
- refract , // refraction power , 0..1 , default=0.10 (0 is the fastest)
- refract_reflection , // refraction of the reflection , 0..1 , default=0.06
- refract_underwater , // refraction when viewed underwater , 0..1 , default=0.01 (0 is the fastest)
- specular , // specular amount , 0..Inf , default=1.5
- wave_scale , // vertical wave scale , 0..1 , default=0.25 (0 is the fastest)
- fresnel_pow , // fresnel term power , 0..Inf , default=5.5
- fresnel_rough ; // fresnel term roughness , 0..Inf , default=4
- Vec fresnel_color , // fresnel term color , (0,0,0)..(1,1,1), default=(0.10, 0.10, 0.10)
- color , // color , (0,0,0)..(1,1,1), default=(0.42, 0.50, 0.58)
- color_underwater0 , // color when viewed underwater on surface , (0,0,0)..(1,1,1), default=(0.26, 0.35, 0.42)
- color_underwater1 ; // color when viewed underwater deep , (0,0,0)..(1,1,1), default=(0.10, 0.20, 0.30)
- // set / get
- WaterMtrl& colorMap(C ImagePtr &image); C ImagePtr& colorMap()C {return _color_map ;} // set/get color map
- WaterMtrl& normalMap(C ImagePtr &image); C ImagePtr& normalMap()C {return _normal_map ;} // set/get normal map
- WaterMtrl& reflectionMap(C ImagePtr &image); C ImagePtr& reflectionMap()C {return _reflection_map;} // set/get reflection map
- // operations
- WaterMtrl& reset (); // reset to default values
- WaterMtrl& validate(); // this needs to be called after manually changing the parameters/textures
- #if EE_PRIVATE
- void set();
- #endif
- // io
- Bool save(C Str &name)C; // save, false on fail
- Bool load(C Str &name) ; // load, false on fail
- 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
- 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
- WaterMtrl();
- #if !EE_PRIVATE
- private:
- #endif
- ImagePtr _color_map, _normal_map, _reflection_map, _bump;
- };
- /******************************************************************************/
- DECLARE_CACHE(WaterMtrl, WaterMtrls, WaterMtrlPtr); // Water Material Cache
- #if EE_PRIVATE
- extern WaterMtrl *WaterMtrlLast; // Last set Water Material
- extern WaterMtrlPtr WaterMtrlNull;
- #endif
- /******************************************************************************/
- STRUCT(WaterClass , WaterMtrl) // Main water control
- //{
- 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
- reflection_allow , // if allow rendering reflection, true/false, default=true (false for Mobile)
- 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
- Byte reflection_resolution; // reflection resolution , 0..4 , default=2 , the bigger value the worse quality but faster rendering
- PlaneM plane ; // water plane , , default=(pos(0,0,0), normal(0,1,0))
- WaterClass& reflectionRenderer(RENDER_TYPE type); RENDER_TYPE reflectionRenderer()C {return _reflect_renderer;} // set/get Renderer used for rendering the reflaction , default=RT_SIMPLE
- 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
- WaterClass& update(C Vec2 &vel); // update wave movement, 'vel'=velocity
- #if EE_PRIVATE
- enum MODE : Byte
- {
- MODE_DRAW ,
- MODE_REFLECTION,
- MODE_UNDERWATER,
- };
- Bool ocean ();
- Shader* shader();
- void del ();
- void create ();
- void prepare ();
- void begin (); // this is called just before WaterPlane and WaterMesh drawing
- void end (); // this is called at the end of all WaterPlane and WaterMesh drawing
- void under (C PlaneM &plane, WaterMtrl &mtrl); // set if camera is under custom water plane
- void setImages (Image *src, Image *depth);
- void endImages ();
- void drawSurfaces ();
- void setEyeViewport();
- #endif
- #if !EE_PRIVATE
- private:
- #endif
- Bool _max_1_light, _draw_plane_surface, _use_secondary_rt, _began, _swapped_ds;
- Byte _mode, _shader_shadow, _shader_soft;
- Flt _under_step;
- Vec2 _offset, _y_mul_add;
- Quad _quad;
- PlaneM _under_plane;
- MeshRender _mshr;
- Image _bump_temp;
- WaterMtrlPtr _under_mtrl;
- RENDER_TYPE _reflect_renderer;
- WaterClass();
- }extern
- Water; // water
- /******************************************************************************/
- struct WaterMesh // manually specified water mesh, water meshes don't support wave scales and custom density on surface (density is taken from 'Water')
- {
- Flt depth; // water depth, default=3
- // get
- Bool is ( )C {return _mshb.is();} // if created
- Bool lake ( )C {return _lake ;} // if it's a lake
- 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
- C MeshBase & mesh ( )C {return _mshb ;} // get water mesh
- C Box & box ( )C {return _box ;} // get water box (not including depth)
- C WaterMtrlPtr& material( )C {return _material ;} // get water material
- #if EE_PRIVATE
- Shader * shader ()C;
- WaterMtrl * getMaterial()C {return _material ? _material() : &Water;}
- void zero();
- #endif
- // manage
- void del();
- void create(C MeshBase &src, Bool lake, Flt depth=3, C WaterMtrlPtr &material=null); // create from 'src' mesh
- // draw
- void draw()C; // draw water area, this should be called only in RM_WATER mode, automatically uses frustum culling
- // io
- 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
- 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
- WaterMesh();
- #if !EE_PRIVATE
- private:
- #endif
- Bool _lake ;
- Box _box ;
- MeshBase _mshb ;
- MeshRender _mshr ;
- WaterMtrlPtr _material;
- };
- /******************************************************************************/
|