Skip to content

Commit 9331f2b

Browse files
authored
Fixed opaque & non-opaque sprite sorting (#3660)
1 parent 592575a commit 9331f2b

3 files changed

Lines changed: 15 additions & 6 deletions

File tree

engine/Sandbox.Engine/Scene/GameObjectSystems/SceneSpriteSystem.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,11 @@ private static RenderGroupKey GetRenderGroupKey( ISpriteRenderGroup component, G
231231
flags |= InstanceGroupFlags.Additive;
232232
}
233233

234+
if ( component.Opaque )
235+
{
236+
flags |= InstanceGroupFlags.Opaque;
237+
}
238+
234239
RenderGroupKey renderGroupKey = new()
235240
{
236241
GroupFlags = flags,
@@ -281,6 +286,7 @@ private SpriteBatchSceneObject CreateRenderGroup( RenderGroupKey renderGroupKey
281286
renderGroupObject.Flags.ExcludeGameLayer = (renderGroupKey.GroupFlags & InstanceGroupFlags.CastOnlyShadow) != 0;
282287
renderGroupObject.Sorted = (renderGroupKey.GroupFlags & InstanceGroupFlags.Transparent) != 0;
283288
renderGroupObject.Additive = (renderGroupKey.GroupFlags & InstanceGroupFlags.Additive) != 0;
289+
renderGroupObject.Opaque = (renderGroupKey.GroupFlags & InstanceGroupFlags.Opaque) != 0;
284290
renderGroupObject.Tags.SetFrom( new TagSet( renderGroupKey.Tags ) );
285291
renderGroupKey.RenderLayer.Apply( renderGroupObject );
286292

@@ -362,6 +368,7 @@ internal enum InstanceGroupFlags
362368
CastShadow = 1 << 0,
363369
CastOnlyShadow = 1 << 1,
364370
Transparent = 1 << 2,
365-
Additive = 1 << 3
371+
Additive = 1 << 3,
372+
Opaque = 1 << 4
366373
}
367374
}

engine/Sandbox.Engine/Systems/SceneSystem/SpriteBatchSceneObject.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ internal sealed class SpriteBatchSceneObject : SceneCustomObject
1313
public bool Sorted { get; set; } = false;
1414
public bool Filtered { get; set; } = false;
1515
public bool Additive { get; set; } = false;
16+
public bool Opaque { get; set; } = false;
1617

1718
internal Dictionary<Guid, SpriteRenderer> Components = new();
1819

@@ -512,6 +513,7 @@ public override void RenderSceneObject()
512513
Graphics.ResourceBarrierTransition( SpriteBufferOut, ResourceState.Common );
513514

514515
Graphics.Attributes.SetCombo( "D_BLEND", Additive ? 1 : 0 );
516+
Graphics.Attributes.SetCombo( "D_OPAQUE", Opaque ? 1 : 0 );
515517

516518
// Sort
517519
if ( Sorted )

game/addons/base/Assets/shaders/sprite/sprite_ps.shader

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -230,16 +230,15 @@ PS
230230
RenderState( SrcBlend, SRC_ALPHA );
231231
RenderState( DstBlend, ONE );
232232
RenderState( DepthWriteEnable, false );
233-
#else
234-
RenderState( BlendEnable, true);
235-
RenderState( DepthWriteEnable, S_MODE_DEPTH == 1 );
233+
#else
234+
RenderState( BlendEnable, true );
236235
RenderState( SrcBlend, SRC_ALPHA );
237236
RenderState( DstBlend, INV_SRC_ALPHA );
238237
RenderState( BlendOp, ADD );
239238
RenderState( SrcBlendAlpha, ONE );
240239
RenderState( DstBlendAlpha, INV_SRC_ALPHA );
241-
RenderState( AlphaToCoverageEnable, S_MODE_DEPTH == 1);
242-
240+
RenderState( DepthWriteEnable, D_OPAQUE || S_MODE_DEPTH == 1 );
241+
RenderState( AlphaToCoverageEnable, S_MODE_DEPTH == 1 );
243242
#endif
244243

245244
RenderState( CullMode, NONE );
@@ -290,6 +289,7 @@ PS
290289
int CurrentBufferSize < Attribute("SpriteCount"); >;
291290

292291
DynamicCombo( D_BLEND, 0..1, Sys( ALL ) );
292+
DynamicCombo( D_OPAQUE, 0..1, Sys( ALL ) );
293293

294294
float g_FogStrength < Attribute( "g_FogStrength" ); >;
295295

0 commit comments

Comments
 (0)