| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- /******************************************************************************/
- #include "stdafx.h"
- /******************************************************************************/
- WaterMtrlRegion WaterMtrlEdit;
- /******************************************************************************/
- /******************************************************************************/
- void WaterMtrlRegion::Change::create(ptr user)
- {
- data=WaterMtrlEdit.edit;
- WaterMtrlEdit.undoVis();
- }
- void WaterMtrlRegion::Change::apply(ptr user)
- {
- WaterMtrlEdit.edit.undo(data);
- WaterMtrlEdit.setChanged();
- WaterMtrlEdit.toGui();
- WaterMtrlEdit.undoVis();
- }
- void WaterMtrlRegion::Render() {WaterMtrlEdit.render();}
- void WaterMtrlRegion::render()
- {
- switch(Renderer())
- {
- case RM_PREPARE:
- {
- LightDir(previewLight(), 1-D.ambientColor()).add(false);
- }break;
- }
- }
- void WaterMtrlRegion::drawPreview()
- {
- preview_cam.set();
- CurrentEnvironment().set();
- MOTION_MODE motion =D. motionMode(); D. motionMode( MOTION_NONE);
- AMBIENT_MODE ambient =D. ambientMode(); D. ambientMode(AMBIENT_FLAT);
- DOF_MODE dof =D. dofMode(); D. dofMode( DOF_NONE);
- bool eye_adapt=D.eyeAdaptation(); D.eyeAdaptation( false);
- bool astros =AstrosDraw ; AstrosDraw =false;
- bool ocean =Water.draw ; Water.draw =true;
- 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));
- Renderer(Render);
- Swap(temp, SCAST(WaterMtrl, Water)); Water.plane=water_plane;
- D. dofMode(dof );
- D. motionMode(motion );
- D. ambientMode(ambient );
- D.eyeAdaptation(eye_adapt);
- AstrosDraw=astros;
- Water.draw=ocean;
- }
- void WaterMtrlRegion::PreChanged(C Property &prop) {WaterMtrlEdit.undos.set(&prop);}
- void WaterMtrlRegion::Changed(C Property &prop) {WaterMtrlEdit.setChanged();}
- Str WaterMtrlRegion::Density(C WaterMtrlRegion &mr ) {return mr.edit.density;}
- void WaterMtrlRegion::Density( WaterMtrlRegion &mr, C Str &t) {mr.edit.density=TextFlt(t); mr.edit.density_time.getUTC();}
- Str WaterMtrlRegion::DensityAdd(C WaterMtrlRegion &mr ) {return mr.edit.density_add;}
- void WaterMtrlRegion::DensityAdd( WaterMtrlRegion &mr, C Str &t) {mr.edit.density_add=TextFlt(t); mr.edit.density_time.getUTC();}
- Str WaterMtrlRegion::DensityUnderwater(C WaterMtrlRegion &mr ) {return mr.edit.density_underwater;}
- void WaterMtrlRegion::DensityUnderwater( WaterMtrlRegion &mr, C Str &t) {mr.edit.density_underwater=TextFlt(t); mr.edit.density_underwater_time.getUTC();}
- Str WaterMtrlRegion::DensityUnderwaterAdd(C WaterMtrlRegion &mr ) {return mr.edit.density_underwater_add;}
- void WaterMtrlRegion::DensityUnderwaterAdd( WaterMtrlRegion &mr, C Str &t) {mr.edit.density_underwater_add=TextFlt(t); mr.edit.density_underwater_time.getUTC();}
- Str WaterMtrlRegion::ScaleColor(C WaterMtrlRegion &mr ) {return mr.edit.scale_color;}
- void WaterMtrlRegion::ScaleColor( WaterMtrlRegion &mr, C Str &t) {mr.edit.scale_color=TextFlt(t); mr.edit.scale_color_time.getUTC();}
- Str WaterMtrlRegion::ScaleNormal(C WaterMtrlRegion &mr ) {return mr.edit.scale_normal;}
- void WaterMtrlRegion::ScaleNormal( WaterMtrlRegion &mr, C Str &t) {mr.edit.scale_normal=TextFlt(t); mr.edit.scale_normal_time.getUTC();}
- Str WaterMtrlRegion::ScaleBump(C WaterMtrlRegion &mr ) {return mr.edit.scale_bump;}
- void WaterMtrlRegion::ScaleBump( WaterMtrlRegion &mr, C Str &t) {mr.edit.scale_bump=TextFlt(t); mr.edit.scale_bump_time.getUTC();}
- Str WaterMtrlRegion::NrmScale(C WaterMtrlRegion &mr ) {return mr.edit.rough;}
- void WaterMtrlRegion::NrmScale( WaterMtrlRegion &mr, C Str &t) {mr.edit.rough=TextFlt(t); mr.edit.rough_bump_time.getUTC();}
- Str WaterMtrlRegion::ReflectTex(C WaterMtrlRegion &mr ) {return mr.edit.reflection;}
- void WaterMtrlRegion::ReflectTex( WaterMtrlRegion &mr, C Str &t) {mr.edit.reflection=TextFlt(t); mr.edit.reflection_time.getUTC();}
- Str WaterMtrlRegion::ReflectWorld(C WaterMtrlRegion &mr ) {return mr.edit.reflect_world;}
- void WaterMtrlRegion::ReflectWorld( WaterMtrlRegion &mr, C Str &t) {mr.edit.reflect_world=TextFlt(t); mr.edit.reflect_world_time.getUTC();}
- Str WaterMtrlRegion::Refract(C WaterMtrlRegion &mr ) {return mr.edit.refract;}
- void WaterMtrlRegion::Refract( WaterMtrlRegion &mr, C Str &t) {mr.edit.refract=TextFlt(t); mr.edit.refract_time.getUTC();}
- Str WaterMtrlRegion::RefractReflection(C WaterMtrlRegion &mr ) {return mr.edit.refract_reflection;}
- void WaterMtrlRegion::RefractReflection( WaterMtrlRegion &mr, C Str &t) {mr.edit.refract_reflection=TextFlt(t); mr.edit.refract_reflection_time.getUTC();}
- Str WaterMtrlRegion::RefractUnderwater(C WaterMtrlRegion &mr ) {return mr.edit.refract_underwater;}
- void WaterMtrlRegion::RefractUnderwater( WaterMtrlRegion &mr, C Str &t) {mr.edit.refract_underwater=TextFlt(t); mr.edit.refract_underwater_time.getUTC();}
- Str WaterMtrlRegion::Specular(C WaterMtrlRegion &mr ) {return mr.edit.specular;}
- void WaterMtrlRegion::Specular( WaterMtrlRegion &mr, C Str &t) {mr.edit.specular=TextFlt(t); mr.edit.spec_time.getUTC();}
- Str WaterMtrlRegion::WaveScale(C WaterMtrlRegion &mr ) {return mr.edit.wave_scale;}
- void WaterMtrlRegion::WaveScale( WaterMtrlRegion &mr, C Str &t) {mr.edit.wave_scale=TextFlt(t); mr.edit.wave_scale_time.getUTC();}
- Str WaterMtrlRegion::FresnelPow(C WaterMtrlRegion &mr ) {return mr.edit.fresnel_pow;}
- void WaterMtrlRegion::FresnelPow( WaterMtrlRegion &mr, C Str &t) {mr.edit.fresnel_pow=TextFlt(t); mr.edit.fresnel_pow_time.getUTC();}
- Str WaterMtrlRegion::FresnelRough(C WaterMtrlRegion &mr ) {return mr.edit.fresnel_rough;}
- void WaterMtrlRegion::FresnelRough( WaterMtrlRegion &mr, C Str &t) {mr.edit.fresnel_rough=TextFlt(t); mr.edit.fresnel_rough_time.getUTC();}
- Str WaterMtrlRegion::FresnelColor(C WaterMtrlRegion &mr ) {return mr.edit.fresnel_color;}
- void WaterMtrlRegion::FresnelColor( WaterMtrlRegion &mr, C Str &t) {mr.edit.fresnel_color=TextVec(t); mr.edit.fresnel_color_time.getUTC();}
- Str WaterMtrlRegion::Col(C WaterMtrlRegion &mr ) {return mr.edit.color;}
- void WaterMtrlRegion::Col( WaterMtrlRegion &mr, C Str &t) {mr.edit.color.xyz=TextVec(t); mr.edit.color_time.getUTC();}
- Str WaterMtrlRegion::ColorUnderwater0(C WaterMtrlRegion &mr ) {return mr.edit.color_underwater0;}
- void WaterMtrlRegion::ColorUnderwater0( WaterMtrlRegion &mr, C Str &t) {mr.edit.color_underwater0=TextVec(t); mr.edit.color_underwater_time.getUTC();}
- Str WaterMtrlRegion::ColorUnderwater1(C WaterMtrlRegion &mr ) {return mr.edit.color_underwater1;}
- void WaterMtrlRegion::ColorUnderwater1( WaterMtrlRegion &mr, C Str &t) {mr.edit.color_underwater1=TextVec(t); mr.edit.color_underwater_time.getUTC();}
- Str WaterMtrlRegion::FNY(C WaterMtrlRegion &mr ) {return mr.edit.flip_normal_y;}
- 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);}
- EditMaterial& WaterMtrlRegion::getEditMtrl(){return edit;}
- C ImagePtr & WaterMtrlRegion::getBase0(){return game-> colorMap();}
- C ImagePtr & WaterMtrlRegion::getBase1(){return game-> normalMap();}
- C ImagePtr & WaterMtrlRegion::getReflection(){return game->reflectionMap();}
- void WaterMtrlRegion::create()
- {
- undos.replaceClass<Change>();
- ::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;
- flt e=0.01f, prop_height=0.044f;
- props.clear();
- props.New().create("Density" , MemberDesc(DATA_REAL).setFunc(Density , Density )).range(0, 1);
- props.New().create("Density Base" , MemberDesc(DATA_REAL).setFunc(DensityAdd , DensityAdd )).range(0, 1);
- props.New().create("Density Underwater" , MemberDesc(DATA_REAL).setFunc(DensityUnderwater , DensityUnderwater )).range(0, 1);
- props.New().create("Density Underwater Base" , MemberDesc(DATA_REAL).setFunc(DensityUnderwaterAdd , DensityUnderwaterAdd )).range(0, 1);
- props.New().create("Scale Color" , MemberDesc(DATA_REAL).setFunc(ScaleColor , ScaleColor )).min(0).mouseEditMode(PROP_MOUSE_EDIT_SCALAR);
- props.New().create("Scale Normal" , MemberDesc(DATA_REAL).setFunc(ScaleNormal , ScaleNormal )).min(0).mouseEditMode(PROP_MOUSE_EDIT_SCALAR);
- props.New().create("Scale Bump" , MemberDesc(DATA_REAL).setFunc(ScaleBump , ScaleBump )).min(5).mouseEditMode(PROP_MOUSE_EDIT_SCALAR);
- props.New().create("Normal" , MemberDesc(DATA_REAL).setFunc(NrmScale , NrmScale )).range(0, 3);
- props.New().create("Flip Normal Y" , MemberDesc(DATA_BOOL).setFunc(FNY , FNY ));
- props.New().create("Reflection from Texture" , MemberDesc(DATA_REAL).setFunc(ReflectTex , ReflectTex )).range(0, 1).mouseEditSpeed(0.5f);
- props.New().create("Reflection from World" , MemberDesc(DATA_REAL).setFunc(ReflectWorld , ReflectWorld )).range(0, 1);
- props.New().create("Refraction" , MemberDesc(DATA_REAL).setFunc(Refract , Refract )).range(0, 0.50f).mouseEditSpeed(0.25f);
- props.New().create("Refraction of Reflection", MemberDesc(DATA_REAL).setFunc(RefractReflection , RefractReflection )).range(0, 0.25f).mouseEditSpeed(0.10f);
- props.New().create("Refraction Underwater" , MemberDesc(DATA_REAL).setFunc(RefractUnderwater , RefractUnderwater )).range(0, 0.04f).mouseEditSpeed(0.02f);
- props.New().create("Specular" , MemberDesc(DATA_REAL).setFunc(Specular , Specular )).min(0);
- props.New().create("Vertical Wave Scale" , MemberDesc(DATA_REAL).setFunc(WaveScale , WaveScale )).range(0, 1);
- props.New().create("Fresnel Term Power" , MemberDesc(DATA_REAL).setFunc(FresnelPow , FresnelPow )).min(0);
- props.New().create("Fresnel Term Roughness" , MemberDesc(DATA_REAL).setFunc(FresnelRough , FresnelRough )).min(0);
- props.New().create("Fresnel Term Color" , MemberDesc(DATA_VEC ).setFunc(FresnelColor , FresnelColor )).setColor();
- props.New().create("Color" , MemberDesc(DATA_VEC ).setFunc(Col , Col )).setColor();
- props.New().create("Underwater Surface Color", MemberDesc(DATA_VEC ).setFunc(ColorUnderwater0 , ColorUnderwater0 )).setColor();
- props.New().create("Underwater Depths Color" , MemberDesc(DATA_VEC ).setFunc(ColorUnderwater1 , ColorUnderwater1 )).setColor();
- Rect prop_rect=AddProperties(props, sub, 0, prop_height, 0.135f, &ts); REPAO(props).autoData(this).changed(Changed, PreChanged);
- flt tex_size=prop_height*3; int i=0;
- texs.clear();
- 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;
- 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;
- 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;
- 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;
- 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;
- 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);
- 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);
- 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);
- 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);
- 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;
- REPA(texs){sub+=texs[i].remove; prop_rect|=texs[i].rect();}
- setBottom(prop_rect);
- }
- void WaterMtrlRegion::flush()
- {
- if(elm && game && changed)
- {
- 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
- Save( edit, Proj.editPath(*elm )); edit.copyTo(*game, Proj);
- Save(*game, Proj.gamePath( elm->id)); Proj.savedGame(*elm);
- Proj.mtrlSetAutoTanBin(elm->id);
- Server.setElmLong(elm->id);
- }
- changed=false;
- }
- void WaterMtrlRegion::setChanged()
- {
- if(elm && game)
- {
- changed=true;
- if(ElmWaterMtrl *data=elm->waterMtrlData()){data->newVer(); data->from(edit);}
- edit.copyTo(*game, Proj);
- }
- }
- void WaterMtrlRegion::set(Elm *elm)
- {
- if(elm && elm->type!=ELM_WATER_MTRL)elm=null;
- if(T.elm!=elm)
- {
- flush();
- undos.del(); undoVis();
- if(elm)game= Proj.gamePath( elm->id) ;else game=&temp;
- if(elm)edit.load(Proj.editPath(*elm ));else edit.reset();
- T.elm =elm;
- T.elm_id=(elm ? elm->id : UIDZero);
- toGui();
- Proj.refresh(false, false);
- if(!elm)
- {
- MaterialRegion &other=((this==&MtrlEdit) ? WaterMtrlEdit : MtrlEdit);
- hide(); if(other.elm)other.show();
- }
- }
- }
- void WaterMtrlRegion::set(C WaterMtrlPtr &mtrl) {activate(Proj.findElm(mtrl.id()));}
- void WaterMtrlRegion::rebuildBase(uint old_base_tex, bool changed_flip_normal_y, bool adjust_params, bool always)
- {
- if(elm && game)
- {
- if(auto_reload || always)
- {
- Proj.mtrlCreateBaseTextures(edit, changed_flip_normal_y);
- Time.skipUpdate(); // compressing textures can be slow
- }
- setChanged();
- toGui();
- }
- }
- void WaterMtrlRegion::rebuildReflection()
- {
- if(elm && game)
- {
- Proj.mtrlCreateReflectionTexture(edit);
- setChanged();
- Time.skipUpdate(); // compressing textures can be slow
- toGui();
- }
- }
- void WaterMtrlRegion::rebuildDetail()
- {
- }
- void WaterMtrlRegion::rebuildMacro()
- {
- }
- void WaterMtrlRegion::rebuildLight()
- {
- }
- void WaterMtrlRegion::elmChanged(C UID &mtrl_id)
- {
- if(elm && elm->id==mtrl_id)
- {
- undos.set(null, true);
- EditWaterMtrl temp; if(temp.load(Proj.editPath(*elm)))if(edit.sync(temp)){edit.copyTo(*game, Proj); toGui();}
- }
- }
- WaterMtrlRegion::WaterMtrlRegion() : game(&temp) {}
- /******************************************************************************/
|