diff --git a/TR5Main/Renderer/RenderEnums.h b/TR5Main/Renderer/RenderEnums.h index f45a11fd2..54b4c9190 100644 --- a/TR5Main/Renderer/RenderEnums.h +++ b/TR5Main/Renderer/RenderEnums.h @@ -43,8 +43,13 @@ enum BLEND_MODES BLENDMODE_OPAQUE = 0, BLENDMODE_ALPHATEST = 1, BLENDMODE_ADDITIVE = 2, - BLENDMODE_SUBTRACTIVE = 3, - BLENDMODE_ALPHABLEND = 4, + BLENDMODE_NOZTEST = 4, + BLENDMODE_SUBTRACTIVE = 5, + BLENDMODE_WIREFRAME = 6, + BLENDMODE_EXCLUDE = 8, + BLENDMODE_SCREEN = 9, + BLENDMODE_LIGHTEN = 10, + BLENDMODE_ALPHABLEND = 11, NUM_BLENDMODES }; diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index 8f2a21670..e931d0522 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -546,7 +546,8 @@ namespace T5M::Renderer void drawExplosionParticles(RenderView& view); void renderToCubemap(const RenderTargetCube& dest,const Vector3& pos,int roomNumber); void drawLaraHolsters(bool transparent); - void drawSimpleParticles(RenderView& view); + void drawSimpleParticles(RenderView& view); + void setBlendMode(BLEND_MODES blendMode); public: DirectX::SimpleMath::Matrix View; DirectX::SimpleMath::Matrix Projection; diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index ed7c74c6b..92e37372c 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -148,12 +148,9 @@ namespace T5M::Renderer if (bucket.Vertices.size() == 0) continue; - if (bucket.blendMode == 0) - m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); - else - m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); + setBlendMode(bucket.blendMode); - m_stMisc.AlphaTest = (bucket.blendMode == 0); + m_stMisc.AlphaTest = (bucket.blendMode != BLEND_MODES::BLENDMODE_OPAQUE); m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); @@ -470,7 +467,7 @@ namespace T5M::Renderer for (auto& bucket : mesh->buckets) { - if (bucket.Vertices.size() == 0 && bucket.blendMode == 0) + if (bucket.Vertices.size() == 0 && bucket.blendMode == BLENDMODE_OPAQUE) continue; // Draw vertices @@ -1388,12 +1385,9 @@ namespace T5M::Renderer if (bucket.Vertices.size() == 0) continue; - if (bucket.blendMode == 0) - m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); - else - m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); + setBlendMode(bucket.blendMode); - m_stMisc.AlphaTest = (bucket.blendMode == 0); + m_stMisc.AlphaTest = (bucket.blendMode != BLEND_MODES::BLENDMODE_OPAQUE); m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); @@ -2864,9 +2858,10 @@ namespace T5M::Renderer } if (bucket.Vertices.size() == 0) continue; - if (transparent && bucket.blendMode == 0) + if (transparent && bucket.blendMode == BLENDMODE_OPAQUE) continue; + setBlendMode(bucket.blendMode); m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0); } } @@ -3000,9 +2995,10 @@ namespace T5M::Renderer { if (bucket.Vertices.size() == 0) continue; - if (transparent && bucket.blendMode == 0) + if (transparent && bucket.blendMode == BLENDMODE_OPAQUE) continue; + setBlendMode(bucket.blendMode); m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0); } } @@ -3028,7 +3024,6 @@ namespace T5M::Renderer m_context->VSSetShader(m_vsRooms_Anim.Get(), nullptr, 0); } - m_context->PSSetShader(m_psRooms.Get(), NULL, 0); // Set texture @@ -3081,11 +3076,11 @@ namespace T5M::Renderer for (auto& bucket : room->buckets) { if (transparent) { - if (bucket.blendMode == BLEND_MODES::BLENDMODE_OPAQUE) + if (bucket.blendMode == BLEND_MODES::BLENDMODE_OPAQUE || bucket.blendMode == BLEND_MODES::BLENDMODE_ALPHATEST) continue; } else { - if (bucket.blendMode != BLEND_MODES::BLENDMODE_OPAQUE) + if (bucket.blendMode != BLEND_MODES::BLENDMODE_OPAQUE && bucket.blendMode != BLEND_MODES::BLENDMODE_ALPHATEST) continue; } @@ -3114,6 +3109,7 @@ namespace T5M::Renderer if (bucket.Vertices.size() == 0) continue; + setBlendMode(bucket.blendMode); m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0); m_numDrawCalls++; } @@ -3266,10 +3262,7 @@ namespace T5M::Renderer if (bucket.Vertices.size() == 0) continue; - if (bucket.blendMode != 0) - m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); - else - m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); + setBlendMode(bucket.blendMode); // Draw vertices m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0); diff --git a/TR5Main/Renderer/Renderer11DrawEffect.cpp b/TR5Main/Renderer/Renderer11DrawEffect.cpp index 43875f5dc..abb4264a4 100644 --- a/TR5Main/Renderer/Renderer11DrawEffect.cpp +++ b/TR5Main/Renderer/Renderer11DrawEffect.cpp @@ -456,7 +456,7 @@ namespace T5M::Renderer { RendererMesh* flashMesh = flashMoveable.ObjectMeshes[0]; for (auto& flashBucket : flashMesh->buckets) { - if (flashBucket.blendMode == 0) + if (flashBucket.blendMode == BLENDMODE_OPAQUE) continue; if (flashBucket.Vertices.size() != 0) { Matrix offset = Matrix::CreateTranslation(0, length, zOffset); @@ -544,7 +544,7 @@ namespace T5M::Renderer { RendererMesh* flashMesh = flashMoveable.ObjectMeshes[0]; for (auto& flashBucket : flashMesh->buckets) { - if (flashBucket.blendMode == 0) + if (flashBucket.blendMode == BLENDMODE_OPAQUE) continue; if (flashBucket.Vertices.size() != 0) { Matrix offset = Matrix::CreateTranslation(bites[k]->x, bites[k]->y, bites[k]->z); @@ -647,7 +647,7 @@ namespace T5M::Renderer { } void Renderer11::drawSprites(RenderView& view) -{ + { UINT stride = sizeof(RendererVertex); UINT offset = 0; m_context->RSSetState(m_states->CullNone()); @@ -668,27 +668,10 @@ namespace T5M::Renderer { for (int i = 0; i < numSpritesToDraw; i++) { Matrix billboardMatrix; RendererSpriteToDraw& spr = view.spritesToDraw[i]; - if(spr.BlendMode != currentBlendMode){ + if(spr.BlendMode != currentBlendMode) + { currentBlendMode = spr.BlendMode; - switch(currentBlendMode){ - case BLENDMODE_ALPHABLEND: - m_context->OMSetBlendState(m_states->NonPremultiplied(), NULL, 0xFFFFFFFF); - - break; - case BLENDMODE_ALPHATEST: - m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); - - break; - case BLENDMODE_OPAQUE: - m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); - break; - case BLENDMODE_SUBTRACTIVE: - m_context->OMSetBlendState(m_subtractiveBlendState.Get(), NULL, 0xFFFFFFFF); - break; - case BLENDMODE_ADDITIVE: - m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); - break; - } + setBlendMode(spr.BlendMode); } m_context->PSSetShaderResources(0, 1, spr.Sprite->Texture->ShaderResourceView.GetAddressOf()); ID3D11SamplerState* sampler = m_states->LinearClamp(); @@ -819,7 +802,7 @@ namespace T5M::Renderer { if (bucket.Vertices.size() == 0) continue; - if (transparent && bucket.blendMode == 0) + if (transparent && bucket.blendMode == BLENDMODE_OPAQUE) continue; // Draw vertices @@ -1044,6 +1027,7 @@ namespace T5M::Renderer { addSpriteBillboard(&m_sprites[Objects[ID_EXPLOSION_SPRITES].meshIndex + e.sprite], e.pos, e.tint, e.rotation, 1.0f, { e.size, e.size }, BLENDMODE_ADDITIVE,view); } } + void Renderer11::drawSimpleParticles(RenderView& view) { using namespace T5M::Effects; @@ -1052,4 +1036,28 @@ namespace T5M::Renderer { addSpriteBillboard(&m_sprites[Objects[s.sequence].meshIndex + s.sprite], s.worldPosition, Vector4(1, 1, 1, 1), 0, 1.0f, { s.size, s.size / 2 }, BLENDMODE_ALPHABLEND,view); } } + + void Renderer11::setBlendMode(BLEND_MODES blendMode) + { + switch (blendMode) + { + case BLENDMODE_ALPHABLEND: + m_context->OMSetBlendState(m_states->NonPremultiplied(), NULL, 0xFFFFFFFF); + + break; + case BLENDMODE_ALPHATEST: + m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); + + break; + case BLENDMODE_OPAQUE: + m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF); + break; + case BLENDMODE_SUBTRACTIVE: + m_context->OMSetBlendState(m_subtractiveBlendState.Get(), NULL, 0xFFFFFFFF); + break; + case BLENDMODE_ADDITIVE: + m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF); + break; + } + } } diff --git a/TR5Main/Renderer/Renderer11Lara.cpp b/TR5Main/Renderer/Renderer11Lara.cpp index 5e5496a07..16791654b 100644 --- a/TR5Main/Renderer/Renderer11Lara.cpp +++ b/TR5Main/Renderer/Renderer11Lara.cpp @@ -276,7 +276,7 @@ void T5M::Renderer::Renderer11::drawLara(RenderView& view,bool transparent, bool if (bucket.Vertices.size() == 0) continue; - if (transparent && bucket.blendMode == 0) + if (transparent && bucket.blendMode == BLENDMODE_OPAQUE) continue; // Draw vertices @@ -300,7 +300,7 @@ void T5M::Renderer::Renderer11::drawLara(RenderView& view,bool transparent, bool if (bucket.Vertices.size() == 0) continue; - if (transparent && bucket.blendMode == 0) + if (transparent && bucket.blendMode == BLENDMODE_OPAQUE) continue; // Draw vertices @@ -339,7 +339,7 @@ void T5M::Renderer::Renderer11::drawLara(RenderView& view,bool transparent, bool if (bucket.Vertices.size() == 0) continue; - if (transparent && bucket.blendMode == 0) + if (transparent && bucket.blendMode == BLENDMODE_OPAQUE) continue; // Draw vertices @@ -368,7 +368,7 @@ void Renderer11::drawLaraHolsters(bool transparent) if (bucket.Vertices.size() == 0) continue; - if (transparent && bucket.blendMode == 0) + if (transparent && bucket.blendMode == BLENDMODE_OPAQUE) continue; // Draw vertices @@ -385,7 +385,7 @@ void Renderer11::drawLaraHolsters(bool transparent) if (bucket.Vertices.size() == 0) continue; - if (transparent && bucket.blendMode == 0) + if (transparent && bucket.blendMode == BLENDMODE_OPAQUE) continue; // Draw vertices @@ -402,7 +402,7 @@ void Renderer11::drawLaraHolsters(bool transparent) if (bucket.Vertices.size() == 0) continue; - if (transparent && bucket.blendMode == 0) + if (transparent && bucket.blendMode == BLENDMODE_OPAQUE) continue; // Draw vertices