diff --git a/WickedEngine/DeferredRenderableComponent.cpp b/WickedEngine/DeferredRenderableComponent.cpp index 4432db44c..0897a0dde 100644 --- a/WickedEngine/DeferredRenderableComponent.cpp +++ b/WickedEngine/DeferredRenderableComponent.cpp @@ -287,6 +287,11 @@ wiRenderTarget& DeferredRenderableComponent::GetFinalRT() return rtDeferred; } +wiDepthTarget* DeferredRenderableComponent::GetDepthBuffer() +{ + return rtGBuffer.depth; +} + void DeferredRenderableComponent::setPreferredThreadingCount(unsigned short value) { Renderable3DComponent::setPreferredThreadingCount(value); diff --git a/WickedEngine/DeferredRenderableComponent.h b/WickedEngine/DeferredRenderableComponent.h index 3ba190536..bea658ca3 100644 --- a/WickedEngine/DeferredRenderableComponent.h +++ b/WickedEngine/DeferredRenderableComponent.h @@ -17,6 +17,8 @@ public: DeferredRenderableComponent(); virtual ~DeferredRenderableComponent(); + virtual wiDepthTarget* GetDepthBuffer() override; + virtual void setPreferredThreadingCount(unsigned short value) override; virtual void Initialize() override; diff --git a/WickedEngine/Editor.cpp b/WickedEngine/Editor.cpp index 03300029d..1b97b6934 100644 --- a/WickedEngine/Editor.cpp +++ b/WickedEngine/Editor.cpp @@ -182,6 +182,13 @@ void ClearSelected() savedParents.clear(); } +enum EDITORSTENCILREF +{ + EDITORSTENCILREF_CLEAR = 0x00, + EDITORSTENCILREF_HIGHLIGHT = 0x01, + EDITORSTENCILREF_LAST = 0x0F, +}; + wiArchive *clipboard_write = nullptr, *clipboard_read = nullptr; enum ClipboardItemType @@ -880,6 +887,8 @@ void EditorComponent::Update(float dt) Material* material = picked->object->mesh->subsets[picked->subsetIndex].material; materialWnd->SetMaterial(material); + + material->SetUserStencilRef(EDITORSTENCILREF_HIGHLIGHT); } if (picked->object->isArmatureDeformed()) { @@ -1219,19 +1228,7 @@ void EditorComponent::Compose() } } - - //// Test Halton sequence: - //for (int i = 0; i < 64; ++i) - //{ - // const XMFLOAT4& halton = wiMath::GetHaltonSequence(i); - // wiImageEffects fx = wiImageEffects(); - // fx.pos.x = halton.x * wiRenderer::GetDevice()->GetScreenWidth(); - // fx.pos.y = halton.y * wiRenderer::GetDevice()->GetScreenHeight(); - // fx.siz = XMFLOAT2(10, 10); - // fx.pivot = XMFLOAT2(0.5f, 0.5f); - // fx.blendFlag = BLENDMODE_OPAQUE; - // wiImage::Draw(wiTextureHelper::getInstance()->getWhite(), fx, GRAPHICSTHREAD_IMMEDIATE); - //} + //wiImage::Draw(GetDepthBuffer()->GetTexture(), wiImageEffects(0, 0, 400, 200), GRAPHICSTHREAD_IMMEDIATE); } void EditorComponent::Unload() diff --git a/WickedEngine/Editor.h b/WickedEngine/Editor.h index 033beaa11..1b4277667 100644 --- a/WickedEngine/Editor.h +++ b/WickedEngine/Editor.h @@ -25,9 +25,9 @@ public: class Editor; class EditorComponent - //: public DeferredRenderableComponent + : public DeferredRenderableComponent //: public ForwardRenderableComponent - : public TiledForwardRenderableComponent + //: public TiledForwardRenderableComponent { private: wiGraphicsTypes::Texture2D pointLightTex, spotLightTex, dirLightTex, areaLightTex; diff --git a/WickedEngine/ForwardRenderableComponent.cpp b/WickedEngine/ForwardRenderableComponent.cpp index 14f4da1a9..80252e4bb 100644 --- a/WickedEngine/ForwardRenderableComponent.cpp +++ b/WickedEngine/ForwardRenderableComponent.cpp @@ -127,6 +127,10 @@ void ForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) wiProfiler::GetInstance().EndRange(); // Opaque Scene } +wiDepthTarget* ForwardRenderableComponent::GetDepthBuffer() +{ + return rtMain.depth; +} void ForwardRenderableComponent::setPreferredThreadingCount(unsigned short value) { diff --git a/WickedEngine/ForwardRenderableComponent.h b/WickedEngine/ForwardRenderableComponent.h index c182b95c6..489c4b930 100644 --- a/WickedEngine/ForwardRenderableComponent.h +++ b/WickedEngine/ForwardRenderableComponent.h @@ -16,6 +16,8 @@ public: ForwardRenderableComponent(); virtual ~ForwardRenderableComponent(); + virtual wiDepthTarget* GetDepthBuffer() override; + virtual void setPreferredThreadingCount(unsigned short value) override; diff --git a/WickedEngine/MaterialWindow.cpp b/WickedEngine/MaterialWindow.cpp index 1a982fd40..2300837aa 100644 --- a/WickedEngine/MaterialWindow.cpp +++ b/WickedEngine/MaterialWindow.cpp @@ -409,6 +409,11 @@ MaterialWindow::~MaterialWindow() void MaterialWindow::SetMaterial(Material* mat) { + if (material != nullptr) + { + material->SetUserStencilRef(0); + } + material = mat; if (material != nullptr) { diff --git a/WickedEngine/Renderable3DComponent.h b/WickedEngine/Renderable3DComponent.h index a6ff8ab95..31d6eec5d 100644 --- a/WickedEngine/Renderable3DComponent.h +++ b/WickedEngine/Renderable3DComponent.h @@ -80,6 +80,8 @@ protected: virtual void RenderComposition(wiRenderTarget& shadedSceneRT, wiRenderTarget& mainRT, GRAPHICSTHREAD threadID); virtual void RenderColorGradedComposition(); public: + virtual wiDepthTarget* GetDepthBuffer() = 0; + inline float getLightShaftQuality(){ return lightShaftQuality; } inline float getBloomDownSample(){ return bloomDownSample; } inline float getBloomStrength(){ return bloomStren; } diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h index 2e3b90153..d4429a1af 100644 --- a/WickedEngine/wiEnums.h +++ b/WickedEngine/wiEnums.h @@ -12,16 +12,16 @@ enum GRAPHICSTHREAD GRAPHICSTHREAD_COUNT }; -// Do not alter order because it is bound to lua manually +// Do not alter order or value because it is bound to lua manually! enum RENDERTYPE { - RENDERTYPE_VOID = 0x0000000, - RENDERTYPE_OPAQUE = 0x0000001, - RENDERTYPE_TRANSPARENT = 0x0000010, - RENDERTYPE_WATER = 0x0000100, - RENDERTYPE_LIGHT = 0x0001000, - RENDERTYPE_DECAL = 0x0010000, - RENDERTYPE_ENVPROBE = 0x0100000, + RENDERTYPE_VOID = 0, + RENDERTYPE_OPAQUE = 1, + RENDERTYPE_TRANSPARENT = 2, + RENDERTYPE_WATER = 4, + RENDERTYPE_LIGHT = 8, + RENDERTYPE_DECAL = 16, + RENDERTYPE_ENVPROBE = 32, }; enum PICKTYPE { @@ -48,7 +48,7 @@ enum SHADERTYPE SHADERTYPE_COUNT }; -// stencils +// engine stencil reference values. These can be in range of 0-127. 128-255 are for user stencil values. enum STENCILREF { STENCILREF_EMPTY = 0x00, STENCILREF_SKY = 0x01, @@ -57,7 +57,7 @@ enum STENCILREF { STENCILREF_CHARACTER = 0x04, STENCILREF_SHADELESS = 0x05, STENCILREF_SKIN = 0x06, - STENCILREF_LAST = 0xFF + STENCILREF_LAST = 0x0F }; // constant buffers diff --git a/WickedEngine/wiLoader.cpp b/WickedEngine/wiLoader.cpp index 735aef633..0032cda5c 100644 --- a/WickedEngine/wiLoader.cpp +++ b/WickedEngine/wiLoader.cpp @@ -1402,6 +1402,9 @@ void Material::init() alphaRef = 1.0f; // no alpha test by default + engineStencilRef = STENCILREF::STENCILREF_DEFAULT; + userStencilRef = 0x00; + // constant buffer creation GPUBufferDesc bd; @@ -2453,7 +2456,7 @@ void Mesh::Serialize(wiArchive& archive) archive >> doubleSided; int temp; archive >> temp; - stencilRef = (STENCILREF)temp; + //engineStencilRef = (STENCILREF)temp; archive >> calculatedAO; archive >> trailInfo.base; archive >> trailInfo.tip; @@ -2546,7 +2549,7 @@ void Mesh::Serialize(wiArchive& archive) } archive << renderable; archive << doubleSided; - archive << (int)stencilRef; + archive << (int)0/*engineStencilRef*/; archive << calculatedAO; archive << trailInfo.base; archive << trailInfo.tip; diff --git a/WickedEngine/wiLoader.h b/WickedEngine/wiLoader.h index 7d17fb3e9..3d1b71e98 100644 --- a/WickedEngine/wiLoader.h +++ b/WickedEngine/wiLoader.h @@ -220,6 +220,9 @@ struct Material float alphaRef; + STENCILREF engineStencilRef; + uint8_t userStencilRef; + Material() { @@ -246,6 +249,16 @@ struct Material return RENDERTYPE_OPAQUE; } void ConvertToPhysicallyBasedMaterial(); + // User stencil ref could be anything from 0-127, greater will be truncated when using 8 bit stencil buffer! + void SetUserStencilRef(uint8_t value) + { + assert(value < 128); + userStencilRef = value; + } + UINT GetStencilRef() + { + return (userStencilRef << 4) | static_cast(engineStencilRef); + } const wiGraphicsTypes::Texture2D* GetBaseColorMap() const; const wiGraphicsTypes::Texture2D* GetNormalMap() const; const wiGraphicsTypes::Texture2D* GetRoughnessMap() const; @@ -328,7 +341,6 @@ public: wiGraphicsTypes::GPUBuffer instanceBufferPrev; bool renderable,doubleSided; - STENCILREF stencilRef; bool calculatedAO; @@ -384,7 +396,6 @@ public: indices.resize(0); renderable=false; doubleSided=false; - stencilRef = STENCILREF::STENCILREF_DEFAULT; aabb=AABB(); trailInfo=RibbonTrail(); armature=nullptr; diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 563af1fcb..cd63c77e3 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -4294,14 +4294,15 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle device->BindIndexBuffer(&subset.indexBuffer, subset.GetIndexFormat(), threadID); device->BindConstantBufferPS(&material->constantBuffer, CB_GETBINDSLOT(Material::MaterialCB), threadID); - UINT realStencilRef = mesh->stencilRef; + UINT realStencilRef = material->GetStencilRef(); + // todo: better if (material->shadeless) { - realStencilRef = STENCILREF_SHADELESS; + realStencilRef = (material->userStencilRef << 4) | STENCILREF_SHADELESS; } else if (material->subsurfaceScattering > 0) { - realStencilRef = STENCILREF_SKIN; + realStencilRef = (material->userStencilRef << 4) | STENCILREF_SKIN; } if (prevStencilRef != realStencilRef) { @@ -5983,7 +5984,7 @@ void wiRenderer::CreateImpostor(Mesh* mesh) GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE], threadID); GetDevice()->BindRasterizerState(rasterizers[RSTYPE_DOUBLESIDED], threadID); - GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], mesh->stencilRef, threadID); + GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], 0, threadID); GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID); GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_OBJECT_ALL], threadID); GetDevice()->BindVS(vertexShaders[VSTYPE_OBJECT_COMMON], threadID); diff --git a/WickedEngine/wiRenderer_BindLua.cpp b/WickedEngine/wiRenderer_BindLua.cpp index 8fa60c4e4..194f1f0e3 100644 --- a/WickedEngine/wiRenderer_BindLua.cpp +++ b/WickedEngine/wiRenderer_BindLua.cpp @@ -713,10 +713,13 @@ namespace wiRenderer_BindLua wiLua::GetGlobal()->RegisterFunc("PutEnvProbe", PutEnvProbe); - wiLua::GetGlobal()->RunText("PICK_VOID = 0x0000000"); - wiLua::GetGlobal()->RunText("PICK_OPAQUE = 0x0000001"); - wiLua::GetGlobal()->RunText("PICK_TRANSPARENT = 0x0000010"); - wiLua::GetGlobal()->RunText("PICK_WATER = 0x0000100"); + wiLua::GetGlobal()->RunText("PICK_VOID = 0"); + wiLua::GetGlobal()->RunText("PICK_OPAQUE = 1"); + wiLua::GetGlobal()->RunText("PICK_TRANSPARENT = 2"); + wiLua::GetGlobal()->RunText("PICK_WATER = 4"); + wiLua::GetGlobal()->RunText("PICK_LIGHT = 8"); + wiLua::GetGlobal()->RunText("PICK_DECAL = 16"); + wiLua::GetGlobal()->RunText("PICK_ENVPROBE = 32"); wiLua::GetGlobal()->RegisterFunc("ClearWorld", ClearWorld); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 1ecc038da..4e30b7561 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 11; // minor bug fixes, alterations, refactors, updates - const int revision = 75; + const int revision = 76; long GetVersion()