Water [email protected] 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. /******************************************************************************/
  4. WaterMtrlRegion WaterMtrlEdit;
  5. /******************************************************************************/
  6. /******************************************************************************/
  7. void WaterMtrlRegion::Change::create(ptr user)
  8. {
  9. data=WaterMtrlEdit.edit;
  10. WaterMtrlEdit.undoVis();
  11. }
  12. void WaterMtrlRegion::Change::apply(ptr user)
  13. {
  14. WaterMtrlEdit.edit.undo(data);
  15. WaterMtrlEdit.setChanged();
  16. WaterMtrlEdit.toGui();
  17. WaterMtrlEdit.undoVis();
  18. }
  19. void WaterMtrlRegion::Render() {WaterMtrlEdit.render();}
  20. void WaterMtrlRegion::render()
  21. {
  22. switch(Renderer())
  23. {
  24. case RM_PREPARE:
  25. {
  26. LightDir(previewLight(), 1-D.ambientColor()).add(false);
  27. }break;
  28. }
  29. }
  30. void WaterMtrlRegion::drawPreview()
  31. {
  32. preview_cam.set();
  33. CurrentEnvironment().set();
  34. MOTION_MODE motion =D. motionMode(); D. motionMode( MOTION_NONE);
  35. AMBIENT_MODE ambient =D. ambientMode(); D. ambientMode(AMBIENT_FLAT);
  36. DOF_MODE dof =D. dofMode(); D. dofMode( DOF_NONE);
  37. bool eye_adapt=D.eyeAdaptation(); D.eyeAdaptation( false);
  38. bool astros =AstrosDraw ; AstrosDraw =false;
  39. bool ocean =Water.draw ; Water.draw =true;
  40. WaterMtrl temp; Swap(temp, SCAST(WaterMtrl, Water)); SCAST(WaterMtrl, Water)=*game; PlaneM water_plane=Water.plane; Water.plane.set(Vec(0, -1, 0), Vec(0, 1, 0));
  41. Renderer(Render);
  42. Swap(temp, SCAST(WaterMtrl, Water)); Water.plane=water_plane;
  43. D. dofMode(dof );
  44. D. motionMode(motion );
  45. D. ambientMode(ambient );
  46. D.eyeAdaptation(eye_adapt);
  47. AstrosDraw=astros;
  48. Water.draw=ocean;
  49. }
  50. void WaterMtrlRegion::PreChanged(C Property &prop) {WaterMtrlEdit.undos.set(&prop);}
  51. void WaterMtrlRegion::Changed(C Property &prop) {WaterMtrlEdit.setChanged();}
  52. Str WaterMtrlRegion::Density(C WaterMtrlRegion &mr ) {return mr.edit.density;}
  53. void WaterMtrlRegion::Density( WaterMtrlRegion &mr, C Str &t) {mr.edit.density=TextFlt(t); mr.edit.density_time.getUTC();}
  54. Str WaterMtrlRegion::DensityAdd(C WaterMtrlRegion &mr ) {return mr.edit.density_add;}
  55. void WaterMtrlRegion::DensityAdd( WaterMtrlRegion &mr, C Str &t) {mr.edit.density_add=TextFlt(t); mr.edit.density_time.getUTC();}
  56. Str WaterMtrlRegion::DensityUnderwater(C WaterMtrlRegion &mr ) {return mr.edit.density_underwater;}
  57. void WaterMtrlRegion::DensityUnderwater( WaterMtrlRegion &mr, C Str &t) {mr.edit.density_underwater=TextFlt(t); mr.edit.density_underwater_time.getUTC();}
  58. Str WaterMtrlRegion::DensityUnderwaterAdd(C WaterMtrlRegion &mr ) {return mr.edit.density_underwater_add;}
  59. void WaterMtrlRegion::DensityUnderwaterAdd( WaterMtrlRegion &mr, C Str &t) {mr.edit.density_underwater_add=TextFlt(t); mr.edit.density_underwater_time.getUTC();}
  60. Str WaterMtrlRegion::ScaleColor(C WaterMtrlRegion &mr ) {return mr.edit.scale_color;}
  61. void WaterMtrlRegion::ScaleColor( WaterMtrlRegion &mr, C Str &t) {mr.edit.scale_color=TextFlt(t); mr.edit.scale_color_time.getUTC();}
  62. Str WaterMtrlRegion::ScaleNormal(C WaterMtrlRegion &mr ) {return mr.edit.scale_normal;}
  63. void WaterMtrlRegion::ScaleNormal( WaterMtrlRegion &mr, C Str &t) {mr.edit.scale_normal=TextFlt(t); mr.edit.scale_normal_time.getUTC();}
  64. Str WaterMtrlRegion::ScaleBump(C WaterMtrlRegion &mr ) {return mr.edit.scale_bump;}
  65. void WaterMtrlRegion::ScaleBump( WaterMtrlRegion &mr, C Str &t) {mr.edit.scale_bump=TextFlt(t); mr.edit.scale_bump_time.getUTC();}
  66. Str WaterMtrlRegion::NrmScale(C WaterMtrlRegion &mr ) {return mr.edit.rough;}
  67. void WaterMtrlRegion::NrmScale( WaterMtrlRegion &mr, C Str &t) {mr.edit.rough=TextFlt(t); mr.edit.rough_bump_time.getUTC();}
  68. Str WaterMtrlRegion::ReflectTex(C WaterMtrlRegion &mr ) {return mr.edit.reflection;}
  69. void WaterMtrlRegion::ReflectTex( WaterMtrlRegion &mr, C Str &t) {mr.edit.reflection=TextFlt(t); mr.edit.reflection_time.getUTC();}
  70. Str WaterMtrlRegion::ReflectWorld(C WaterMtrlRegion &mr ) {return mr.edit.reflect_world;}
  71. void WaterMtrlRegion::ReflectWorld( WaterMtrlRegion &mr, C Str &t) {mr.edit.reflect_world=TextFlt(t); mr.edit.reflect_world_time.getUTC();}
  72. Str WaterMtrlRegion::Refract(C WaterMtrlRegion &mr ) {return mr.edit.refract;}
  73. void WaterMtrlRegion::Refract( WaterMtrlRegion &mr, C Str &t) {mr.edit.refract=TextFlt(t); mr.edit.refract_time.getUTC();}
  74. Str WaterMtrlRegion::RefractReflection(C WaterMtrlRegion &mr ) {return mr.edit.refract_reflection;}
  75. void WaterMtrlRegion::RefractReflection( WaterMtrlRegion &mr, C Str &t) {mr.edit.refract_reflection=TextFlt(t); mr.edit.refract_reflection_time.getUTC();}
  76. Str WaterMtrlRegion::RefractUnderwater(C WaterMtrlRegion &mr ) {return mr.edit.refract_underwater;}
  77. void WaterMtrlRegion::RefractUnderwater( WaterMtrlRegion &mr, C Str &t) {mr.edit.refract_underwater=TextFlt(t); mr.edit.refract_underwater_time.getUTC();}
  78. Str WaterMtrlRegion::Specular(C WaterMtrlRegion &mr ) {return mr.edit.specular;}
  79. void WaterMtrlRegion::Specular( WaterMtrlRegion &mr, C Str &t) {mr.edit.specular=TextFlt(t); mr.edit.spec_time.getUTC();}
  80. Str WaterMtrlRegion::WaveScale(C WaterMtrlRegion &mr ) {return mr.edit.wave_scale;}
  81. void WaterMtrlRegion::WaveScale( WaterMtrlRegion &mr, C Str &t) {mr.edit.wave_scale=TextFlt(t); mr.edit.wave_scale_time.getUTC();}
  82. Str WaterMtrlRegion::FresnelPow(C WaterMtrlRegion &mr ) {return mr.edit.fresnel_pow;}
  83. void WaterMtrlRegion::FresnelPow( WaterMtrlRegion &mr, C Str &t) {mr.edit.fresnel_pow=TextFlt(t); mr.edit.fresnel_pow_time.getUTC();}
  84. Str WaterMtrlRegion::FresnelRough(C WaterMtrlRegion &mr ) {return mr.edit.fresnel_rough;}
  85. void WaterMtrlRegion::FresnelRough( WaterMtrlRegion &mr, C Str &t) {mr.edit.fresnel_rough=TextFlt(t); mr.edit.fresnel_rough_time.getUTC();}
  86. Str WaterMtrlRegion::FresnelColor(C WaterMtrlRegion &mr ) {return mr.edit.fresnel_color;}
  87. void WaterMtrlRegion::FresnelColor( WaterMtrlRegion &mr, C Str &t) {mr.edit.fresnel_color=TextVec(t); mr.edit.fresnel_color_time.getUTC();}
  88. Str WaterMtrlRegion::Col(C WaterMtrlRegion &mr ) {return mr.edit.color;}
  89. void WaterMtrlRegion::Col( WaterMtrlRegion &mr, C Str &t) {mr.edit.color.xyz=TextVec(t); mr.edit.color_time.getUTC();}
  90. Str WaterMtrlRegion::ColorUnderwater0(C WaterMtrlRegion &mr ) {return mr.edit.color_underwater0;}
  91. void WaterMtrlRegion::ColorUnderwater0( WaterMtrlRegion &mr, C Str &t) {mr.edit.color_underwater0=TextVec(t); mr.edit.color_underwater_time.getUTC();}
  92. Str WaterMtrlRegion::ColorUnderwater1(C WaterMtrlRegion &mr ) {return mr.edit.color_underwater1;}
  93. void WaterMtrlRegion::ColorUnderwater1( WaterMtrlRegion &mr, C Str &t) {mr.edit.color_underwater1=TextVec(t); mr.edit.color_underwater_time.getUTC();}
  94. Str WaterMtrlRegion::FNY(C WaterMtrlRegion &mr ) {return mr.edit.flip_normal_y;}
  95. void WaterMtrlRegion::FNY( WaterMtrlRegion &mr, C Str &t) {uint base_tex=mr.edit.baseTex(); mr.edit.flip_normal_y=TextBool(t); mr.edit.flip_normal_y_time.getUTC(); mr.rebuildBase(base_tex, true, false);}
  96. EditMaterial& WaterMtrlRegion::getEditMtrl(){return edit;}
  97. C ImagePtr & WaterMtrlRegion::getBase0(){return game-> colorMap();}
  98. C ImagePtr & WaterMtrlRegion::getBase1(){return game-> normalMap();}
  99. C ImagePtr & WaterMtrlRegion::getReflection(){return game->reflectionMap();}
  100. void WaterMtrlRegion::create()
  101. {
  102. undos.replaceClass<Change>();
  103. ::MaterialRegion::create(); elm_type=ELM_WATER_MTRL; max_zoom=50; preview_cam.dist=15; preview_cam.pitch=-PI_6; preview_cam.setSpherical(); set_mtrl.del(); brightness.del(); preview_mode.del(); preview_big.range=preview.range=200;
  104. flt e=0.01f, prop_height=0.044f;
  105. props.clear();
  106. props.New().create("Density" , MemberDesc(DATA_REAL).setFunc(Density , Density )).range(0, 1);
  107. props.New().create("Density Base" , MemberDesc(DATA_REAL).setFunc(DensityAdd , DensityAdd )).range(0, 1);
  108. props.New().create("Density Underwater" , MemberDesc(DATA_REAL).setFunc(DensityUnderwater , DensityUnderwater )).range(0, 1);
  109. props.New().create("Density Underwater Base" , MemberDesc(DATA_REAL).setFunc(DensityUnderwaterAdd , DensityUnderwaterAdd )).range(0, 1);
  110. props.New().create("Scale Color" , MemberDesc(DATA_REAL).setFunc(ScaleColor , ScaleColor )).min(0).mouseEditMode(PROP_MOUSE_EDIT_SCALAR);
  111. props.New().create("Scale Normal" , MemberDesc(DATA_REAL).setFunc(ScaleNormal , ScaleNormal )).min(0).mouseEditMode(PROP_MOUSE_EDIT_SCALAR);
  112. props.New().create("Scale Bump" , MemberDesc(DATA_REAL).setFunc(ScaleBump , ScaleBump )).min(5).mouseEditMode(PROP_MOUSE_EDIT_SCALAR);
  113. props.New().create("Normal" , MemberDesc(DATA_REAL).setFunc(NrmScale , NrmScale )).range(0, 3);
  114. props.New().create("Flip Normal Y" , MemberDesc(DATA_BOOL).setFunc(FNY , FNY ));
  115. props.New().create("Reflection from Texture" , MemberDesc(DATA_REAL).setFunc(ReflectTex , ReflectTex )).range(0, 1).mouseEditSpeed(0.5f);
  116. props.New().create("Reflection from World" , MemberDesc(DATA_REAL).setFunc(ReflectWorld , ReflectWorld )).range(0, 1);
  117. props.New().create("Refraction" , MemberDesc(DATA_REAL).setFunc(Refract , Refract )).range(0, 0.50f).mouseEditSpeed(0.25f);
  118. props.New().create("Refraction of Reflection", MemberDesc(DATA_REAL).setFunc(RefractReflection , RefractReflection )).range(0, 0.25f).mouseEditSpeed(0.10f);
  119. props.New().create("Refraction Underwater" , MemberDesc(DATA_REAL).setFunc(RefractUnderwater , RefractUnderwater )).range(0, 0.04f).mouseEditSpeed(0.02f);
  120. props.New().create("Specular" , MemberDesc(DATA_REAL).setFunc(Specular , Specular )).min(0);
  121. props.New().create("Vertical Wave Scale" , MemberDesc(DATA_REAL).setFunc(WaveScale , WaveScale )).range(0, 1);
  122. props.New().create("Fresnel Term Power" , MemberDesc(DATA_REAL).setFunc(FresnelPow , FresnelPow )).min(0);
  123. props.New().create("Fresnel Term Roughness" , MemberDesc(DATA_REAL).setFunc(FresnelRough , FresnelRough )).min(0);
  124. props.New().create("Fresnel Term Color" , MemberDesc(DATA_VEC ).setFunc(FresnelColor , FresnelColor )).setColor();
  125. props.New().create("Color" , MemberDesc(DATA_VEC ).setFunc(Col , Col )).setColor();
  126. props.New().create("Underwater Surface Color", MemberDesc(DATA_VEC ).setFunc(ColorUnderwater0 , ColorUnderwater0 )).setColor();
  127. props.New().create("Underwater Depths Color" , MemberDesc(DATA_VEC ).setFunc(ColorUnderwater1 , ColorUnderwater1 )).setColor();
  128. Rect prop_rect=AddProperties(props, sub, 0, prop_height, 0.135f, &ts); REPAO(props).autoData(this).changed(Changed, PreChanged);
  129. flt tex_size=prop_height*3; int i=0;
  130. texs.clear();
  131. sub+=texs.New().create(TEX_COLOR , MEMBER(EditWaterMtrl, color_map), MEMBER(EditWaterMtrl, color_map_time), Rect_LU(prop_rect.ru()+Vec2(e , i*prop_height), tex_size, tex_size), "Color" , T); i-=3;
  132. sub+=texs.New().create(TEX_BUMP , MEMBER(EditWaterMtrl, bump_map), MEMBER(EditWaterMtrl, bump_map_time), Rect_LU(prop_rect.ru()+Vec2(e , i*prop_height), tex_size, tex_size), "Bump" , T); i-=3;
  133. sub+=texs.New().create(TEX_NORMAL , MEMBER(EditWaterMtrl, normal_map), MEMBER(EditWaterMtrl, normal_map_time), Rect_LU(prop_rect.ru()+Vec2(e , i*prop_height), tex_size, tex_size), "Normal" , T); i-=3*4-2;
  134. sub+=texs.New().create(TEX_RFL_U , MEMBER(EditWaterMtrl, reflection_map), MEMBER(EditWaterMtrl, reflection_map_time), Rect_LU(prop_rect.ru()+Vec2(e , i*prop_height), tex_size, tex_size), "Reflect\nUp" , T); i-=3;
  135. sub+=texs.New().create(TEX_RFL_D , MEMBER(EditWaterMtrl, reflection_map), MEMBER(EditWaterMtrl, reflection_map_time), Rect_LU(prop_rect.ru()+Vec2(e , i*prop_height), tex_size, tex_size), "Reflect\nDown" , T); i-=3;
  136. sub+=texs.New().create(TEX_RFL_ALL, MEMBER(EditWaterMtrl, reflection_map), MEMBER(EditWaterMtrl, reflection_map_time), Rect_LU(prop_rect.ru()+Vec2(e-tex_size*4, i*prop_height), tex_size, tex_size), "Reflect\nAll" , T);
  137. sub+=texs.New().create(TEX_RFL_L , MEMBER(EditWaterMtrl, reflection_map), MEMBER(EditWaterMtrl, reflection_map_time), Rect_LU(prop_rect.ru()+Vec2(e-tex_size*3, i*prop_height), tex_size, tex_size), "Reflect\nLeft" , T);
  138. sub+=texs.New().create(TEX_RFL_F , MEMBER(EditWaterMtrl, reflection_map), MEMBER(EditWaterMtrl, reflection_map_time), Rect_LU(prop_rect.ru()+Vec2(e-tex_size*2, i*prop_height), tex_size, tex_size), "Reflect\nFront", T);
  139. sub+=texs.New().create(TEX_RFL_R , MEMBER(EditWaterMtrl, reflection_map), MEMBER(EditWaterMtrl, reflection_map_time), Rect_LU(prop_rect.ru()+Vec2(e-tex_size*1, i*prop_height), tex_size, tex_size), "Reflect\nRight", T);
  140. sub+=texs.New().create(TEX_RFL_B , MEMBER(EditWaterMtrl, reflection_map), MEMBER(EditWaterMtrl, reflection_map_time), Rect_LU(prop_rect.ru()+Vec2(e+tex_size*0, i*prop_height), tex_size, tex_size), "Reflect\nBack" , T); i-=3;
  141. REPA(texs){sub+=texs[i].remove; prop_rect|=texs[i].rect();}
  142. setBottom(prop_rect);
  143. }
  144. void WaterMtrlRegion::flush()
  145. {
  146. if(elm && game && changed)
  147. {
  148. if(ElmWaterMtrl *data=elm->waterMtrlData()){data->newVer(); data->from(edit);} // modify just before saving/sending in case we've received data from server after edit
  149. Save( edit, Proj.editPath(*elm )); edit.copyTo(*game, Proj);
  150. Save(*game, Proj.gamePath( elm->id)); Proj.savedGame(*elm);
  151. Proj.mtrlSetAutoTanBin(elm->id);
  152. Server.setElmLong(elm->id);
  153. }
  154. changed=false;
  155. }
  156. void WaterMtrlRegion::setChanged()
  157. {
  158. if(elm && game)
  159. {
  160. changed=true;
  161. if(ElmWaterMtrl *data=elm->waterMtrlData()){data->newVer(); data->from(edit);}
  162. edit.copyTo(*game, Proj);
  163. }
  164. }
  165. void WaterMtrlRegion::set(Elm *elm)
  166. {
  167. if(elm && elm->type!=ELM_WATER_MTRL)elm=null;
  168. if(T.elm!=elm)
  169. {
  170. flush();
  171. undos.del(); undoVis();
  172. if(elm)game= Proj.gamePath( elm->id) ;else game=&temp;
  173. if(elm)edit.load(Proj.editPath(*elm ));else edit.reset();
  174. T.elm =elm;
  175. T.elm_id=(elm ? elm->id : UIDZero);
  176. toGui();
  177. Proj.refresh(false, false);
  178. if(!elm)
  179. {
  180. MaterialRegion &other=((this==&MtrlEdit) ? WaterMtrlEdit : MtrlEdit);
  181. hide(); if(other.elm)other.show();
  182. }
  183. }
  184. }
  185. void WaterMtrlRegion::set(C WaterMtrlPtr &mtrl) {activate(Proj.findElm(mtrl.id()));}
  186. void WaterMtrlRegion::rebuildBase(uint old_base_tex, bool changed_flip_normal_y, bool adjust_params, bool always)
  187. {
  188. if(elm && game)
  189. {
  190. if(auto_reload || always)
  191. {
  192. Proj.mtrlCreateBaseTextures(edit, changed_flip_normal_y);
  193. Time.skipUpdate(); // compressing textures can be slow
  194. }
  195. setChanged();
  196. toGui();
  197. }
  198. }
  199. void WaterMtrlRegion::rebuildReflection()
  200. {
  201. if(elm && game)
  202. {
  203. Proj.mtrlCreateReflectionTexture(edit);
  204. setChanged();
  205. Time.skipUpdate(); // compressing textures can be slow
  206. toGui();
  207. }
  208. }
  209. void WaterMtrlRegion::rebuildDetail()
  210. {
  211. }
  212. void WaterMtrlRegion::rebuildMacro()
  213. {
  214. }
  215. void WaterMtrlRegion::rebuildLight()
  216. {
  217. }
  218. void WaterMtrlRegion::elmChanged(C UID &mtrl_id)
  219. {
  220. if(elm && elm->id==mtrl_id)
  221. {
  222. undos.set(null, true);
  223. EditWaterMtrl temp; if(temp.load(Proj.editPath(*elm)))if(edit.sync(temp)){edit.copyTo(*game, Proj); toGui();}
  224. }
  225. }
  226. WaterMtrlRegion::WaterMtrlRegion() : game(&temp) {}
  227. /******************************************************************************/