Skip to content

Instantly share code, notes, and snippets.

@EternalTamago
Last active October 16, 2024 16:04
Show Gist options
  • Select an option

  • Save EternalTamago/50c10b4578463c608ce2ef194a5b50b9 to your computer and use it in GitHub Desktop.

Select an option

Save EternalTamago/50c10b4578463c608ce2ef194a5b50b9 to your computer and use it in GitHub Desktop.
DebugPhysicsShapesスクリプトで表示されるデバッグ用モデルのちらつきを抑える
public class DebugPhysicsShapes : AsyncScript
{
public RenderGroup RenderGroup = RenderGroup.Group7;
private Simulation simulation;
public override void Cancel()
{
// シーンの切り替えの時などに現在のデバッグ表示を消す
if (simulation != null)
{
simulation.ColliderShapesRendering = false;
}
base.Cancel();
}
public override async Task Execute()
{
//setup rendering in the debug entry point if we have it
var compositor = SceneSystem.GraphicsCompositor;
var debugRenderer =
((compositor.Game as SceneCameraRenderer)?.Child as SceneRendererCollection)?.Children.Where(
x => x is DebugRenderer).Cast<DebugRenderer>().FirstOrDefault();
if (debugRenderer == null)
return;
// RenderGroupに設定されたグループをデバッグ用として他のRenderStageから除外する
// ただし対象のRenderStageに既にフィルタが存在したら何もしない
foreach (var stage in compositor.RenderStages)
{
stage.Filter = stage.Filter ?? new DebugPhysicsShapesFilter { RenderGroup = RenderGroup, };
}
var shapesRenderState = new RenderStage("PhysicsDebugShapes", "Main");
compositor.RenderStages.Add(shapesRenderState);
var meshRenderFeature = compositor.RenderFeatures.OfType<MeshRenderFeature>().First();
meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector
{
EffectName = "XenkoForwardShadingEffect",
RenderGroup = (RenderGroupMask)(1 << (int)RenderGroup),
RenderStage = shapesRenderState,
});
meshRenderFeature.PipelineProcessors.Add(new WireframePipelineProcessor { RenderStage = shapesRenderState });
debugRenderer.DebugRenderStages.Add(shapesRenderState);
simulation = this.GetSimulation();
if (simulation != null)
simulation.ColliderShapesRenderGroup = RenderGroup;
var enabled = false;
while (Game.IsRunning)
{
if (Input.IsKeyDown(Keys.LeftShift) && Input.IsKeyDown(Keys.LeftCtrl) && Input.IsKeyReleased(Keys.P))
{
if (simulation != null)
{
if (enabled)
{
simulation.ColliderShapesRendering = false;
enabled = false;
}
else
{
simulation.ColliderShapesRendering = true;
enabled = true;
}
}
}
await Script.NextFrame();
}
}
public class DebugPhysicsShapesFilter : RenderStageFilter
{
public RenderGroup RenderGroup;
public override bool IsVisible(RenderObject renderObject, RenderView renderView, RenderViewStage renderViewStage)
{
return renderObject.RenderGroup != RenderGroup;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment