コード例 #1
0
ファイル: FrmFloor.cs プロジェクト: asdlei99/HereticXNA
        private void sldBrightness_Scroll(object sender, EventArgs e)
        {
            if (Game1.instance.selectedSector == null)
            {
                return;
            }

            if (useFloor)
            {
                if (!Game1.instance.flatLightInfoById.ContainsKey(Game1.instance.selectedSector.floorpic))
                {
                    return;
                }

                Game1.Floorlightinfo lightInfo = Game1.instance.flatLightInfoById[Game1.instance.selectedSector.floorpic];
                lightInfo.brightness = (float)sldBrightness.Value / 100.0f;
                lightInfo.makeColor();
                Game1.instance.NeedSave = true;
            }
            else
            {
                if (!Game1.instance.flatCLightInfoById.ContainsKey(Game1.instance.selectedSector.ceilingpic))
                {
                    return;
                }

                Game1.Floorlightinfo lightInfo = Game1.instance.flatCLightInfoById[Game1.instance.selectedSector.ceilingpic];
                lightInfo.brightness = (float)sldBrightness.Value / 100.0f;
                lightInfo.makeColor();
                Game1.instance.NeedSave = true;
            }
        }
コード例 #2
0
            public SectorLightData(sector_t in_sector, Game1.Floorlightinfo in_lightInfo)
            {
                sector    = in_sector;
                lightInfo = in_lightInfo;
                lightInfo.makeColor();

                // Generate the stuff
                float bbminX = 100000;
                float bbminY = 100000;
                float bbmaxX = -100000;
                float bbmaxY = -100000;

                sector.floorBatch.boundingBox(ref bbminX, ref bbminY, ref bbmaxX, ref bbmaxY);

                int texW = Math.Max(1, (int)Math.Ceiling(((bbmaxX - bbminX) / PRECISION) + lightInfo.spread * 16 + 4));
                int texH = Math.Max(1, (int)Math.Ceiling(((bbmaxY - bbminY) / PRECISION) + lightInfo.spread * 16 + 4));
                int pow2 = 1; while (pow2 < texW)

                {
                    pow2 *= 2;
                }
                texW = pow2;

                pow2 = 1; while (pow2 < texH)
                {
                    pow2 *= 2;
                }
                texH = pow2;

                // Center it
                limits.X = ((bbmaxX + bbminX) - ((float)texW * PRECISION)) * .5f;
                limits.Y = ((bbmaxY + bbminY) - ((float)texH * PRECISION)) * .5f;
                limits.Z = limits.X + (float)texW * PRECISION;
                limits.W = limits.Y + (float)texH * PRECISION;

                textureSpread = new RenderTarget2D(Game1.instance.GraphicsDevice, texW, texH);
                RenderTarget2D textureTemp = new RenderTarget2D(Game1.instance.GraphicsDevice, texW, texH);

                Game1.instance.fxSectorLightInfo.Parameters["texSize"].SetValue(new Vector2((float)texW, (float)texH));
                Game1.instance.fxSectorLightInfo.Parameters["spread"].SetValue(lightInfo.spread);

                // Render to target the sector
                Game1.instance.GraphicsDevice.SetRenderTarget(textureSpread);
                Game1.instance.GraphicsDevice.Clear(Color.Transparent);
                Game1.instance.fxSectorLightInfo.CurrentTechnique = Game1.instance.fxSectorLightInfo.Techniques["TechniquePlain"];
                Game1.instance.fxSectorLightInfo.Parameters["World"].SetValue(Matrix.Identity);
                Game1.instance.fxSectorLightInfo.Parameters["View"].SetValue(Matrix.Identity);
                Game1.instance.fxSectorLightInfo.Parameters["Projection"].SetValue(Matrix.CreateOrthographicOffCenter(limits.X, limits.Z, limits.Y, limits.W, -999, 999));
                Game1.instance.fxSectorLightInfo.CurrentTechnique.Passes[0].Apply();
                Game1.instance.GraphicsDevice.SetVertexBuffer(sector.floorBatch.vb);
                Game1.instance.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, sector.floorBatch.triCount);
                Game1.instance.GraphicsDevice.SetRenderTargets(null);

                // Grow the texels for the base, and start bluring for the spread
                Game1.instance.GraphicsDevice.SetRenderTarget(textureTemp);
                Game1.instance.GraphicsDevice.Clear(Color.Transparent);
                Game1.instance.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullNone,
                                                 Game1.instance.fxSectorLightInfo);
                Game1.instance.fxSectorLightInfo.CurrentTechnique = Game1.instance.fxSectorLightInfo.Techniques["TechniqueBlurU"];
                Game1.instance.spriteBatch.Draw(textureSpread, new Rectangle(0, 0, textureSpread.Width, textureSpread.Height), Color.White);
                Game1.instance.spriteBatch.End();
                Game1.instance.GraphicsDevice.SetRenderTargets(null);

                // Lastly blur in V to finalize it
                Game1.instance.GraphicsDevice.SetRenderTarget(textureSpread);
                Game1.instance.GraphicsDevice.Clear(Color.Transparent);
                Game1.instance.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullNone,
                                                 Game1.instance.fxSectorLightInfo);
                Game1.instance.fxSectorLightInfo.CurrentTechnique = Game1.instance.fxSectorLightInfo.Techniques["TechniqueBlurV"];
                Game1.instance.spriteBatch.Draw(textureTemp, new Rectangle(0, 0, textureTemp.Width, textureTemp.Height), Color.White);
                Game1.instance.spriteBatch.End();
                Game1.instance.GraphicsDevice.SetRenderTargets(null);

                textureTemp.Dispose();
            }