From 89c66cd133efb508ce5405733a49bdc2f2b89fdf Mon Sep 17 00:00:00 2001 From: turanszkij Date: Wed, 19 Oct 2016 23:09:24 +0200 Subject: [PATCH] refactor render pipeline; optimize emitters; serialize alpharef; --- WickedEngine/ArchiveVersionHistory.txt | 1 + WickedEngine/Renderable3DComponent.cpp | 33 +++-- WickedEngine/Renderable3DComponent.h | 3 +- .../TiledForwardRenderableComponent.cpp | 10 +- .../TiledForwardRenderableComponent.h | 2 +- WickedEngine/pointspriteGS.hlsl | 2 +- WickedEngine/pointspritePS.hlsl | 16 +-- WickedEngine/wiArchive.cpp | 2 +- WickedEngine/wiEmittedParticle.cpp | 118 +++++++++--------- WickedEngine/wiEmittedParticle.h | 9 +- WickedEngine/wiLoader.cpp | 8 ++ WickedEngine/wiRenderer.cpp | 52 +++++--- WickedEngine/wiRenderer.h | 1 + WickedEngine/wiVersion.cpp | 2 +- 14 files changed, 144 insertions(+), 115 deletions(-) diff --git a/WickedEngine/ArchiveVersionHistory.txt b/WickedEngine/ArchiveVersionHistory.txt index 380c089d1..6bb24130c 100644 --- a/WickedEngine/ArchiveVersionHistory.txt +++ b/WickedEngine/ArchiveVersionHistory.txt @@ -1,5 +1,6 @@ This file contains changelog of wiArchive versions +4: serialized Material property alphaRef 3: serialized Material property parallaxOcclusionMapping 2: serialized Material property planar_reflections 1: Refactor Archive diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp index 21111b686..e6b321aa2 100644 --- a/WickedEngine/Renderable3DComponent.cpp +++ b/WickedEngine/Renderable3DComponent.cpp @@ -84,7 +84,7 @@ void Renderable3DComponent::Initialize() wiRenderer::GetDevice()->GetScreenWidth() , wiRenderer::GetDevice()->GetScreenHeight() , false, FORMAT_R8G8B8A8_SNORM); - rtTransparent.Initialize( + rtSceneCopy.Initialize( wiRenderer::GetDevice()->GetScreenWidth(), wiRenderer::GetDevice()->GetScreenHeight() , false, FORMAT_R16G16B16A16_FLOAT,1,getMSAASampleCount()); rtVolumeLight.Initialize( @@ -238,6 +238,9 @@ void Renderable3DComponent::RenderShadows(GRAPHICSTHREAD threadID) } void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID) { + wiImageEffects fx((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()); + + wiRenderer::UpdateCameraCB(wiRenderer::getCamera(), threadID); if (getStereogramEnabled()) @@ -273,16 +276,22 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende wiRenderer::DrawWaterRipples(threadID); } - wiRenderer::GetDevice()->UnBindResources(TEXSLOT_ONDEMAND0, TEXSLOT_ONDEMAND_COUNT, threadID); - RenderTransparentScene(mainRT, shadedSceneRT, threadID); -} -void Renderable3DComponent::RenderTransparentScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID) -{ - rtTransparent.Activate(threadID, mainRT.depth); { - wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_FORWARD, shadedSceneRT.GetTexture(), rtReflection.GetTexture() - , rtWaterRipple.GetTexture(), threadID, false); - wiRenderer::DrawTrails(threadID, shadedSceneRT.GetTexture()); + rtSceneCopy.Activate(threadID, 0, 0, 0, 0); { + fx.blendFlag = BLENDMODE_OPAQUE; + fx.presentFullScreen = true; + wiImage::Draw(shadedSceneRT.GetTexture(), fx, threadID); } + + wiRenderer::GetDevice()->UnBindResources(TEXSLOT_ONDEMAND0, TEXSLOT_ONDEMAND_COUNT, threadID); + shadedSceneRT.Set(threadID, mainRT.depth); { + RenderTransparentScene(rtSceneCopy, threadID); + wiRenderer::DrawTrails(threadID, rtSceneCopy.GetTexture()); + } +} +void Renderable3DComponent::RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID) +{ + wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_FORWARD, refractionRT.GetTexture(), rtReflection.GetTexture() + , rtWaterRipple.GetTexture(), threadID, false); } void Renderable3DComponent::RenderBloom(GRAPHICSTHREAD threadID) { @@ -377,7 +386,6 @@ void Renderable3DComponent::RenderComposition1(wiRenderTarget& shadedSceneRT, GR fx.blendFlag = BLENDMODE_ALPHA; - wiImage::Draw(rtTransparent.GetTexture(), fx, threadID); if (getEmittedParticlesEnabled()){ wiImage::Draw(rtParticle.GetTexture(), fx, threadID); } @@ -396,7 +404,8 @@ void Renderable3DComponent::RenderComposition1(wiRenderTarget& shadedSceneRT, GR wiImage::Draw(rtLensFlare.GetTexture(), fx, threadID); } } -void Renderable3DComponent::RenderComposition2(wiRenderTarget& mainRT, GRAPHICSTHREAD threadID){ +void Renderable3DComponent::RenderComposition2(wiRenderTarget& mainRT, GRAPHICSTHREAD threadID) +{ if (getStereogramEnabled()) { // We don't need the following for stereograms... diff --git a/WickedEngine/Renderable3DComponent.h b/WickedEngine/Renderable3DComponent.h index 831df0a9f..e9c60933c 100644 --- a/WickedEngine/Renderable3DComponent.h +++ b/WickedEngine/Renderable3DComponent.h @@ -52,6 +52,7 @@ protected: , rtSSR , rtMotionBlur , rtVolumeLight + , rtSceneCopy , rtTransparent , rtWaterRipple , rtLinearDepth @@ -71,7 +72,7 @@ protected: virtual void RenderShadows(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); virtual void RenderScene(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; virtual void RenderSecondaryScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); - virtual void RenderTransparentScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); + virtual void RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); virtual void RenderBloom(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); virtual void RenderLightShafts(wiRenderTarget& mainRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); virtual void RenderComposition1(wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); diff --git a/WickedEngine/TiledForwardRenderableComponent.cpp b/WickedEngine/TiledForwardRenderableComponent.cpp index 708c70834..bc9e317f9 100644 --- a/WickedEngine/TiledForwardRenderableComponent.cpp +++ b/WickedEngine/TiledForwardRenderableComponent.cpp @@ -52,13 +52,9 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::DrawSky(threadID); } } -void TiledForwardRenderableComponent::RenderTransparentScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID) +void TiledForwardRenderableComponent::RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID) { - rtTransparent.Activate(threadID, mainRT.depth); - { - wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, shadedSceneRT.GetTexture(), rtReflection.GetTexture() - , rtWaterRipple.GetTexture(), threadID, getHairParticleAlphaCompositionEnabled()); - wiRenderer::DrawTrails(threadID, shadedSceneRT.GetTexture()); - } + wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, refractionRT.GetTexture(), rtReflection.GetTexture() + , rtWaterRipple.GetTexture(), threadID, getHairParticleAlphaCompositionEnabled()); } diff --git a/WickedEngine/TiledForwardRenderableComponent.h b/WickedEngine/TiledForwardRenderableComponent.h index 783057f08..b88bde45f 100644 --- a/WickedEngine/TiledForwardRenderableComponent.h +++ b/WickedEngine/TiledForwardRenderableComponent.h @@ -6,7 +6,7 @@ class TiledForwardRenderableComponent : { private: virtual void RenderScene(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; - virtual void RenderTransparentScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; + virtual void RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; public: TiledForwardRenderableComponent(); virtual ~TiledForwardRenderableComponent(); diff --git a/WickedEngine/pointspriteGS.hlsl b/WickedEngine/pointspriteGS.hlsl index 496ff95bb..66a8d12b2 100644 --- a/WickedEngine/pointspriteGS.hlsl +++ b/WickedEngine/pointspriteGS.hlsl @@ -19,7 +19,7 @@ struct VertextoPixel { float4 pos : SV_POSITION; float2 tex : TEXCOORD0; - float4 opaAddDarkSiz : TEXCOORD1; + nointerpolation float4 opaAddDarkSiz : TEXCOORD1; //float3 col : TEXCOORD2; float4 pp : TEXCOORD2; }; diff --git a/WickedEngine/pointspritePS.hlsl b/WickedEngine/pointspritePS.hlsl index 07c6f61a8..880605c41 100644 --- a/WickedEngine/pointspritePS.hlsl +++ b/WickedEngine/pointspritePS.hlsl @@ -5,7 +5,7 @@ struct VertextoPixel { float4 pos : SV_POSITION; float2 tex : TEXCOORD0; - float4 opaAddDarkSiz : TEXCOORD1; + nointerpolation float4 opaAddDarkSiz : TEXCOORD1; //float3 col : TEXCOORD2; float4 pp : TEXCOORD2; }; @@ -22,18 +22,14 @@ float4 main(VertextoPixel PSIn) : SV_TARGET float4 color = float4(0,0,0,0); color=texture_0.Sample(sampler_linear_clamp,PSIn.tex); - [branch]if(PSIn.opaAddDarkSiz.z){ + [branch] + if(PSIn.opaAddDarkSiz.z) + { color.rgb=float3(0,0,0); } else{ - [branch]if(PSIn.opaAddDarkSiz.y){ - color.rgba-=PSIn.opaAddDarkSiz.x; - color.rgba*=fade; - } - else{ - color.a-=PSIn.opaAddDarkSiz.x; - color.a*=fade; - } + color.a-=PSIn.opaAddDarkSiz.x; + color.a*=fade; } //color.rgb*=PSIn.col.rgb; diff --git a/WickedEngine/wiArchive.cpp b/WickedEngine/wiArchive.cpp index 3593712e3..3fa343b77 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 = 3; +uint64_t __archiveVersion = 4; // this is the version number of which below the archive is not compatible with the current version uint64_t __archiveVersionBarrier = 1; diff --git a/WickedEngine/wiEmittedParticle.cpp b/WickedEngine/wiEmittedParticle.cpp index 3b2c6578e..8294ec67a 100644 --- a/WickedEngine/wiEmittedParticle.cpp +++ b/WickedEngine/wiEmittedParticle.cpp @@ -61,7 +61,6 @@ wiEmittedParticle::wiEmittedParticle(std::string newName, std::string newMat, Ob rotation = newRot; bounding_box=new AABB(); - lastSquaredDistMulThousand=0; light=nullptr; CreateLight(); @@ -294,63 +293,64 @@ void wiEmittedParticle::Burst(float num) burst-=(int)burst; } - -void wiEmittedParticle::Draw(Camera* camera, GRAPHICSTHREAD threadID, int FLAG) +void wiEmittedParticle::UpdateRenderData(GRAPHICSTHREAD threadID) { - if(!points.empty()){ - - - if(camera->frustum.CheckBox(bounding_box->corners)) - { - GraphicsDevice* device = wiRenderer::GetDevice(); - device->EventBegin(L"EmittedParticle", threadID); - - vector renderPoints=vector(points.begin(),points.end()); - device->UpdateBuffer(vertexBuffer, renderPoints.data(), threadID, (int)(sizeof(Point)* renderPoints.size())); - - bool additive = (material->blendFlag==BLENDMODE_ADDITIVE || material->premultipliedTexture); - - device->BindPrimitiveTopology(PRIMITIVETOPOLOGY::POINTLIST,threadID); - device->BindVertexLayout(vertexLayout,threadID); - device->BindPS(wireRender?simplestPS:pixelShader,threadID); - device->BindVS(vertexShader,threadID); - device->BindGS(geometryShader,threadID); - - //device->BindResourcePS(depth,1,threadID); - - ConstantBuffer cb; - cb.mAdd.x = additive; - cb.mAdd.y = (FLAG==DRAW_DARK?true:false); - cb.mMotionBlurAmount = motionBlurAmount; - - - device->UpdateBuffer(constantBuffer,&cb,threadID); - device->BindConstantBufferGS(constantBuffer, CB_GETBINDSLOT(ConstantBuffer),threadID); - - device->BindRasterizerState(wireRender?wireFrameRS:rasterizerState,threadID); - device->BindDepthStencilState(depthStencilState,1,threadID); - - device->BindBlendState((additive?blendStateAdd:blendStateAlpha),threadID); - - device->BindVertexBuffer(vertexBuffer,0,sizeof(Point),threadID); - - if(!wireRender && material->texture) - device->BindResourcePS(material->texture,TEXSLOT_ONDEMAND0,threadID); - device->Draw((int)renderPoints.size(),threadID); - - - device->BindGS(nullptr,threadID); - device->EventEnd(threadID); - } + if (!points.empty()) + { + vector renderPoints = vector(points.begin(), points.end()); + wiRenderer::GetDevice()->UpdateBuffer(vertexBuffer, renderPoints.data(), threadID, (int)(sizeof(Point)* renderPoints.size())); } } -void wiEmittedParticle::DrawPremul(Camera* camera, GRAPHICSTHREAD threadID, int FLAG){ - if(material->premultipliedTexture) - Draw(camera,threadID,FLAG); + +void wiEmittedParticle::Draw(GRAPHICSTHREAD threadID, int FLAG) +{ + if(!points.empty()) + { + GraphicsDevice* device = wiRenderer::GetDevice(); + device->EventBegin(L"EmittedParticle", threadID); + + bool additive = (material->blendFlag==BLENDMODE_ADDITIVE || material->premultipliedTexture); + + device->BindPrimitiveTopology(PRIMITIVETOPOLOGY::POINTLIST,threadID); + device->BindVertexLayout(vertexLayout,threadID); + device->BindPS(wireRender?simplestPS:pixelShader,threadID); + device->BindVS(vertexShader,threadID); + device->BindGS(geometryShader,threadID); + + //device->BindResourcePS(depth,1,threadID); + + ConstantBuffer cb; + cb.mAdd.x = additive; + cb.mAdd.y = (FLAG==DRAW_DARK?true:false); + cb.mMotionBlurAmount = motionBlurAmount; + + + device->UpdateBuffer(constantBuffer,&cb,threadID); + device->BindConstantBufferGS(constantBuffer, CB_GETBINDSLOT(ConstantBuffer),threadID); + + device->BindRasterizerState(wireRender?wireFrameRS:rasterizerState,threadID); + device->BindDepthStencilState(depthStencilState,1,threadID); + + device->BindBlendState((additive?blendStateAdd:blendStateAlpha),threadID); + + device->BindVertexBuffer(vertexBuffer,0,sizeof(Point),threadID); + + if(!wireRender && material->texture) + device->BindResourcePS(material->texture,TEXSLOT_ONDEMAND0,threadID); + device->Draw((int)points.size(),threadID); + + + device->BindGS(nullptr,threadID); + device->EventEnd(threadID); + } } -void wiEmittedParticle::DrawNonPremul(Camera* camera, GRAPHICSTHREAD threadID, int FLAG){ +void wiEmittedParticle::DrawPremul(GRAPHICSTHREAD threadID, int FLAG){ + if(material->premultipliedTexture) + Draw(threadID,FLAG); +} +void wiEmittedParticle::DrawNonPremul(GRAPHICSTHREAD threadID, int FLAG){ if(!material->premultipliedTexture) - Draw(camera,threadID,FLAG); + Draw(threadID,FLAG); } @@ -483,20 +483,20 @@ void wiEmittedParticle::SetUpStates() bd.RenderTarget[0].DestBlendAlpha = BLEND_INV_SRC_ALPHA; bd.RenderTarget[0].BlendOpAlpha = BLEND_OP_ADD; bd.RenderTarget[0].RenderTargetWriteMask = 0x0f; - bd.IndependentBlendEnable=true; + bd.IndependentBlendEnable=false; blendStateAlpha = new BlendState; wiRenderer::GetDevice()->CreateBlendState(&bd,blendStateAlpha); ZeroMemory(&bd, sizeof(bd)); bd.RenderTarget[0].BlendEnable=true; - bd.RenderTarget[0].SrcBlend = BLEND_ONE; + bd.RenderTarget[0].SrcBlend = BLEND_SRC_ALPHA; bd.RenderTarget[0].DestBlend = BLEND_ONE; bd.RenderTarget[0].BlendOp = BLEND_OP_ADD; - bd.RenderTarget[0].SrcBlendAlpha = BLEND_ONE; - bd.RenderTarget[0].DestBlendAlpha = BLEND_ONE; + bd.RenderTarget[0].SrcBlendAlpha = BLEND_SRC_ALPHA; + bd.RenderTarget[0].DestBlendAlpha = BLEND_INV_SRC_ALPHA; bd.RenderTarget[0].BlendOpAlpha = BLEND_OP_ADD; - bd.RenderTarget[0].RenderTargetWriteMask = 0x0f; - bd.IndependentBlendEnable=true; + bd.RenderTarget[0].RenderTargetWriteMask = COLOR_WRITE_ENABLE_ALL; + bd.IndependentBlendEnable=false; blendStateAdd = new BlendState; wiRenderer::GetDevice()->CreateBlendState(&bd,blendStateAdd); } diff --git a/WickedEngine/wiEmittedParticle.h b/WickedEngine/wiEmittedParticle.h index 78b6ece8f..a09c05221 100644 --- a/WickedEngine/wiEmittedParticle.h +++ b/WickedEngine/wiEmittedParticle.h @@ -104,11 +104,13 @@ public: void Update(float gamespeed); void Burst(float num); + void UpdateRenderData(GRAPHICSTHREAD threadID); + #define DRAW_DEFAULT 0 #define DRAW_DARK 1 - void Draw(Camera* camera, GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT); - void DrawPremul(Camera* camera, GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT); - void DrawNonPremul(Camera* camera, GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT); + void Draw(GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT); + void DrawPremul(GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT); + void DrawNonPremul(GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT); void CleanUp(); string name; @@ -119,7 +121,6 @@ public: string lightName; AABB* bounding_box; - long lastSquaredDistMulThousand; float size,random_factor,normal_factor; float count,life,random_life; diff --git a/WickedEngine/wiLoader.cpp b/WickedEngine/wiLoader.cpp index 61e337ef4..c31d2e535 100644 --- a/WickedEngine/wiLoader.cpp +++ b/WickedEngine/wiLoader.cpp @@ -1520,6 +1520,10 @@ void Material::Serialize(wiArchive& archive) { archive >> parallaxOcclusionMapping; } + if (archive.GetVersion() >= 4) + { + archive >> alphaRef; + } string texturesDir = archive.GetSourceDirectory() + "textures/"; if (!refMapName.empty()) @@ -1580,6 +1584,10 @@ void Material::Serialize(wiArchive& archive) { archive << parallaxOcclusionMapping; } + if (archive.GetVersion() >= 4) + { + archive << alphaRef; + } } } #pragma endregion diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index d54d8656f..26ed4b9c6 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -1448,6 +1448,7 @@ void wiRenderer::UpdatePerFrameData() culling.culledHairParticleSystems.clear(); culling.culledLights.clear(); culling.culledLight_count = 0; + culling.culledEmittedParticleSystems.clear(); if (spTree != nullptr) { @@ -1534,6 +1535,16 @@ void wiRenderer::UpdatePerFrameData() i++; } } + for (auto& x : emitterSystems) + { + if (camera->frustum.CheckBox(x->bounding_box->corners)) + { + culling.culledEmittedParticleSystems.push_back(x); + } + } + std::sort(culling.culledEmittedParticleSystems.begin(), culling.culledEmittedParticleSystems.end(), [&](const wiEmittedParticle* a, const wiEmittedParticle* b) { + return wiMath::DistanceSquared(camera->translation, a->bounding_box->getCenter()) > wiMath::DistanceSquared(camera->translation,b->bounding_box->getCenter()); + }); } } refCam->Reflect(cam, waterPlane.getXMFLOAT4()); @@ -1666,11 +1677,13 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID) GetDevice()->BindResourcePS(envMaps[0], TEXSLOT_ENV0, threadID); GetDevice()->BindResourcePS(envMaps[1], TEXSLOT_ENV1, threadID); } + + + const FrameCulling& mainCameraCulling = frameCullings[getCamera()]; // Fill Light Array with lights in the frustum { - const FrameCulling& culling = frameCullings[getCamera()]; - const CulledList& culledLights = culling.culledLights; + const CulledList& culledLights = mainCameraCulling.culledLights; static LightArrayType* lightArray = (LightArrayType*)_mm_malloc(sizeof(LightArrayType)*MAX_LIGHTS, 16); ZeroMemory(lightArray, sizeof(lightArray)); @@ -1734,6 +1747,12 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID) GetDevice()->UpdateBuffer(resourceBuffers[RBTYPE_LIGHTARRAY], lightArray, threadID, (int)(sizeof(LightArrayType)*lightCounter)); } + // Update visible particlesystem vertices: + for (auto& x : mainCameraCulling.culledEmittedParticleSystems) + { + x->UpdateRenderData(threadID); + } + } void wiRenderer::UpdateImages(){ for (wiSprite* x : images) @@ -2140,27 +2159,20 @@ void wiRenderer::DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID) void wiRenderer::DrawSoftParticles(Camera* camera, GRAPHICSTHREAD threadID, bool dark) { - struct particlesystem_comparator { - bool operator() (const wiEmittedParticle* a, const wiEmittedParticle* b) const{ - return a->lastSquaredDistMulThousand>b->lastSquaredDistMulThousand; - } - }; + FrameCulling& culling = frameCullings[camera]; - set psystems; - for(wiEmittedParticle* e : emitterSystems){ - e->lastSquaredDistMulThousand=(long)(wiMath::DistanceSquared(e->bounding_box->getCenter(),camera->translation)*1000); - psystems.insert(e); - } - - for(wiEmittedParticle* e:psystems){ - e->DrawNonPremul(camera,threadID,dark); + for (wiEmittedParticle* e : culling.culledEmittedParticleSystems) + { + e->DrawNonPremul(threadID, dark); } } void wiRenderer::DrawSoftPremulParticles(Camera* camera, GRAPHICSTHREAD threadID, bool dark) { - for (wiEmittedParticle* e : emitterSystems) + FrameCulling& culling = frameCullings[camera]; + + for (wiEmittedParticle* e : culling.culledEmittedParticleSystems) { - e->DrawPremul(camera, threadID, dark); + e->DrawPremul(threadID, dark); } } void wiRenderer::DrawTrails(GRAPHICSTHREAD threadID, Texture2D* refracRes) @@ -2968,10 +2980,14 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle { GetDevice()->BindBlendState(blendStates[BSTYPE_COLORWRITEDISABLE], threadID); } - else + else if(renderTypeFlags & RENDERTYPE_OPAQUE) { GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE], threadID); } + else + { + GetDevice()->BindBlendState(blendStates[BSTYPE_TRANSPARENT], threadID); + } bool easyTextureBind = shaderType == SHADERTYPE_SHADOW || shaderType == SHADERTYPE_SHADOWCUBE || shaderType == SHADERTYPE_ALPHATESTONLY; diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index 1ec8a38f4..9a77822ad 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -362,6 +362,7 @@ public: vector culledHairParticleSystems; CulledList culledLights; UINT culledLight_count; // because forward_list doesn't have size() + vector culledEmittedParticleSystems; }; static unordered_map frameCullings; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 2b11ff33f..c9b18307a 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -7,7 +7,7 @@ namespace wiVersion // minor features, major updates const int minor = 9; // minor bug fixes, alterations, refactors, updates - const int revision = 20; + const int revision = 21; long GetVersion()