@@ -754,7 +754,8 @@ public override void Draw(SpriteBatch spriteBatch, Point drawPosition)
754754
755755 public class CircularSpeedGaugeRenderer : CabViewDigitalRenderer
756756 {
757- DriverMachineInterface DMI ;
757+ public DriverMachineInterface DMI ;
758+
758759 [ CallOnThread ( "Loader" ) ]
759760 public CircularSpeedGaugeRenderer ( Viewer viewer , MSTSLocomotive locomotive , CVCDigital control , CabShader shader )
760761 : base ( viewer , locomotive , control , shader )
@@ -864,4 +865,79 @@ public override void Draw(GraphicsDevice graphicsDevice)
864865 ControlView . SpriteBatch . Begin ( SpriteSortMode . Deferred , BlendState . NonPremultiplied , null , DepthStencilState . Default , null , Shader ) ;
865866 }
866867 }
868+
869+ public class ScreenMaterial : SceneryMaterial
870+ {
871+ CircularSpeedGaugeRenderer CircularSpeedGaugeRenderer ;
872+ SpriteBatch SpriteBatch ;
873+
874+ public ScreenMaterial ( Viewer viewer , string key , CircularSpeedGaugeRenderer circularSpeedGaugeRenderer )
875+ : base ( viewer , key , SceneryMaterialOptions . ShaderFullBright , 0 )
876+ {
877+ CircularSpeedGaugeRenderer = circularSpeedGaugeRenderer ;
878+ Texture = new RenderTarget2D ( viewer . GraphicsDevice ,
879+ CircularSpeedGaugeRenderer . DMI . Width , CircularSpeedGaugeRenderer . DMI . Height , false , SurfaceFormat . Color , DepthFormat . None ) ;
880+ SpriteBatch = new SpriteBatch ( viewer . GraphicsDevice ) ;
881+ }
882+
883+ public override void Render ( GraphicsDevice graphicsDevice , IEnumerable < RenderItem > renderItems , ref Matrix XNAViewMatrix , ref Matrix XNAProjectionMatrix )
884+ {
885+ var originalRenderTargets = graphicsDevice . GetRenderTargets ( ) ;
886+ graphicsDevice . SetRenderTarget ( Texture as RenderTarget2D ) ;
887+ SpriteBatch . Begin ( ) ; // Dummy Begin(), gets closed immediately
888+ CircularSpeedGaugeRenderer . Draw ( graphicsDevice ) ;
889+ SpriteBatch . End ( ) ;
890+ graphicsDevice . SetRenderTargets ( originalRenderTargets ) ;
891+
892+ base . Render ( graphicsDevice , renderItems , ref XNAViewMatrix , ref XNAProjectionMatrix ) ;
893+ }
894+ }
895+
896+ public class ThreeDimCabScreen
897+ {
898+ PoseableShape TrainCarShape ;
899+ Matrix XNAMatrix ;
900+ Viewer Viewer ;
901+ ShapePrimitive ShapePrimitive ;
902+ public CircularSpeedGaugeRenderer CVFR ;
903+ ScreenMaterial Material ;
904+ public ThreeDimCabScreen ( Viewer viewer , int iMatrix , PoseableShape trainCarShape , CabViewControlRenderer c )
905+ {
906+ CVFR = ( CircularSpeedGaugeRenderer ) c ;
907+ Viewer = viewer ;
908+ TrainCarShape = trainCarShape ;
909+ XNAMatrix = TrainCarShape . SharedShape . Matrices [ iMatrix ] ;
910+ Material = new ScreenMaterial ( viewer , "ETCS_SCREEN" , CVFR ) ;
911+
912+ var vertices = new [ ]
913+ {
914+ new VertexPositionNormalTexture ( new Vector3 ( 0 , 0 , 0 ) , new Vector3 ( 0 , 0 , - 1 ) , new Vector2 ( 0 , 0 ) ) ,
915+ new VertexPositionNormalTexture ( new Vector3 ( 0 , 0 , 1 ) , new Vector3 ( 0 , 0 , - 1 ) , new Vector2 ( 0 , 1 ) ) ,
916+ new VertexPositionNormalTexture ( new Vector3 ( 1 , 0 , 0 ) , new Vector3 ( 0 , 0 , - 1 ) , new Vector2 ( 1 , 0 ) ) ,
917+ new VertexPositionNormalTexture ( new Vector3 ( 1 , 0 , 1 ) , new Vector3 ( 0 , 0 , - 1 ) , new Vector2 ( 1 , 1 ) ) ,
918+ } ;
919+ var indices = new short [ ] { 0 , 1 , 2 , 2 , 1 , 3 } ;
920+ var indexBuffer = new IndexBuffer ( viewer . GraphicsDevice , IndexElementSize . SixteenBits , indices . Length , BufferUsage . WriteOnly ) ;
921+ indexBuffer . SetData ( indices ) ;
922+ ShapePrimitive = new ShapePrimitive ( Material , new SharedShape . VertexBufferSet ( vertices , viewer . GraphicsDevice ) , indexBuffer , 2 , new [ ] { - 1 } , 0 ) ;
923+ }
924+
925+ public void PrepareFrame ( RenderFrame frame , ElapsedTime elapsedTime )
926+ {
927+ if ( ! CVFR . IsPowered && CVFR . Control . HideIfDisabled )
928+ return ;
929+
930+ Matrix mx = TrainCarShape . Location . XNAMatrix ;
931+ mx . M41 += ( TrainCarShape . Location . TileX - Viewer . Camera . TileX ) * 2048 ;
932+ mx . M43 += ( - TrainCarShape . Location . TileZ + Viewer . Camera . TileZ ) * 2048 ;
933+ Matrix m = XNAMatrix * mx ;
934+
935+ frame . AddPrimitive ( ShapePrimitive . Material , ShapePrimitive , RenderPrimitiveGroup . Interior , ref m , ShapeFlags . None ) ;
936+ }
937+
938+ internal void Mark ( )
939+ {
940+ ShapePrimitive . Mark ( ) ;
941+ }
942+ }
867943}
0 commit comments