diff --git a/WickedEngine/DeferredRenderableComponent_BindLua.cpp b/WickedEngine/DeferredRenderableComponent_BindLua.cpp index a6e72d191..7eb53f9b6 100644 --- a/WickedEngine/DeferredRenderableComponent_BindLua.cpp +++ b/WickedEngine/DeferredRenderableComponent_BindLua.cpp @@ -30,6 +30,10 @@ Luna::FunctionType DeferredRenderableCompon lunamethod(Renderable3DComponent_BindLua, SetLensFlareEnabled), lunamethod(Renderable3DComponent_BindLua, SetMotionBlurEnabled), lunamethod(Renderable3DComponent_BindLua, SetSSSEnabled), + lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldEnabled), + + lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus), + lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength), { NULL, NULL } }; Luna::PropertyType DeferredRenderableComponent_BindLua::properties[] = { diff --git a/WickedEngine/ForwardRenderableComponent_BindLua.cpp b/WickedEngine/ForwardRenderableComponent_BindLua.cpp index 24b3d5835..9c0800ec1 100644 --- a/WickedEngine/ForwardRenderableComponent_BindLua.cpp +++ b/WickedEngine/ForwardRenderableComponent_BindLua.cpp @@ -30,6 +30,10 @@ Luna::FunctionType ForwardRenderableComponen lunamethod(Renderable3DComponent_BindLua, SetLensFlareEnabled), lunamethod(Renderable3DComponent_BindLua, SetMotionBlurEnabled), lunamethod(Renderable3DComponent_BindLua, SetSSSEnabled), + lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldEnabled), + + lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus), + lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength), { NULL, NULL } }; Luna::PropertyType ForwardRenderableComponent_BindLua::properties[] = { diff --git a/WickedEngine/MainComponent_BindLua.cpp b/WickedEngine/MainComponent_BindLua.cpp index 66ea7e6aa..3b38a6127 100644 --- a/WickedEngine/MainComponent_BindLua.cpp +++ b/WickedEngine/MainComponent_BindLua.cpp @@ -111,44 +111,44 @@ int MainComponent_BindLua::SetActiveComponent(lua_State *L) } int argc = wiLua::SGetArgCount(L); - if (argc > 1) + if (argc > 0) { - ForwardRenderableComponent_BindLua* compFwd3D = Luna::lightcheck(L, 2); + ForwardRenderableComponent_BindLua* compFwd3D = Luna::lightcheck(L, 1); if (compFwd3D != nullptr) { component->activateComponent(compFwd3D->component); return 0; } - DeferredRenderableComponent_BindLua* compDef3D = Luna::lightcheck(L, 2); + DeferredRenderableComponent_BindLua* compDef3D = Luna::lightcheck(L, 1); if (compDef3D != nullptr) { component->activateComponent(compDef3D->component); return 0; } - Renderable3DComponent_BindLua* comp3D = Luna::lightcheck(L, 2); + Renderable3DComponent_BindLua* comp3D = Luna::lightcheck(L, 1); if (comp3D != nullptr) { component->activateComponent(comp3D->component); return 0; } - LoadingScreenComponent_BindLua* compLoad = Luna::lightcheck(L, 2); + LoadingScreenComponent_BindLua* compLoad = Luna::lightcheck(L, 1); if (compLoad != nullptr) { component->activateComponent(compLoad->component); return 0; } - Renderable2DComponent_BindLua* comp2D = Luna::lightcheck(L, 2); + Renderable2DComponent_BindLua* comp2D = Luna::lightcheck(L, 1); if (comp2D != nullptr) { component->activateComponent(comp2D->component); return 0; } - RenderableComponent_BindLua* comp = Luna::lightcheck(L, 2); + RenderableComponent_BindLua* comp = Luna::lightcheck(L, 1); if (comp != nullptr) { component->activateComponent(comp->component); @@ -171,9 +171,9 @@ int MainComponent_BindLua::SetFrameSkip(lua_State *L) } int argc = wiLua::SGetArgCount(L); - if (argc > 1) + if (argc > 0) { - component->setFrameSkip(wiLua::SGetBool(L, 2)); + component->setFrameSkip(wiLua::SGetBool(L, 1)); } else wiLua::SError(L, "SetFrameSkip(bool enabled) not enought arguments!"); diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp index 8649b6e1e..f8b027de0 100644 --- a/WickedEngine/Renderable3DComponent.cpp +++ b/WickedEngine/Renderable3DComponent.cpp @@ -31,6 +31,8 @@ void Renderable3DComponent::setProperties() setBloomThreshold(0.99f); setBloomSaturation(-3.86f); setWaterPlane(wiWaterPlane()); + setDepthOfFieldFocus(10.f); + setDepthOfFieldStrength(2.2f); setSSAOEnabled(true); setSSREnabled(true); @@ -46,6 +48,7 @@ void Renderable3DComponent::setProperties() setLensFlareEnabled(true); setMotionBlurEnabled(true); setSSSEnabled(true); + setDepthOfFieldEnabled(true); setPreferredThreadingCount(0); } @@ -101,6 +104,16 @@ void Renderable3DComponent::Initialize() wiRenderer::GetScreenWidth(), wiRenderer::GetScreenHeight() , 1, false); + rtDof[0].Initialize( + (UINT)(wiRenderer::GetScreenWidth()*0.4f), (UINT)(wiRenderer::GetScreenHeight()*0.4f) + , 1, false); + rtDof[1].Initialize( + (UINT)(wiRenderer::GetScreenWidth()*0.4f), (UINT)(wiRenderer::GetScreenHeight()*0.4f) + , 1, false); + rtDof[2].Initialize( + wiRenderer::GetScreenWidth(), wiRenderer::GetScreenHeight() + , 1, false); + dtDepthCopy.Initialize(wiRenderer::GetScreenWidth(), wiRenderer::GetScreenHeight() , 1, 0 ); @@ -341,13 +354,41 @@ void Renderable3DComponent::RenderComposition1(wiRenderTarget& shadedSceneRT, wi } void Renderable3DComponent::RenderComposition2(wiRenderer::DeviceContext context){ wiImageEffects fx((float)wiRenderer::GetScreenWidth(), (float)wiRenderer::GetScreenHeight()); + fx.blendFlag = BLENDMODE_OPAQUE; wiImage::BatchBegin(context); + if (getDepthOfFieldEnabled()) + { + // downsample + blur + rtDof[0].Activate(context); + fx.blur = getDepthOfFieldStrength(); + fx.blurDir = 0; + wiImage::Draw(rtFinal[0].shaderResource.back(), fx, context); + + rtDof[1].Activate(context); + fx.blurDir = 1; + wiImage::Draw(rtDof[0].shaderResource.back(), fx, context); + fx.blur = 0; + fx.process.clear(); + + // depth of field compose pass + rtDof[2].Activate(context); + fx.process.setDOF(getDepthOfFieldFocus()); + fx.setMaskMap(rtDof[1].shaderResource.back()); + fx.setDepthMap(rtLinearDepth.shaderResource.back()); + wiImage::Draw(rtFinal[0].shaderResource.back(), fx, context); + fx.setMaskMap(nullptr); + fx.setDepthMap(nullptr); + fx.process.clear(); + } + rtFinal[1].Activate(context); - fx.blendFlag = BLENDMODE_OPAQUE; fx.process.setFXAA(getFXAAEnabled()); - wiImage::Draw(rtFinal[0].shaderResource.back(), fx, context); + if (getDepthOfFieldEnabled()) + wiImage::Draw(rtDof[2].shaderResource.back(), fx, context); + else + wiImage::Draw(rtFinal[0].shaderResource.back(), fx, context); fx.process.clear(); if (getBloomEnabled()) diff --git a/WickedEngine/Renderable3DComponent.h b/WickedEngine/Renderable3DComponent.h index 43cb95f5b..8de4b5252 100644 --- a/WickedEngine/Renderable3DComponent.h +++ b/WickedEngine/Renderable3DComponent.h @@ -18,6 +18,8 @@ private: float reflectionQuality; float ssaoQuality; float ssaoBlur; + float dofFocus; + float dofStrength; wiWaterPlane waterPlane; @@ -35,6 +37,7 @@ private: bool lensFlareEnabled; bool motionBlurEnabled; bool sssEnabled; + bool depthOfFieldEnabled; protected: wiRenderTarget @@ -50,6 +53,7 @@ protected: , rtParticleAdditive , rtLensFlare , rtFinal[2] + , rtDof[3] ; vector rtSun, rtBloom, rtSSAO, rtSSS; wiDepthTarget dtDepthCopy; @@ -76,6 +80,8 @@ public: float getReflectionQuality(){ return reflectionQuality; } float getSSAOQuality(){ return ssaoQuality; } float getSSAOBlur(){ return ssaoBlur; } + float getDepthOfFieldFocus(){ return ssaoBlur; } + float getDepthOfFieldStrength(){ return ssaoBlur; } wiWaterPlane getWaterPlane(){ return waterPlane; } @@ -93,6 +99,7 @@ public: bool getLensFlareEnabled(){ return lensFlareEnabled; } bool getMotionBlurEnabled(){ return motionBlurEnabled; } bool getSSSEnabled(){ return sssEnabled; } + bool getDepthOfFieldEnabled(){ return depthOfFieldEnabled; } unsigned short getThreadingCount(){ return workerThreads.size(); } @@ -106,6 +113,8 @@ public: void setReflectionQuality(float value){ reflectionQuality = value; } void setSSAOQuality(float value){ ssaoQuality = value; } void setSSAOBlur(float value){ ssaoBlur = value; } + void setDepthOfFieldFocus(float value){ dofFocus = value; } + void setDepthOfFieldStrength(float value){ dofStrength = value; } void setWaterPlane(const wiWaterPlane& value){ waterPlane = value; } @@ -123,6 +132,7 @@ public: void setLensFlareEnabled(bool value){ lensFlareEnabled = value; } void setMotionBlurEnabled(bool value){ motionBlurEnabled = value; } void setSSSEnabled(bool value){ sssEnabled = value; } + void setDepthOfFieldEnabled(bool value){ depthOfFieldEnabled = value; } virtual void setPreferredThreadingCount(unsigned short value); diff --git a/WickedEngine/Renderable3DComponent_BindLua.cpp b/WickedEngine/Renderable3DComponent_BindLua.cpp index b11ae4431..c252f20b9 100644 --- a/WickedEngine/Renderable3DComponent_BindLua.cpp +++ b/WickedEngine/Renderable3DComponent_BindLua.cpp @@ -31,6 +31,10 @@ Luna::FunctionType Renderable3DComponent_BindLua: lunamethod(Renderable3DComponent_BindLua, SetLensFlareEnabled), lunamethod(Renderable3DComponent_BindLua, SetMotionBlurEnabled), lunamethod(Renderable3DComponent_BindLua, SetSSSEnabled), + lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldEnabled), + + lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus), + lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength), { NULL, NULL } }; Luna::PropertyType Renderable3DComponent_BindLua::properties[] = { @@ -59,8 +63,8 @@ int Renderable3DComponent_BindLua::SetSSAOEnabled(lua_State* L) wiLua::SError(L, "SetSSAOEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setSSAOEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setSSAOEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetSSAOEnabled(bool value) not enough arguments!"); return 0; @@ -72,8 +76,8 @@ int Renderable3DComponent_BindLua::SetSSREnabled(lua_State* L) wiLua::SError(L, "SetSSREnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setSSREnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setSSREnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetSSREnabled(bool value) not enough arguments!"); return 0; @@ -85,8 +89,8 @@ int Renderable3DComponent_BindLua::SetShadowsEnabled(lua_State* L) wiLua::SError(L, "SetShadowsEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setShadowsEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setShadowsEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetShadowsEnabled(bool value) not enough arguments!"); return 0; @@ -98,8 +102,8 @@ int Renderable3DComponent_BindLua::SetReflectionsEnabled(lua_State* L) wiLua::SError(L, "SetShadowsEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setReflectionsEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setReflectionsEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetShadowsEnabled(bool value) not enough arguments!"); return 0; @@ -111,8 +115,8 @@ int Renderable3DComponent_BindLua::SetFXAAEnabled(lua_State* L) wiLua::SError(L, "SetFXAAEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setFXAAEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setFXAAEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetFXAAEnabled(bool value) not enough arguments!"); return 0; @@ -124,8 +128,8 @@ int Renderable3DComponent_BindLua::SetBloomEnabled(lua_State* L) wiLua::SError(L, "SetBloomEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setBloomEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setBloomEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetBloomEnabled(bool value) not enough arguments!"); return 0; @@ -137,8 +141,8 @@ int Renderable3DComponent_BindLua::SetColorGradingEnabled(lua_State* L) wiLua::SError(L, "SetColorGradingEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setColorGradingEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setColorGradingEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetColorGradingEnabled(bool value) not enough arguments!"); return 0; @@ -150,8 +154,8 @@ int Renderable3DComponent_BindLua::SetEmitterParticlesEnabled(lua_State* L) wiLua::SError(L, "SetEmitterParticlesEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setEmitterParticlesEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setEmitterParticlesEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetEmitterParticlesEnabled(bool value) not enough arguments!"); return 0; @@ -163,8 +167,8 @@ int Renderable3DComponent_BindLua::SetHairParticlesEnabled(lua_State* L) wiLua::SError(L, "SetHairParticlesEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setHairParticlesEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setHairParticlesEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetHairParticlesEnabled(bool value) not enough arguments!"); return 0; @@ -176,8 +180,8 @@ int Renderable3DComponent_BindLua::SetVolumeLightsEnabled(lua_State* L) wiLua::SError(L, "SetVolumeLightsEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setVolumeLightsEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setVolumeLightsEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetVolumeLightsEnabled(bool value) not enough arguments!"); return 0; @@ -189,8 +193,8 @@ int Renderable3DComponent_BindLua::SetLightShaftsEnabled(lua_State* L) wiLua::SError(L, "SetLightShaftsEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setLightShaftsEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setLightShaftsEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetLightShaftsEnabled(bool value) not enough arguments!"); return 0; @@ -202,8 +206,8 @@ int Renderable3DComponent_BindLua::SetLensFlareEnabled(lua_State* L) wiLua::SError(L, "SetLensFlareEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setLensFlareEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setLensFlareEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetLensFlareEnabled(bool value) not enough arguments!"); return 0; @@ -215,8 +219,8 @@ int Renderable3DComponent_BindLua::SetMotionBlurEnabled(lua_State* L) wiLua::SError(L, "SetMotionBlurEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setMotionBlurEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setMotionBlurEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetMotionBlurEnabled(bool value) not enough arguments!"); return 0; @@ -228,12 +232,59 @@ int Renderable3DComponent_BindLua::SetSSSEnabled(lua_State* L) wiLua::SError(L, "SetSSSEnabled(bool value) component is null!"); return 0; } - if (wiLua::SGetArgCount(L) > 1) - ((Renderable3DComponent*)component)->setSSSEnabled(wiLua::SGetBool(L, 2)); + if (wiLua::SGetArgCount(L) > 0) + ((Renderable3DComponent*)component)->setSSSEnabled(wiLua::SGetBool(L, 1)); else wiLua::SError(L, "SetSSSEnabled(bool value) not enough arguments!"); return 0; } +int Renderable3DComponent_BindLua::SetDepthOfFieldEnabled(lua_State* L) +{ + if (component == nullptr) + { + wiLua::SError(L, "SetDepthOfFieldEnabled(bool value) component is null!"); + return 0; + } + if (wiLua::SGetArgCount(L) > 0) + { + ((Renderable3DComponent*)component)->setDepthOfFieldEnabled(wiLua::SGetBool(L, 1)); + } + else + wiLua::SError(L, "SetDepthOfFieldEnabled(bool value) not enough arguments!"); + return 0; +} + + +int Renderable3DComponent_BindLua::SetDepthOfFieldFocus(lua_State* L) +{ + if (component == nullptr) + { + wiLua::SError(L, "SetDepthOfFieldFocus(float value) component is null!"); + return 0; + } + if (wiLua::SGetArgCount(L) > 0) + { + ((Renderable3DComponent*)component)->setDepthOfFieldFocus(wiLua::SGetFloat(L, 1)); + } + else + wiLua::SError(L, "SetDepthOfFieldFocus(float value) not enough arguments!"); + return 0; +} +int Renderable3DComponent_BindLua::SetDepthOfFieldStrength(lua_State* L) +{ + if (component == nullptr) + { + wiLua::SError(L, "SetDepthOfFieldStrength(float value) component is null!"); + return 0; + } + if (wiLua::SGetArgCount(L) > 0) + { + ((Renderable3DComponent*)component)->setDepthOfFieldStrength(wiLua::SGetFloat(L, 1)); + } + else + wiLua::SError(L, "SetDepthOfFieldStrength(float value) not enough arguments!"); + return 0; +} void Renderable3DComponent_BindLua::Bind() diff --git a/WickedEngine/Renderable3DComponent_BindLua.h b/WickedEngine/Renderable3DComponent_BindLua.h index ca18e51e0..5d40db46b 100644 --- a/WickedEngine/Renderable3DComponent_BindLua.h +++ b/WickedEngine/Renderable3DComponent_BindLua.h @@ -29,6 +29,10 @@ public: int SetLensFlareEnabled(lua_State* L); int SetMotionBlurEnabled(lua_State* L); int SetSSSEnabled(lua_State* L); + int SetDepthOfFieldEnabled(lua_State* L); + + int SetDepthOfFieldFocus(lua_State* L); + int SetDepthOfFieldStrength(lua_State* L); static void Bind(); }; diff --git a/WickedEngine/wiImageEffects.h b/WickedEngine/wiImageEffects.h index 7f252e631..798442dc7 100644 --- a/WickedEngine/wiImageEffects.h +++ b/WickedEngine/wiImageEffects.h @@ -72,7 +72,7 @@ public: bool colorGrade; void clear(){active=motionBlur=outline=fxaa=ssao=linDepth=colorGrade=ssr=false;dofStrength=0;ssss=XMFLOAT2(0,0);} - void setDOF(float value){dofStrength=value;active=(value<0.01?true:false);} + void setDOF(float value){dofStrength=value;active=value>FLT_EPSILON;} void setMotionBlur(bool value){motionBlur=value;active=value;} void setOutline(bool value){outline=value;active=value;} void setFXAA(bool value){fxaa=value;active=value;}