Last active
October 16, 2024 16:04
-
-
Save EternalTamago/50c10b4578463c608ce2ef194a5b50b9 to your computer and use it in GitHub Desktop.
DebugPhysicsShapesスクリプトで表示されるデバッグ用モデルのちらつきを抑える
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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