source: 2016/23/ohjaajat/Punasininen/Punasininen/Punasininen/Shader.cs @ 7198

Revision 7198, 3.5 KB checked in by sieerinn, 3 years ago (diff)

Varjostinohjelmakikkailua

Line 
1using Jypeli;
2using Microsoft.Xna.Framework;
3using Microsoft.Xna.Framework.Content;
4using Microsoft.Xna.Framework.Graphics;
5using System;
6using System.Collections.Generic;
7using System.Linq;
8using System.Text;
9
10class Shader
11{
12    private Effect effect;
13    private RenderTarget2D renderTarget;
14    private SpriteBatch spriteBatch;
15    private GraphicsDevice device;
16    private Camera camera;
17
18    struct Shockwave
19    {
20        public Vector Center;
21        public double Time;
22    }
23
24    private const int MAX_WAVES = 3;
25    private readonly Shockwave[] waves = new Shockwave[MAX_WAVES];
26    private int waveIndex = 0;
27
28    public Shader(GraphicsDevice device, ContentManager content, Camera camera)
29    {
30        for (int i = 0; i < MAX_WAVES; i++)
31        {
32            waves[i].Time = 1000f;
33        }
34
35        renderTarget = new RenderTarget2D(device,
36            device.PresentationParameters.BackBufferWidth,
37            device.PresentationParameters.BackBufferHeight);
38
39        effect = content.Load<Effect>("Shockwave");
40        spriteBatch = new SpriteBatch(device);
41        this.camera = camera;
42        this.device = device;
43    }
44
45    public void NewWave(Vector position)
46    {
47        waves[waveIndex].Time = 0f;
48        waves[waveIndex].Center = position;
49        waveIndex = ++waveIndex % MAX_WAVES;
50    }
51
52    public void Draw(GameTime gameTime)
53    {
54
55        device.Clear(Microsoft.Xna.Framework.Color.Black);
56        device.SetRenderTarget(renderTarget);
57
58    }
59
60    public void DrawEnd(GameTime gameTime)
61    {
62        //baseDraw(gameTime); //base.Draw(gameTime);
63
64        device.SetRenderTarget(null);
65
66        var projection = Matrix.CreateOrthographicOffCenter(0,
67          device.Viewport.Width, device.Viewport.Height, 0, 0, 1);
68        var halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0);
69        effect.Parameters["MatrixTransform"].SetValue(halfPixelOffset * projection);
70
71        Vector resolution = new Vector(device.Viewport.Width, device.Viewport.Height);
72        Vector2 resolution2 = new Vector2(device.Viewport.Width, device.Viewport.Height);
73        effect.Parameters["Resolution"].SetValue(resolution2);
74
75        // TestShader
76        //effect.Parameters["Resolution"].SetValue(new Vector2(GraphicsDevice.PresentationParameters.BackBufferWidth, GraphicsDevice.PresentationParameters.BackBufferHeight));
77        //effect.Parameters["Misalign"].SetValue(0.003f);
78        //effect.Parameters["Time"].SetValue(100f * (float)gameTime.TotalGameTime.TotalSeconds);
79
80        // Shockwave
81        var waveArray = new Vector4[MAX_WAVES];
82        for (int i = 0; i < MAX_WAVES; i++)
83        {
84            waves[i].Time += 0.5 * gameTime.ElapsedGameTime.TotalSeconds;
85            Vector screenCoord = camera.WorldToScreen(waves[i].Center);
86            screenCoord.Y = resolution.Y - screenCoord.Y;
87            screenCoord.X /= resolution.X;
88            screenCoord.Y /= resolution.Y;
89            screenCoord += new Vector(0.5f, -0.5f);
90
91            var v = new Vector4((float)screenCoord.X, (float)screenCoord.Y, (float)waves[i].Time, 1f);
92            waveArray[i] = v;
93        }
94        effect.Parameters["Waves"].SetValue(waveArray);
95
96        device.Clear(Microsoft.Xna.Framework.Color.Black);
97        spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
98        effect.CurrentTechnique.Passes[0].Apply();
99        spriteBatch.Draw(renderTarget, Vector2.Zero, Microsoft.Xna.Framework.Color.White);
100        spriteBatch.End();
101    }
102}
Note: See TracBrowser for help on using the repository browser.