protected override void LoadGraphicsContent(bool loadAllContent) { if (loadAllContent) { ContentManager cm = PrimalDevistation.Instance.CM; GraphicsDevice gd = GraphicsDevice; _renderEffect = cm.Load <Effect>(@"Shaders/PointSpriteRender360"); _updateEffect = cm.Load <Effect>(@"Shaders/ParticleUpdate360"); _particleTexture = cm.Load <Texture2D>(@"Sprites/particle2x2"); PresentationParameters pp = GraphicsDevice.PresentationParameters; _bbResolveTarget = new ResolveTexture2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat); // Create the sprite batch for render to textures _batch = new cSpriteBatch(gd); // Setting up some shader vars that will never change now _renderEffect.Parameters["View"].SetValue(Matrix.Identity); _renderEffect.Parameters["World"].SetValue(Matrix.Identity); _colors = new Texture2D(gd, _textureWidth, _textureHeight, 1, TextureUsage.None, SurfaceFormat.Color); _velocities = new RenderTarget2D[2]; _positions = new RenderTarget2D[2]; _ages = new RenderTarget2D[2]; _positions[0] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Vector2); _positions[1] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Vector2); _velocities[0] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Vector2); _velocities[1] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Vector2); _ages[0] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Single); _ages[1] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Single); gd.SetRenderTarget(0, _positions[0]); gd.Clear(ClearOptions.Target, new Color(0, 0, 0, 0), 1.0f, 0); gd.SetRenderTarget(0, _positions[1]); gd.Clear(ClearOptions.Target, new Color(0, 0, 0, 0), 1.0f, 0); gd.SetRenderTarget(0, _velocities[0]); gd.Clear(ClearOptions.Target, Color.Black, 1.0f, 0); gd.SetRenderTarget(0, _velocities[1]); gd.Clear(ClearOptions.Target, Color.Black, 1.0f, 0); gd.SetRenderTarget(0, _ages[0]); gd.Clear(ClearOptions.Target, Color.Black, 1.0f, 0); gd.SetRenderTarget(0, _ages[1]); gd.Clear(ClearOptions.Target, Color.Black, 1.0f, 0); gd.SetRenderTarget(0, null); //Vector2[] data = new Vector2[_maxParticles]; //_positions[0].GetTexture().GetData<Vector2>(data); //Vector2 s = LieroXNA.Instance.Level.Size; //for (int i = 0; i < data.Length; i++) { data[i] = new Vector2(cMath.Rand(0, s.X / 2), cMath.Rand(0, s.Y / 2)); } //_positions[0].GetTexture().SetData<Vector2>(data); //_positions[1].GetTexture().SetData<Vector2>(data); Texture2D[] particleTextures = new Texture2D[10]; string part = @"Sprites/particles/part04"; //particleTextures[0] = cm.Load<Texture2D>(part); //particleTextures[1] = cm.Load<Texture2D>(part); //particleTextures[2] = cm.Load<Texture2D>(part); //particleTextures[3] = cm.Load<Texture2D>(part); //particleTextures[4] = cm.Load<Texture2D>(part); //particleTextures[5] = cm.Load<Texture2D>(part); //particleTextures[6] = cm.Load<Texture2D>(part); //particleTextures[7] = cm.Load<Texture2D>(part); //particleTextures[8] = cm.Load<Texture2D>(part); //particleTextures[9] = cm.Load<Texture2D>(part); particleTextures[0] = cm.Load <Texture2D>(@"Sprites/particles/part01"); particleTextures[1] = cm.Load <Texture2D>(@"Sprites/particles/part02"); particleTextures[2] = cm.Load <Texture2D>(@"Sprites/particles/part03"); particleTextures[3] = cm.Load <Texture2D>(@"Sprites/particles/part04"); particleTextures[4] = cm.Load <Texture2D>(@"Sprites/particles/part05"); particleTextures[5] = cm.Load <Texture2D>(@"Sprites/particles/part06"); particleTextures[6] = cm.Load <Texture2D>(@"Sprites/particles/part07"); particleTextures[7] = cm.Load <Texture2D>(@"Sprites/particles/part08"); particleTextures[8] = cm.Load <Texture2D>(@"Sprites/particles/part09"); particleTextures[9] = cm.Load <Texture2D>(@"Sprites/particles/part10"); for (int i = 0; i < particleTextures.Length; i++) { _renderEffect.Parameters["ParticleTex" + i].SetValue(particleTextures[i]); } _verts = new sVTPointVertex[_maxParticles]; _dec = new VertexDeclaration(gd, sVTPointVertex.Elements); float ratioW = 1f / (_textureWidth - 1); float ratioH = 1f / (_textureHeight - 1); int icounter = 0; for (int i = 0; i < _textureWidth; i++) { for (int j = 0; j < _textureHeight; j++) { _verts[icounter] = new sVTPointVertex(); _verts[icounter].texture = new Vector2(i * ratioW, j * ratioH); _verts[icounter].texIndex = cMath.Rand(0, particleTextures.Length - 1); _verts[icounter].pointSize = particleTextures[(int)_verts[icounter].texIndex].Width; icounter++; } } _vertexBuffer = new VertexBuffer(gd, sVTPointVertex.Size * _maxParticles, BufferUsage.Points); _vertexBuffer.SetData(_verts); } }
//private void SetPSize(string[] args) //{ // if (args.Length <= 0) { LieroXNA.Instance.LieroConsole.AddLine("USAGE: 'psize [size]'"); return; } // int res; // if (!int.TryParse(args[0], out res)) { LieroXNA.Instance.LieroConsole.AddLine("Size is not a valid integer"); return; } // _particleSize = res; //} protected override void LoadGraphicsContent(bool loadAllContent) { if (loadAllContent) { ContentManager cm = PrimalDevistation.Instance.CM; GraphicsDevice gd = GraphicsDevice; _renderEffect = cm.Load <Effect>(@"Shaders/PointSpriteRenderVT"); if (_useMRT) { _updateEffect = cm.Load <Effect>(@"Shaders/ParticleUpdateMRT"); } else { _updateEffect = cm.Load <Effect>(@"Shaders/ParticleUpdate"); } _particleTexture = cm.Load <Texture2D>(@"Sprites/particle2x2"); PresentationParameters pp = GraphicsDevice.PresentationParameters; _bbResolveTarget = new ResolveTexture2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat); // Create the sprite batch for render to textures _batch = new cSpriteBatch(gd); // Setting up some shader vars that will never change now _renderEffect.Parameters["View"].SetValue(Matrix.Identity); _renderEffect.Parameters["World"].SetValue(Matrix.Identity); _velocities = new RenderTarget2D[2]; _positions = new RenderTarget2D[2]; if (_useHV4) { _positions[0] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.HalfVector4); _positions[1] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.HalfVector4); _velocities[0] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.HalfVector4); _velocities[1] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.HalfVector4); } else { _positions[0] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Vector4); _positions[1] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Vector4); _velocities[0] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Vector4); _velocities[1] = new RenderTarget2D(gd, _textureWidth, _textureHeight, 1, SurfaceFormat.Vector4); } gd.SetRenderTarget(0, _positions[0]); gd.Clear(ClearOptions.Target, Color.Black, 1.0f, 0); gd.SetRenderTarget(0, _positions[1]); gd.Clear(ClearOptions.Target, Color.Black, 1.0f, 0); gd.SetRenderTarget(0, _velocities[0]); gd.Clear(ClearOptions.Target, Color.Black, 1.0f, 0); gd.SetRenderTarget(0, _velocities[1]); gd.Clear(ClearOptions.Target, Color.Black, 1.0f, 0); gd.SetRenderTarget(0, null); if (_useHV4) { HalfVector4[] data = new HalfVector4[_maxParticles]; _positions[0].GetTexture().GetData <HalfVector4>(data); Vector2 s = PrimalDevistation.Instance.Level.Size; #if XBOX for (int i = 0; i < data.Length; i++) { data[i] = new HalfVector4(0, 0, cMath.Rand(0, s.Y / 2), cMath.Rand(0, s.X / 2)); } #else for (int i = 0; i < data.Length; i++) { data[i] = new HalfVector4(cMath.Rand(0, s.X / 2), cMath.Rand(0, s.Y / 2), 0, 0); } #endif _positions[0].GetTexture().SetData <HalfVector4>(data); _positions[1].GetTexture().SetData <HalfVector4>(data); } else { Vector4[] data = new Vector4[_maxParticles]; _positions[0].GetTexture().GetData <Vector4>(data); for (int i = 0; i < data.Length; i++) { data[i] = new Vector4(0, 0, 0, 0); } _positions[0].GetTexture().SetData <Vector4>(data); _positions[1].GetTexture().SetData <Vector4>(data); } _verts = new sVTPointVertex[_maxParticles]; _dec = new VertexDeclaration(gd, sVTPointVertex.Elements); float ratioW = 1f / (_textureWidth - 1); float ratioH = 1f / (_textureHeight - 1); int icounter = 0; for (int i = 0; i < _textureWidth; i++) { for (int j = 0; j < _textureHeight; j++) { _verts[icounter] = new sVTPointVertex(); _verts[icounter].texture = new Vector2(i * ratioW, j * ratioH); _verts[icounter].pointSize = cMath.Rand(1, 3); icounter++; } } // Create a dynamic vertex buffer. ResourceUsage usage = ResourceUsage.Dynamic | ResourceUsage.WriteOnly | ResourceUsage.Points; _vertexBuffer = new VertexBuffer(gd, sVTPointVertex.Size * _maxParticles, usage, ResourceManagementMode.Manual); _vertexBuffer.SetData(_verts); } }