diff --git a/WickedEngine/ArchiveVersionHistory.txt b/WickedEngine/ArchiveVersionHistory.txt
new file mode 100644
index 000000000..6c20c8d4f
--- /dev/null
+++ b/WickedEngine/ArchiveVersionHistory.txt
@@ -0,0 +1,6 @@
+This file contains changelog of wiArchive versions
+
+2: serialized Material property planar_reflections
+1: Refactor Archive
+--VERSION_BARRIER------------------
+0: Created archive
\ No newline at end of file
diff --git a/WickedEngine/DeferredRenderableComponent.cpp b/WickedEngine/DeferredRenderableComponent.cpp
index 3996714d3..fb3e8c6b9 100644
--- a/WickedEngine/DeferredRenderableComponent.cpp
+++ b/WickedEngine/DeferredRenderableComponent.cpp
@@ -29,6 +29,7 @@ void DeferredRenderableComponent::Initialize()
rtGBuffer.Add(FORMAT_R16G16_FLOAT);
rtGBuffer.Add(FORMAT_R8G8B8A8_UNORM);
rtGBuffer.Add(FORMAT_R8G8B8A8_UNORM);
+ rtGBuffer.Add(FORMAT_R16G16_FLOAT);
rtDeferred.Initialize(
wiRenderer::GetDevice()->GetScreenWidth(), wiRenderer::GetDevice()->GetScreenHeight()
@@ -94,7 +95,7 @@ void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID){
static const int tessellationQuality = 0;
wiImageEffects fx((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight());
- rtGBuffer.Activate(threadID, 0.5f, 0.5f, 0.5f, 1); // special clearcolor! background should write 0.5 in velocity buffer!
+ rtGBuffer.Activate(threadID, 0, 0, 0, 0);
{
wiRenderer::SetClipPlane(XMFLOAT4(0, 0, 0, 0), threadID);
@@ -222,7 +223,7 @@ void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID){
rtDeferred.Activate(threadID, rtGBuffer.depth); {
wiImage::DrawDeferred((getSSSEnabled() ? rtSSS[0].GetTexture(0) : rtLight.GetTexture(0)), rtLight.GetTexture(1)
, getSSAOEnabled() ? rtSSAO.back().GetTexture() : wiTextureHelper::getInstance()->getWhite()
- , threadID, STENCILREF_DEFAULT);
+ , threadID, STENCILREF_DEFAULT);
wiRenderer::DrawSky(threadID);
}
@@ -237,27 +238,23 @@ void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID){
}
}
- if (getMotionBlurEnabled()){ //MOTIONBLUR
- rtMotionBlur.Activate(threadID);
- fx.process.setMotionBlur(true);
- //fx.setVelocityMap(rtGBuffer.shaderResource.back());
- //fx.setDepthMap(rtLinearDepth.shaderResource.back());
- fx.blendFlag = BLENDMODE_OPAQUE;
- if (getSSREnabled()){
- wiImage::Draw(rtSSR.GetTexture(), fx, threadID);
- }
- else{
- wiImage::Draw(rtDeferred.GetTexture(), fx, threadID);
- }
- fx.process.clear();
- }
+ //if (getMotionBlurEnabled()){ //MOTIONBLUR
+ // rtMotionBlur.Activate(threadID);
+ // fx.process.setMotionBlur(true);
+ // fx.blendFlag = BLENDMODE_OPAQUE;
+ // if (getSSREnabled()){
+ // wiImage::Draw(rtSSR.GetTexture(), fx, threadID);
+ // }
+ // else{
+ // wiImage::Draw(rtDeferred.GetTexture(), fx, threadID);
+ // }
+ // fx.process.clear();
+ //}
}
wiRenderTarget& DeferredRenderableComponent::GetFinalRT()
{
- if (getMotionBlurEnabled())
- return rtMotionBlur;
- else if (getSSREnabled())
+ if (getSSREnabled())
return rtSSR;
else
return rtDeferred;
diff --git a/WickedEngine/ForwardRenderableComponent.cpp b/WickedEngine/ForwardRenderableComponent.cpp
index 62c873d45..224ece4d9 100644
--- a/WickedEngine/ForwardRenderableComponent.cpp
+++ b/WickedEngine/ForwardRenderableComponent.cpp
@@ -72,7 +72,7 @@ void ForwardRenderableComponent::Render()
void ForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID)
{
- rtMain.Activate(threadID, 0.5f, 0.5f, 0.5f, 1);
+ rtMain.Activate(threadID, 0, 0, 0, 0);
{
wiRenderer::SetClipPlane(XMFLOAT4(0, 0, 0, 0), threadID);
diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp
index 84b9b27fb..f51a4b4b7 100644
--- a/WickedEngine/Renderable3DComponent.cpp
+++ b/WickedEngine/Renderable3DComponent.cpp
@@ -394,6 +394,17 @@ void Renderable3DComponent::RenderComposition2(wiRenderTarget& mainRT, GRAPHICST
}
wiImageEffects fx((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight());
+
+ if (getMotionBlurEnabled()) {
+ rtMotionBlur.Activate(threadID);
+ fx.process.setMotionBlur(true);
+ fx.blendFlag = BLENDMODE_OPAQUE;
+ fx.presentFullScreen = false;
+ wiImage::Draw(rtFinal[0].GetTexture(), fx, threadID);
+ fx.process.clear();
+ }
+
+
fx.blendFlag = BLENDMODE_OPAQUE;
rtFinal[1].Activate(threadID);
@@ -406,7 +417,14 @@ void Renderable3DComponent::RenderComposition2(wiRenderTarget& mainRT, GRAPHICST
{
fx.setMaskMap(wiTextureHelper::getInstance()->getColor(wiColor::Gray));
}
- wiImage::Draw(rtFinal[0].GetTexture(), fx, threadID);
+ if (getMotionBlurEnabled())
+ {
+ wiImage::Draw(rtMotionBlur.GetTexture(), fx, threadID);
+ }
+ else
+ {
+ wiImage::Draw(rtFinal[0].GetTexture(), fx, threadID);
+ }
fx.process.clear();
@@ -435,6 +453,7 @@ void Renderable3DComponent::RenderComposition2(wiRenderTarget& mainRT, GRAPHICST
fx.process.clear();
}
+
rtFinal[2].Activate(threadID, mainRT.depth);
fx.process.setFXAA(getFXAAEnabled());
if (getDepthOfFieldEnabled())
diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj b/WickedEngine/WickedEngine_SHADERS.vcxproj
index 64047afbb..245177d4a 100644
--- a/WickedEngine/WickedEngine_SHADERS.vcxproj
+++ b/WickedEngine/WickedEngine_SHADERS.vcxproj
@@ -251,10 +251,22 @@
Pixel
Pixel
+
+ Pixel
+
+
+ Pixel
+
Pixel
Pixel
+
+ Pixel
+
+
+ Pixel
+
Pixel
Pixel
diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters
index 115d34a26..fe361f98e 100644
--- a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters
+++ b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters
@@ -390,6 +390,18 @@
PS
+
+ PS
+
+
+ PS
+
+
+ PS
+
+
+ PS
+
diff --git a/WickedEngine/WickedEngine_SHARED.vcxitems b/WickedEngine/WickedEngine_SHARED.vcxitems
index 9c72357fd..61fc5a672 100644
--- a/WickedEngine/WickedEngine_SHARED.vcxitems
+++ b/WickedEngine/WickedEngine_SHARED.vcxitems
@@ -692,6 +692,7 @@
+
true
Document
diff --git a/WickedEngine/WickedEngine_SHARED.vcxitems.filters b/WickedEngine/WickedEngine_SHARED.vcxitems.filters
index 1b9becb15..254b74e41 100644
--- a/WickedEngine/WickedEngine_SHARED.vcxitems.filters
+++ b/WickedEngine/WickedEngine_SHARED.vcxitems.filters
@@ -1859,6 +1859,7 @@
fonts
+
diff --git a/WickedEngine/grassPS.hlsl b/WickedEngine/grassPS.hlsl
index 4fb01e17c..5218b770e 100644
--- a/WickedEngine/grassPS.hlsl
+++ b/WickedEngine/grassPS.hlsl
@@ -8,8 +8,6 @@ GBUFFEROutputType main(GS_OUT PSIn)
clip(dither(PSIn.pos.xy) - PSIn.fade);
#endif
- float2 velocity = 0;
-
float4 color = float4(PSIn.col,1);
color = DEGAMMA(color);
float emissive = 0;
diff --git a/WickedEngine/motionBlurPS.hlsl b/WickedEngine/motionBlurPS.hlsl
index 75af00ee8..7b10581e6 100644
--- a/WickedEngine/motionBlurPS.hlsl
+++ b/WickedEngine/motionBlurPS.hlsl
@@ -1,13 +1,18 @@
#include "postProcessHF.hlsli"
+#include "reconstructPositionHF.hlsli"
float4 main(VertexToPixelPostProcess PSIn) : SV_TARGET
{
float3 color = float3(0,0,0);
- float numSampling = 0.0f;
+ float numSampling = 0.0f;
- float2 vel = texture_gbuffer2.SampleLevel(Sampler, PSIn.tex, 0).xy - 0.5;
- //return float4(vel,0,1);
- vel *= 0.06f;
+ float depth = texture_depth.SampleLevel(sampler_point_clamp, PSIn.tex, 0);
+ float3 P = getPosition(PSIn.tex, depth);
+ float2 pos2D = PSIn.tex.xy*2-1;
+ float4 pos2DPrev = mul(float4(P, 1), g_xCamera_PrevVP);
+ pos2DPrev.xy = float2(1,-1)*pos2DPrev.xy/pos2DPrev.w;
+ float2 vel = pos2D - pos2DPrev.xy;
+ vel *= 0.025f;
numSampling++;
diff --git a/WickedEngine/objectHF.hlsli b/WickedEngine/objectHF.hlsli
index b68164abe..f1d3307a5 100644
--- a/WickedEngine/objectHF.hlsli
+++ b/WickedEngine/objectHF.hlsli
@@ -15,13 +15,6 @@
// DEFINITIONS
//////////////////
-//#define xTextureMap texture_0
-//#define xReflectionMap texture_1
-//#define xNormalMap texture_2
-//#define xSpecularMap texture_3
-//#define xDisplacementMap texture_4
-//#define xReflection texture_5
-
#define xBaseColorMap texture_0
#define xNormalMap texture_1
#define xRoughnessMap texture_2
@@ -56,6 +49,7 @@ struct GBUFFEROutputType
float4 g1 : SV_TARGET1; // texture_gbuffer1
float4 g2 : SV_TARGET2; // texture_gbuffer2
float4 g3 : SV_TARGET3; // texture_gbuffer3
+ float4 g4 : SV_TARGET4; // texture_gbuffer4
};
@@ -71,12 +65,13 @@ inline void NormalMapping(in float2 UV, in float3 V, inout float3 N, inout float
N = normalize(lerp(N, mul(bumpColor, tangentFrame), g_xMat_normalMapStrength));
}
-//inline void PlanarReflection(in float2 UV, in float2 reflectionUV, in float3 N, inout float4 baseColor)
-//{
-// float colorMat = xReflectionMap.SampleLevel(sampler_aniso_wrap, UV, 0).r;
-// float4 colorReflection = xReflection.SampleLevel(sampler_linear_clamp, reflectionUV + N.xz, 0);
-// baseColor.rgb = lerp(baseColor.rgb, colorReflection.rgb, colorMat);
-//}
+inline float3 PlanarReflection(in float2 UV, in float2 reflectionUV, in float3 N, in float3 V, in float roughness, in float3 f0)
+{
+ float4 colorReflection = xReflection.SampleLevel(sampler_linear_clamp, reflectionUV + N.xz*0.1f, 0);
+ float f90 = saturate(50.0 * dot(f0, 0.33));
+ float3 F = F_Schlick(f0, f90, abs(dot(N, V)) + 1e-5f);
+ return colorReflection.rgb * F;
+}
inline void Refraction(in float2 ScreenCoord, in float2 normal2D, in float3 bumpColor, inout float alpha, inout float3 albedo)
{
@@ -137,8 +132,6 @@ inline void DirectionalLight(in float3 N, in float3 V, in float3 P, in float3 f0
float lineardepth = input.pos2D.z; \
float2 refUV = float2(1, -1)*input.ReflectionMapSamplingPos.xy / input.ReflectionMapSamplingPos.w / 2.0f + 0.5f;\
float2 ScreenCoord = float2(1, -1) * input.pos2D.xy / input.pos2D.w / 2.0f + 0.5f; \
- float2 ScreenCoordPrev = float2(1, -1)*input.pos2DPrev.xy / input.pos2DPrev.w / 2.0f + 0.5f; \
- float2 velocity = ScreenCoord - ScreenCoordPrev;
#define OBJECT_PS_LIGHT_BEGIN \
float3 diffuse, specular; \
@@ -156,12 +149,11 @@ inline void DirectionalLight(in float3 N, in float3 V, in float3 P, in float3 f0
#define OBJECT_PS_NORMALMAPPING \
NormalMapping(UV, P, N, bumpColor);
-//#define OBJECT_PS_PLANARREFLECTIONS \
-// PlanarReflection(input.tex, refUV, N, color);
+#define OBJECT_PS_PLANARREFLECTIONS \
+ specular += PlanarReflection(UV, refUV, N, V, roughness, f0);
#define OBJECT_PS_ENVIRONMENTREFLECTIONS \
specular += EnvironmentReflection(N, V, P, roughness, f0);
-
#define OBJECT_PS_REFRACTION \
Refraction(ScreenCoord, input.nor2D, bumpColor, color.a, albedo);
@@ -169,7 +161,7 @@ inline void DirectionalLight(in float3 N, in float3 V, in float3 P, in float3 f0
#define OBJECT_PS_DEGAMMA \
color = DEGAMMA(color);
-#define OBJECT_PS_GAMMA \
+#define OBJECT_PS_GAMMA \
color = GAMMA(color);
#define OBJECT_PS_EMISSIVE \
@@ -182,7 +174,7 @@ inline void DirectionalLight(in float3 N, in float3 V, in float3 P, in float3 f0
GBUFFEROutputType Out = (GBUFFEROutputType)0; \
Out.g0 = float4(color.rgb, 1); /*FORMAT_R8G8B8A8_UNORM*/ \
Out.g1 = float4(encode(N), 0, 0); /*FORMAT_R16G16_FLOAT*/ \
- Out.g2 = float4(velocity * 0.5f + 0.5f, sss, emissive); /*FORMAT_R8G8B8A8_UNORM*/ \
+ Out.g2 = float4(0, 0, sss, emissive); /*FORMAT_R8G8B8A8_UNORM*/ \
Out.g3 = float4(roughness, reflectance, metalness, ao); /*FORMAT_R8G8B8A8_UNORM*/ \
return Out;
diff --git a/WickedEngine/objectPS_forward_dirlight_normalmap_planarreflection.hlsl b/WickedEngine/objectPS_forward_dirlight_normalmap_planarreflection.hlsl
new file mode 100644
index 000000000..9e899043f
--- /dev/null
+++ b/WickedEngine/objectPS_forward_dirlight_normalmap_planarreflection.hlsl
@@ -0,0 +1,28 @@
+#include "objectHF.hlsli"
+
+
+float4 main(PixelInputType input) : SV_TARGET
+{
+ OBJECT_PS_DITHER
+
+ OBJECT_PS_MAKE
+
+ OBJECT_PS_DEGAMMA
+
+ OBJECT_PS_LIGHT_BEGIN
+
+ OBJECT_PS_NORMALMAPPING
+
+ OBJECT_PS_LIGHT_DIRECTIONAL
+
+ OBJECT_PS_PLANARREFLECTIONS
+
+ OBJECT_PS_LIGHT_END
+
+ OBJECT_PS_EMISSIVE
+
+ OBJECT_PS_FOG
+
+ OBJECT_PS_OUT_FORWARD
+}
+
diff --git a/WickedEngine/objectPS_forward_dirlight_planarreflection.hlsl b/WickedEngine/objectPS_forward_dirlight_planarreflection.hlsl
new file mode 100644
index 000000000..bb1ba4fb8
--- /dev/null
+++ b/WickedEngine/objectPS_forward_dirlight_planarreflection.hlsl
@@ -0,0 +1,26 @@
+#include "objectHF.hlsli"
+
+
+float4 main(PixelInputType input) : SV_TARGET
+{
+ OBJECT_PS_DITHER
+
+ OBJECT_PS_MAKE
+
+ OBJECT_PS_DEGAMMA
+
+ OBJECT_PS_LIGHT_BEGIN
+
+ OBJECT_PS_LIGHT_DIRECTIONAL
+
+ OBJECT_PS_PLANARREFLECTIONS
+
+ OBJECT_PS_LIGHT_END
+
+ OBJECT_PS_EMISSIVE
+
+ OBJECT_PS_FOG
+
+ OBJECT_PS_OUT_FORWARD
+}
+
diff --git a/WickedEngine/objectPS_forward_dirlight_transparent_normalmap_planarreflection.hlsl b/WickedEngine/objectPS_forward_dirlight_transparent_normalmap_planarreflection.hlsl
new file mode 100644
index 000000000..ff4d2016c
--- /dev/null
+++ b/WickedEngine/objectPS_forward_dirlight_transparent_normalmap_planarreflection.hlsl
@@ -0,0 +1,28 @@
+#include "objectHF.hlsli"
+
+
+
+float4 main( PixelInputType input) : SV_TARGET
+{
+ OBJECT_PS_MAKE
+
+ OBJECT_PS_DEGAMMA
+
+ OBJECT_PS_LIGHT_BEGIN
+
+ OBJECT_PS_NORMALMAPPING
+
+ OBJECT_PS_REFRACTION
+
+ OBJECT_PS_LIGHT_DIRECTIONAL
+
+ OBJECT_PS_PLANARREFLECTIONS
+
+ OBJECT_PS_LIGHT_END
+
+ OBJECT_PS_EMISSIVE
+
+ OBJECT_PS_FOG
+
+ OBJECT_PS_OUT_FORWARD
+}
\ No newline at end of file
diff --git a/WickedEngine/objectPS_forward_dirlight_transparent_planarreflection.hlsl b/WickedEngine/objectPS_forward_dirlight_transparent_planarreflection.hlsl
new file mode 100644
index 000000000..ec1d1b1a6
--- /dev/null
+++ b/WickedEngine/objectPS_forward_dirlight_transparent_planarreflection.hlsl
@@ -0,0 +1,26 @@
+#include "objectHF.hlsli"
+
+
+
+float4 main(PixelInputType input) : SV_TARGET
+{
+ OBJECT_PS_MAKE
+
+ OBJECT_PS_DEGAMMA
+
+ OBJECT_PS_LIGHT_BEGIN
+
+ OBJECT_PS_REFRACTION
+
+ OBJECT_PS_LIGHT_DIRECTIONAL
+
+ OBJECT_PS_PLANARREFLECTIONS
+
+ OBJECT_PS_LIGHT_END
+
+ OBJECT_PS_EMISSIVE
+
+ OBJECT_PS_FOG
+
+ OBJECT_PS_OUT_FORWARD
+}
\ No newline at end of file
diff --git a/WickedEngine/qGrassPS.hlsl b/WickedEngine/qGrassPS.hlsl
index 8633a457f..23001fef2 100644
--- a/WickedEngine/qGrassPS.hlsl
+++ b/WickedEngine/qGrassPS.hlsl
@@ -8,10 +8,6 @@ GBUFFEROutputType main(QGS_OUT PSIn)
clip(dither(PSIn.pos.xy) - PSIn.fade);
#endif
- float2 ScreenCoord = float2(1, -1) * PSIn.pos2D.xy / PSIn.pos2D.w / 2.0f + 0.5f;
- float2 ScreenCoordPrev = float2(1, -1) * PSIn.pos2DPrev.xy / PSIn.pos2DPrev.w / 2.0f + 0.5f;
- float2 velocity = ScreenCoord - ScreenCoordPrev;
-
float4 color = texture_0.Sample(sampler_linear_clamp,PSIn.tex);
ALPHATEST(color.a)
color = DEGAMMA(color);
diff --git a/WickedEngine/skyHF.hlsli b/WickedEngine/skyHF.hlsli
index 2162c6c39..09a402349 100644
--- a/WickedEngine/skyHF.hlsli
+++ b/WickedEngine/skyHF.hlsli
@@ -1,7 +1,6 @@
#ifndef _SKY_HF_
#define _SKY_HF_
#include "globals.hlsli"
-#include "objectHF.hlsli"
inline float3 GetSkyColor(in float3 normal)
{
diff --git a/WickedEngine/skyPS.hlsl b/WickedEngine/skyPS.hlsl
index 5a73b54c0..a34f2287f 100644
--- a/WickedEngine/skyPS.hlsl
+++ b/WickedEngine/skyPS.hlsl
@@ -7,7 +7,7 @@ struct VSOut{
float4 pos2DPrev : SCREENPOSITIONPREV;
};
-float4 main(VSOut PSIn) : SV_TARGET
+float4 main(VSOut PSIn) : SV_Target
{
return float4(GetSkyColor(PSIn.nor), 1);
}
diff --git a/WickedEngine/wiArchive.cpp b/WickedEngine/wiArchive.cpp
index c470791f4..72329933c 100644
--- a/WickedEngine/wiArchive.cpp
+++ b/WickedEngine/wiArchive.cpp
@@ -2,7 +2,7 @@
#include "wiHelper.h"
// this should always be only INCREMENTED and only if a new serialization is implemeted somewhere!
-uint64_t __archiveVersion = 1;
+uint64_t __archiveVersion = 2;
// this is the version number of which below the archive is not compatible with the current version
uint64_t __archiveVersionBarrier = 1;
@@ -28,6 +28,13 @@ wiArchive::wiArchive(const string& fileName, bool readMode):readMode(readMode),p
wiHelper::messageBox(ss.str(), "Error!");
Close();
}
+ if (version > __archiveVersion)
+ {
+ stringstream ss("");
+ ss << "The archive version (" << version << ") is higher than the program's ("<<__archiveVersion<<")!";
+ wiHelper::messageBox(ss.str(), "Error!");
+ Close();
+ }
}
}
else
diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h
index 2358f3d08..0437abbb2 100644
--- a/WickedEngine/wiEnums.h
+++ b/WickedEngine/wiEnums.h
@@ -113,6 +113,10 @@ enum PSTYPES
PSTYPE_OBJECT_FORWARD_DIRLIGHT_NORMALMAP,
PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT,
PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT_NORMALMAP,
+ PSTYPE_OBJECT_FORWARD_DIRLIGHT_PLANARREFLECTION,
+ PSTYPE_OBJECT_FORWARD_DIRLIGHT_NORMALMAP_PLANARREFLECTION,
+ PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT_PLANARREFLECTION,
+ PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT_NORMALMAP_PLANARREFLECTION,
PSTYPE_SHADOW,
PSTYPE_LINE,
PSTYPE_TRAIL,
diff --git a/WickedEngine/wiImage.cpp b/WickedEngine/wiImage.cpp
index b60563dac..784f0ad1b 100644
--- a/WickedEngine/wiImage.cpp
+++ b/WickedEngine/wiImage.cpp
@@ -21,7 +21,8 @@ PixelShader *wiImage::pixelShader = nullptr, *wiImage::blurHPS = nullptr, *
RasterizerState *wiImage::rasterizerState = nullptr;
-DepthStencilState *wiImage::depthStencilStateGreater = nullptr,*wiImage::depthStencilStateLess = nullptr,*wiImage::depthNoStencilState = nullptr;
+DepthStencilState *wiImage::depthStencilStateGreater = nullptr, *wiImage::depthStencilStateLess = nullptr, *wiImage::depthStencilStateEqual = nullptr
+ ,*wiImage::depthNoStencilState = nullptr;
#pragma endregion
@@ -121,6 +122,11 @@ void wiImage::SetUpStates()
depthStencilStateLess = new DepthStencilState;
wiRenderer::GetDevice()->CreateDepthStencilState(&dsd, depthStencilStateLess);
+ dsd.FrontFace.StencilFunc = COMPARISON_EQUAL;
+ dsd.BackFace.StencilFunc = COMPARISON_EQUAL;
+ depthStencilStateEqual = new DepthStencilState;
+ wiRenderer::GetDevice()->CreateDepthStencilState(&dsd, depthStencilStateEqual);
+
dsd.DepthEnable = false;
dsd.DepthWriteMask = DEPTH_WRITE_MASK_ZERO;
@@ -234,14 +240,6 @@ void wiImage::Draw(Texture2D* texture, const wiImageEffects& effects,GRAPHICSTHR
else
device->BindBlendState(blendState, threadID);
- if (effects.presentFullScreen)
- {
- device->BindVS(screenVS, threadID);
- device->BindPS(screenPS, threadID);
- device->Draw(3, threadID);
- device->EventEnd(threadID);
- return;
- }
ImageCB cb;
PostProcessCB prcb;
@@ -249,17 +247,31 @@ void wiImage::Draw(Texture2D* texture, const wiImageEffects& effects,GRAPHICSTHR
switch (effects.stencilComp)
{
case COMPARISON_LESS:
+ case COMPARISON_LESS_EQUAL:
device->BindDepthStencilState(depthStencilStateLess, effects.stencilRef, threadID);
break;
case COMPARISON_GREATER:
+ case COMPARISON_GREATER_EQUAL:
device->BindDepthStencilState(depthStencilStateGreater, effects.stencilRef, threadID);
break;
+ case COMPARISON_EQUAL:
+ device->BindDepthStencilState(depthStencilStateEqual, effects.stencilRef, threadID);
+ break;
default:
device->BindDepthStencilState(depthNoStencilState, effects.stencilRef, threadID);
break;
}
}
+ if (effects.presentFullScreen)
+ {
+ device->BindVS(screenVS, threadID);
+ device->BindPS(screenPS, threadID);
+ device->Draw(3, threadID);
+ device->EventEnd(threadID);
+ return;
+ }
+
if(!effects.blur)
{
if(!effects.process.active && !effects.bloom.separate && !effects.sunPos.x && !effects.sunPos.y){
@@ -491,6 +503,7 @@ void wiImage::CleanUp()
SAFE_DELETE(rasterizerState);
SAFE_DELETE(depthStencilStateGreater);
SAFE_DELETE(depthStencilStateLess);
+ SAFE_DELETE(depthStencilStateEqual);
SAFE_DELETE(depthNoStencilState);
SAFE_DELETE(vertexShader);
diff --git a/WickedEngine/wiImage.h b/WickedEngine/wiImage.h
index 0c68b94e5..46878bf14 100644
--- a/WickedEngine/wiImage.h
+++ b/WickedEngine/wiImage.h
@@ -51,7 +51,7 @@ protected:
static wiGraphicsTypes::RasterizerState *rasterizerState;
- static wiGraphicsTypes::DepthStencilState *depthStencilStateGreater,*depthStencilStateLess,*depthNoStencilState;
+ static wiGraphicsTypes::DepthStencilState *depthStencilStateGreater, *depthStencilStateLess, *depthStencilStateEqual,*depthNoStencilState;
public:
static void LoadShaders();
diff --git a/WickedEngine/wiLoader.cpp b/WickedEngine/wiLoader.cpp
index 41e2da126..25bad5125 100644
--- a/WickedEngine/wiLoader.cpp
+++ b/WickedEngine/wiLoader.cpp
@@ -1470,6 +1470,10 @@ void Material::Serialize(wiArchive& archive)
archive >> refractionIndex;
archive >> subsurfaceScattering;
archive >> normalMapStrength;
+ if (archive.GetVersion() >= 2)
+ {
+ archive >> planar_reflections;
+ }
if (!refMapName.empty())
{
@@ -1516,6 +1520,10 @@ void Material::Serialize(wiArchive& archive)
archive << refractionIndex;
archive << subsurfaceScattering;
archive << normalMapStrength;
+ if (archive.GetVersion() >= 2)
+ {
+ archive << planar_reflections;
+ }
}
}
#pragma endregion
diff --git a/WickedEngine/wiLoader.h b/WickedEngine/wiLoader.h
index b7f5d6969..8b96ee2a4 100644
--- a/WickedEngine/wiLoader.h
+++ b/WickedEngine/wiLoader.h
@@ -149,6 +149,8 @@ struct Material
float subsurfaceScattering;
float normalMapStrength;
+ bool planar_reflections;
+
Material()
{
@@ -201,10 +203,13 @@ struct Material
subsurfaceScattering = 0.0f;
emissive = 0.0f;
normalMapStrength = 1.0f;
+
+ planar_reflections = false;
}
bool IsTransparent() { return alpha < 1.0f; }
bool IsWater() { return water; }
+ bool HasPlanarReflection() { return planar_reflections; }
RENDERTYPE GetRenderType()
{
if (IsWater())
@@ -924,6 +929,11 @@ struct Camera:public Transform{
XMStoreFloat3(&this->Up, Up);
frustum.ConstructFrustum(zFarP, Projection, this->View);
+
+ XMMATRIX VP = XMMatrixMultiply(View, GetProjection());
+ XMStoreFloat4x4(&this->VP, VP);
+ XMStoreFloat4x4(&InvView, XMMatrixInverse(nullptr, View));
+ XMStoreFloat4x4(&InvVP, XMMatrixInverse(nullptr, VP));
}
void UpdateProjection()
{
diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp
index c4e82ad65..72499c27a 100644
--- a/WickedEngine/wiRenderer.cpp
+++ b/WickedEngine/wiRenderer.cpp
@@ -653,6 +653,10 @@ void wiRenderer::LoadBasicShaders()
pixelShaders[PSTYPE_OBJECT_FORWARD_DIRLIGHT_NORMALMAP] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_forward_dirlight_normalmap.cso", wiResourceManager::PIXELSHADER));
pixelShaders[PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_forward_dirlight_transparent.cso", wiResourceManager::PIXELSHADER));
pixelShaders[PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT_NORMALMAP] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_forward_dirlight_transparent_normalmap.cso", wiResourceManager::PIXELSHADER));
+ pixelShaders[PSTYPE_OBJECT_FORWARD_DIRLIGHT_PLANARREFLECTION] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_forward_dirlight_planarreflection.cso", wiResourceManager::PIXELSHADER));
+ pixelShaders[PSTYPE_OBJECT_FORWARD_DIRLIGHT_NORMALMAP_PLANARREFLECTION] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_forward_dirlight_normalmap_planarreflection.cso", wiResourceManager::PIXELSHADER));
+ pixelShaders[PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT_PLANARREFLECTION] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_forward_dirlight_transparent_planarreflection.cso", wiResourceManager::PIXELSHADER));
+ pixelShaders[PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT_NORMALMAP_PLANARREFLECTION] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_forward_dirlight_transparent_normalmap_planarreflection.cso", wiResourceManager::PIXELSHADER));
pixelShaders[PSTYPE_SIMPLEST] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_simplest.cso", wiResourceManager::PIXELSHADER));
pixelShaders[PSTYPE_BLACKOUT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_blackout.cso", wiResourceManager::PIXELSHADER));
pixelShaders[PSTYPE_TEXTUREONLY] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_textureonly.cso", wiResourceManager::PIXELSHADER));
@@ -2002,8 +2006,8 @@ void wiRenderer::DrawLights(Camera* camera, GRAPHICSTHREAD threadID)
GetDevice()->BindPrimitiveTopology(TRIANGLELIST,threadID);
- GetDevice()->BindBlendState(blendStates[BSTYPE_ADDITIVE],threadID);
GetDevice()->BindRasterizerState(rasterizers[RSTYPE_BACK],threadID);
+ GetDevice()->BindBlendState(blendStates[BSTYPE_ADDITIVE], threadID);
GetDevice()->BindVertexLayout(nullptr, threadID);
GetDevice()->BindVertexBuffer(nullptr, 0, 0, threadID);
@@ -2866,10 +2870,18 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, GRAPHICSTHRE
if (subset.material->GetNormalMap() == nullptr)
{
realPS = PSTYPE_OBJECT_FORWARD_DIRLIGHT;
+ if (subset.material->HasPlanarReflection())
+ {
+ realPS = PSTYPE_OBJECT_FORWARD_DIRLIGHT_PLANARREFLECTION;
+ }
}
else
{
realPS = PSTYPE_OBJECT_FORWARD_DIRLIGHT_NORMALMAP;
+ if (subset.material->HasPlanarReflection())
+ {
+ realPS = PSTYPE_OBJECT_FORWARD_DIRLIGHT_NORMALMAP_PLANARREFLECTION;
+ }
}
break;
default:
@@ -3030,10 +3042,18 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, Texture2D* refracRes, Text
if (subset.material->GetNormalMap() == nullptr)
{
realPS = PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT;
+ if (subset.material->HasPlanarReflection())
+ {
+ realPS = PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT_PLANARREFLECTION;
+ }
}
else
{
realPS = PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT_NORMALMAP;
+ if (subset.material->HasPlanarReflection())
+ {
+ realPS = PSTYPE_OBJECT_FORWARD_DIRLIGHT_TRANSPARENT_NORMALMAP_PLANARREFLECTION;
+ }
}
}
}
@@ -3205,7 +3225,7 @@ void wiRenderer::UpdateCameraCB(GRAPHICSTHREAD threadID)
cb.mPrevP = XMMatrixTranspose(prevCam->GetProjection());
cb.mPrevVP = XMMatrixTranspose(prevCam->GetViewProjection());
cb.mReflVP = XMMatrixTranspose(reflCam->GetViewProjection());
- cb.mInvP = XMMatrixInverse(nullptr, cb.mVP);
+ cb.mInvVP = XMMatrixTranspose(camera->GetInvViewProjection());
cb.mCamPos = camera->translation;
cb.mAt = camera->At;
cb.mUp = camera->Up;
diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h
index 404fb4670..8a292b5b2 100644
--- a/WickedEngine/wiRenderer.h
+++ b/WickedEngine/wiRenderer.h
@@ -122,7 +122,7 @@ protected:
XMMATRIX mPrevP;
XMMATRIX mPrevVP;
XMMATRIX mReflVP;
- XMMATRIX mInvP;
+ XMMATRIX mInvVP;
XMFLOAT3 mCamPos; float pad0;
XMFLOAT3 mAt; float pad1;
XMFLOAT3 mUp; float pad2;
diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp
index 16f8ddd2c..cf9b08803 100644
--- a/WickedEngine/wiVersion.cpp
+++ b/WickedEngine/wiVersion.cpp
@@ -7,7 +7,7 @@ namespace wiVersion
// minor features, major bug fixes
const int minor = 8;
// minor bug fixes, alterations, refactors
- const int revision = 22;
+ const int revision = 24;
long GetVersion()