mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-03 18:27:59 +03:00
Fix blending modes issue (#281)
Only for rooms and some objects but not for Lara or most effects
This commit is contained in:
parent
f53c825007
commit
ed9fc47d27
5 changed files with 60 additions and 53 deletions
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
@ -547,6 +547,7 @@ namespace T5M::Renderer
|
|||
void renderToCubemap(const RenderTargetCube& dest,const Vector3& pos,int roomNumber);
|
||||
void drawLaraHolsters(bool transparent);
|
||||
void drawSimpleParticles(RenderView& view);
|
||||
void setBlendMode(BLEND_MODES blendMode);
|
||||
public:
|
||||
DirectX::SimpleMath::Matrix View;
|
||||
DirectX::SimpleMath::Matrix Projection;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue