private void UpdateQuad()
 {
     quadRenderer.Begin();
     quadRenderer.Quad(
         new Vector3(renderer.Width - texture.Size.Width, 0, 0.0f),
         new Vector3(renderer.Width, texture.Size.Height, 0.0f)
         );
     quadRenderer.End();
 }
Exemple #2
0
        public override void Render()
        {
            QuadRenderer.Begin();
            float alpha = (10 - timer) / 10;

            QuadRenderer.DrawFullScreenGradient(new Color4(38f / 255, 38f / 255, 39f / 255, alpha), new Color4(70f / 255, 69f / 255, 70f / 255, alpha));

            Color4 color = new Color4(1, 1, 1, alpha);

            QuadRenderer.Draw(StartupLayer.logo, new Vector2(Display.Width / 2 - StartupLayer.logo.Width / 2, Display.Height / 2 - StartupLayer.logo.Height / 2 - 20 * alpha), color);

            QuadRenderer.End();
        }
        public void UpdateQuads()
        {
            int   n    = currentLightCount;
            float gap  = 5.0f;
            float size = (renderer.Width / (n + 1)) - gap;
            float x    = gap;

            quadRenderer.Begin();
            for (int i = 0; i < n; ++i)
            {
                quadRenderer.Quad(
                    new Vector3(x, gap, (float)(i)),
                    new Vector3(x + size, gap + size, (float)(i))
                    );
                x += size + gap;
            }
            quadRenderer.End();
        }
Exemple #4
0
        protected override void LoadContent()
        {
            base.LoadContent();

            ContentWrapper.Initialize(this);

            _spriteBatch  = new SpriteBatch(GraphicsDevice);
            _lineBatch    = new LineBatch(GraphicsDevice);
            _quadRenderer = new QuadRenderer(GraphicsDevice);

            _input.LoadContent(GraphicsDevice.Viewport);
#if WINDOWS
            _counter.LoadContent();
#endif

            // Create rendertarget for transitions
            PresentationParameters pp = GraphicsDevice.PresentationParameters;
            _transitions.Add(new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, false, SurfaceFormat.Color, pp.DepthStencilFormat, pp.MultiSampleCount, RenderTargetUsage.DiscardContents));

            _menuScreen = new MenuScreen();

            List <Type> DemosToLoad      = new List <Type>();
            Assembly    samplesFramework = Assembly.GetExecutingAssembly();
            foreach (Type sampleType in samplesFramework.GetTypes())
            {
                if (sampleType.IsSubclassOf(typeof(PhysicsDemoScreen)))
                {
                    DemosToLoad.Add(sampleType);
                }
            }
            DemosToLoad.Add(DemosToLoad[0]); // HACK: Load the first sample two times, since some delayed creation stuff with the rendertargets always breaks the first preview picture.
            bool firstPreview = true;
            foreach (Type sampleType in DemosToLoad)
            {
                PhysicsDemoScreen demoScreen = samplesFramework.CreateInstance(sampleType.ToString()) as PhysicsDemoScreen;
#if WINDOWS
                if (!firstPreview)
                {
                    Console.WriteLine("Loading demo: " + demoScreen.GetTitle());
                }
#endif
                RenderTarget2D preview = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth / 2, pp.BackBufferHeight / 2, false, SurfaceFormat.Color, pp.DepthStencilFormat, pp.MultiSampleCount, RenderTargetUsage.DiscardContents);

                demoScreen.Framework = this;
                demoScreen.IsExiting = false;

                demoScreen.Sprites = _spriteBatch;
                demoScreen.Lines   = _lineBatch;
                demoScreen.Quads   = _quadRenderer;

                demoScreen.LoadContent();

                // "Abuse" transition rendertarget to render screen preview
                GraphicsDevice.SetRenderTarget(_transitions[0]);
                GraphicsDevice.Clear(Color.Transparent);

                _quadRenderer.Begin();
                _quadRenderer.Render(Vector2.Zero, new Vector2(_transitions[0].Width, _transitions[0].Height), null, true, ContentWrapper.Grey, Color.White * 0.3f);
                _quadRenderer.End();

                // Update ensures that the screen is fully visible, we "cover" it so that no physics are run
                demoScreen.Update(new GameTime(demoScreen.TransitionOnTime, demoScreen.TransitionOnTime), true, false);
                demoScreen.Draw(new GameTime());
                demoScreen.Draw(new GameTime());

                GraphicsDevice.SetRenderTarget(preview);
                GraphicsDevice.Clear(Color.Transparent);

                _spriteBatch.Begin();
                _spriteBatch.Draw(_transitions[0], preview.Bounds, Color.White);
                _spriteBatch.End();

                GraphicsDevice.SetRenderTarget(null);

                demoScreen.ExitScreen();
                demoScreen.Update(new GameTime(demoScreen.TransitionOffTime, demoScreen.TransitionOffTime), true, false);
                if (!firstPreview)
                {
                    _menuScreen.AddMenuItem(demoScreen, preview);
                }
                else
                {
                    firstPreview = false;
                }
            }

            AddScreen(new BackgroundScreen());
            AddScreen(_menuScreen);

            //TODO: This can't be called at this point in time in MonoGame
            //ResetElapsedTime();
        }
Exemple #5
0
        private void UpdateBrush()
        {
            if (updateBrush)
            {
                Display.context.OutputMerger.SetTargets(brushRenderTarget);
                Display.context.ClearRenderTargetView(brushRenderTarget, Color.Transparent);

                QuadRenderer.Begin();
                Display.context.OutputMerger.BlendState = DeviceStates.blendStateDrawing;

                int    quality = 85;
                Color4 color   = new Color4(1, 1, 1, 1);
                color.Alpha = 0.012f;

                float size = 1;
                for (int i = 1; i <= quality; i++)
                {
                    size = ((100.0f - CurrentBrushSoftness) / 100) + ((float)i / quality) * (CurrentBrushSoftness / 100);
                    QuadRenderer.Draw(DefaultBrush, new Vector2(256 * (1 - size)), new Vector2(size), color);
                }

                QuadRenderer.End();

                Display.context.OutputMerger.SetTargets(Display.depthStencil, Display.renderTarget);
                GraphicsManager.Reset();

                CurrentBrush.ressource = new ShaderResourceView(Display.device, brushTexture);

                Display.context.CopyResource(brushTexture, brushTextureReadable);

                Surface surf = brushTextureReadable.QueryInterface <Surface>();

                DataStream    streamN;
                DataRectangle rect = surf.Map(SharpDX.DXGI.MapFlags.Read, out streamN);
                streamN.Position = 0;

                byte[] textureData = new byte[512 * 512 * 4];
                streamN.ReadRange(textureData, 0, textureData.Length);

                surf.Unmap();

                System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(
                    512, 512,
                    System.Drawing.Imaging.PixelFormat.Format32bppArgb
                    );

                System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(
                    new System.Drawing.Rectangle(0, 0, 512, 512),
                    System.Drawing.Imaging.ImageLockMode.WriteOnly,
                    System.Drawing.Imaging.PixelFormat.Format32bppArgb
                    );

                IntPtr safePtr = bmpData.Scan0;
                System.Runtime.InteropServices.Marshal.Copy(textureData, 0, safePtr, textureData.Length);
                bmp.UnlockBits(bmpData);

                form.brushPreview.Image    = bmp;
                form.brushPreview.SizeMode = PictureBoxSizeMode.Zoom;


                updateBrush = false;
            }
        }
Exemple #6
0
        protected override void WinUpdate()
        {
            if (ForegroundGame.Map == null)
            {
                return;
            }

            UpdateBrush();

            Point pnt = new Point(InputHelper.mouseX, InputHelper.mouseY);

            bool canZoom = true;

            float realWheel = InputHelper.wheelDelta - deltaWheel;

            deltaWheel = InputHelper.wheelDelta;

            camera.ZoomLevel -= realWheel;
            if (camera.ZoomLevel < camera.minZoom)
            {
                camera.ZoomLevel = camera.minZoom;
                canZoom          = false;
            }
            else if (camera.ZoomLevel > 50)
            {
                camera.ZoomLevel = 50;
            }

            bool freezeDestination = false;

            if (updateWaterShader && !InputHelper.leftDown)
            {
                TerrainWater.Initialize();
                updateWaterShader = false;
            }

            //------------------------------------------------------------------------------------------------ SELECTION STUFF
            if ((currentTool == Tool.OBJECT_EDIT || currentTool == Tool.DECAL_EDIT) && InputHelper.altDown)
            {
                freezeDestination = true;
            }
            else if (currentTool != Tool.NOTHING && InputHelper.altDown && InputHelper.rightDown)
            {
                if (!LastRightClick)
                {
                    clickPos          = deltaPos = pnt;
                    lastBrushSize     = CurrentBrushSize;
                    lastBrushSoftness = CurrentBrushSoftness;
                }
                float dx   = pnt.X - deltaPos.X;
                float dy   = pnt.Y - deltaPos.Y;
                float dist = 1;

                if (destination != new Vector3(0, -99999, 0))
                {
                    dist  = Vector3.Distance(destination, camera.eyePosition);
                    dist /= ClientSize.Width / 2;
                }

                CurrentBrushSize = lastBrushSize + (dx * dist);

                if (CurrentBrushSize < 1)
                {
                    CurrentBrushSize = 1;
                }
                else if (CurrentBrushSize > 200)
                {
                    CurrentBrushSize = 200;
                }
                form.brushSize.Value = (int)CurrentBrushSize;

                CurrentBrushSoftness = lastBrushSoftness - (dy * dist);
                if (CurrentBrushSoftness < 0)
                {
                    CurrentBrushSoftness = 0;
                }
                else if (CurrentBrushSoftness > 100)
                {
                    CurrentBrushSoftness = 100;
                }
                form.brushSoftness.Value = (int)CurrentBrushSoftness;

                ChangeBrushProperties(CurrentBrushSize, CurrentBrushSoftness, CurrentBrushIntensity);
                freezeDestination = true;
            }
            else
            {
                CameraInputs(pnt);
            }

            Ray ray = CameraHelper.RayFromScreen(pnt.X, pnt.Y);

            if (!freezeDestination)
            {
                destination = ForegroundGame.Map.Pick(ray, false);
            }
            Vector2 size    = new Vector2(CurrentBrushSize / 512);
            Vector2 textPos = new Vector2(destination.X, destination.Z) + new Vector2(-256 + 256 * (1 - size.X));

            //------------------------------------------------------------------------------------------------ MODIFICATION AND TOOLS AND STUFF

            if (InputHelper.leftDown)
            {
                if (currentTool == Tool.PATHFINDING)
                {
                    #region Pathfinding
                    int roundedSize = (int)Math.Ceiling(CurrentBrushSize / 2);
                    int destX       = (int)Math.Round(destination.X, MidpointRounding.ToEven);
                    int destY       = (int)Math.Round(destination.Z, MidpointRounding.ToEven);

                    int width = (int)Math.Ceiling((float)Terrain.info.width / 2);

                    for (int x = -roundedSize; x < roundedSize; x++)
                    {
                        for (int y = -roundedSize; y < roundedSize; y++)
                        {
                            float power = (Vector2.Distance(Vector2.Zero, new Vector2(x, y)) / CurrentBrushSize) / 0.5f;

                            float limit = 1 - (CurrentBrushSoftness / 100);
                            power = (power - limit) / (1 - limit);
                            power = 1 - GameUtils.Clamp(power, 0, 1);

                            if (power > 0 && Terrain.InsideMap(destX + x, destY + y))
                            {
                                Point2D point = new Point2D((int)((destX + x) / 2), (int)((destY + y) / 2));//ForegroundGame.Map_Space.WorldToSpace(new Vector3());
                                Terrain.info.accessibilityArray[point.X + point.Y * width] = (byte)(CurrentBrushColor.Green == 0 ? 0 : 1);
                            }
                        }
                    }
                    #endregion
                }
                else if (currentTool == Tool.TEXTURE)
                {
                    #region Texture
                    Color4 colorAlphad = CurrentBrushColor;
                    colorAlphad.Alpha = CurrentBrushIntensity / 100;

                    Display.context.OutputMerger.SetTargets(drawableRenderTarget);
                    Display.context.ClearRenderTargetView(drawableRenderTarget, Color.Black);

                    QuadRenderer.Begin();
                    Display.context.OutputMerger.BlendState = DeviceStates.blendStateDrawing;
                    QuadRenderer.Draw(Terrain.info.TextureMap, new Vector2(0), Color.White);

                    QuadRenderer.Draw(CurrentBrush, textPos, size, colorAlphad);

                    QuadRenderer.End();

                    Display.context.OutputMerger.SetTargets(Display.depthStencil, Display.renderTarget);
                    GraphicsManager.Reset();

                    Texture2DDescription descHM = new Texture2DDescription()
                    {
                        ArraySize         = 1,
                        BindFlags         = BindFlags.ShaderResource,
                        CpuAccessFlags    = CpuAccessFlags.None,
                        Format            = Format.R8G8B8A8_UNorm,
                        Width             = Terrain.info.width,
                        Height            = Terrain.info.height,
                        MipLevels         = 1,
                        OptionFlags       = ResourceOptionFlags.None,
                        SampleDescription = new SampleDescription(1, 0),
                        Usage             = ResourceUsage.Default,
                    };

                    Terrain.info.TextureMap.Tex.Dispose();
                    Terrain.info.TextureMap.ressource.Dispose();
                    Terrain.info.TextureMap.Tex = new Texture2D(Display.device, descHM);
                    Display.context.CopyResource(drawableTexture, Terrain.info.TextureMap.Tex);
                    Terrain.info.TextureMap.RecreateSRV();
                    modifiedTextureMap = true;
                    #endregion
                }
                else if (currentTool == Tool.COLOR)
                {
                    #region Color
                    Color4 colorAlphad = CurrentBrushColor;
                    colorAlphad.Alpha = CurrentBrushIntensity / 100;

                    Display.context.OutputMerger.SetTargets(drawableRenderTarget);
                    Display.context.ClearRenderTargetView(drawableRenderTarget, Color.Black);

                    QuadRenderer.Begin();
                    Display.context.OutputMerger.BlendState = DeviceStates.blendStateDrawing;
                    QuadRenderer.Draw(Terrain.info.ColorMap, new Vector2(0), Color.White);

                    QuadRenderer.Draw(CurrentBrush, textPos, size, colorAlphad);

                    QuadRenderer.End();

                    Display.context.OutputMerger.SetTargets(Display.depthStencil, Display.renderTarget);
                    GraphicsManager.Reset();

                    Texture2DDescription descHM = new Texture2DDescription()
                    {
                        ArraySize         = 1,
                        BindFlags         = BindFlags.ShaderResource,
                        CpuAccessFlags    = CpuAccessFlags.None,
                        Format            = Format.R8G8B8A8_UNorm,
                        Width             = Terrain.info.width,
                        Height            = Terrain.info.height,
                        MipLevels         = 1,
                        OptionFlags       = ResourceOptionFlags.None,
                        SampleDescription = new SampleDescription(1, 0),
                        Usage             = ResourceUsage.Default,
                    };

                    Terrain.info.ColorMap.Tex.Dispose();
                    Terrain.info.ColorMap.Tex = new Texture2D(Display.device, descHM);
                    Display.context.CopyResource(drawableTexture, Terrain.info.ColorMap.Tex);
                    Terrain.info.ColorMap.RecreateSRV();
                    modifiedColorMap = true;
                    #endregion
                }
                else if (currentTool == Tool.LANDSCAPE_DOWN || currentTool == Tool.LANDSCAPE_UP || currentTool == Tool.LANDSCAPE_SET || currentTool == Tool.LANDSCAPE_SMOOTH)
                {
                    #region Terraforming

                    if (!LastClick && currentTool == Tool.LANDSCAPE_SET && !form.customSetValue.Checked)
                    {
                        form.levelTo.Value = (decimal)destination.Y;
                    }

                    int destX = (int)Math.Round(destination.X, MidpointRounding.ToEven);
                    int destY = (int)Math.Round(destination.Z, MidpointRounding.ToEven);


                    int roundedSize = (int)Math.Ceiling(CurrentBrushSize / 2);

                    if (currentTool == Tool.LANDSCAPE_SMOOTH)
                    {
                        listForSmoothing = new List <float[]>(roundedSize * roundedSize * 2 * 2);
                    }

                    for (int x = -roundedSize; x < roundedSize; x++)
                    {
                        for (int y = -roundedSize; y < roundedSize; y++)
                        {
                            float power = (Vector2.Distance(Vector2.Zero, new Vector2(x, y)) / CurrentBrushSize) / 0.5f;

                            float limit = 1 - (CurrentBrushSoftness / 100);
                            power = (power - limit) / (1 - limit);
                            power = 1 - GameUtils.Clamp(power, 0, 1);

                            if (power > 0 && Terrain.InsideMap(destX + x, destY + y))
                            {
                                float height = Terrain.vertices[destX + x + (destY + y) * Terrain.info.width].Position.Y;

                                switch (currentTool)
                                {
                                case Tool.LANDSCAPE_UP:
                                    height += CurrentBrushIntensity / 100 * power;
                                    Terrain.ChangeHeight(destX + x, destY + y, height);
                                    break;

                                case Tool.LANDSCAPE_DOWN:
                                    height -= CurrentBrushIntensity / 100 * power;
                                    Terrain.ChangeHeight(destX + x, destY + y, height);
                                    break;

                                case Tool.LANDSCAPE_SET:
                                    Terrain.ChangeHeight(destX + x, destY + y, GameUtils.Lerp(height, HeightLevelSetBrush, power));
                                    break;

                                case Tool.LANDSCAPE_SMOOTH:
                                    listForSmoothing.Add(new float[] { destX + x, destY + y, CurrentBrushIntensity / 100 * power });
                                    break;
                                }
                            }
                        }
                    }
                    if (currentTool == Tool.LANDSCAPE_SMOOTH)
                    {
                        Terrain.SmoothHeight(listForSmoothing);
                    }


                    DataStream stream;
                    Display.context.MapSubresource(Terrain.vertexBuffer, MapMode.WriteDiscard, SharpDX.Direct3D11.MapFlags.None, out stream);
                    stream.WriteRange(Terrain.vertices);
                    Display.context.UnmapSubresource(Terrain.vertexBuffer, 0);

                    updateWaterShader = true;
                    #endregion
                }
            }


            LastClick       = InputHelper.leftDown;
            LastMiddleClick = InputHelper.middleDown;
            LastRightClick  = InputHelper.rightDown;
        }
Exemple #7
0
 void UpdateQuad()
 {
     quadRenderer.Begin();
     quadRenderer.Quad(Vector3.Zero, new Vector3(window.Width, window.Height, 0.0f));
     quadRenderer.End();
 }
Exemple #8
0
        public void Render()
        {
            renderer.Push();

            quadRenderer.Begin();
            Vector3 o     = new Vector3(10.0f, 64, 0.0f);
            Vector3 a     = o;
            float   alpha = 0.50f;

            textRenderer.TextBuffer.BeginPrint();

            foreach (var timer in Timer.Timers)
            {
                quadRenderer.Quad(
                    o,
                    o + new Vector3(10.0f * timer.CPUTime, 5.0f, 0.0f),
                    new Vector4(timer.Color, alpha)
                    );
                o.Y += 6.0f;
                quadRenderer.Quad(
                    o,
                    o + new Vector3(10.0f * timer.GPUTime, 5.0f, 0.0f),
                    new Vector4(timer.Color, alpha)
                    );
                textRenderer.TextBuffer.LowPrint(
                    o.X,
                    o.Y - 4.0f,
                    0.0f,
                    timer.ToString()
                    );

                o.Y += 6.0f;
            }
            quadRenderer.Quad(
                new Vector3(10.0f + 159.0f, a.Y, 0.0f),
                new Vector3(10.0f + 161.0f, o.Y, 0.0f),
                new Vector4(1.0f, 1.0f, 1.0f, alpha)
                );
            quadRenderer.End();

            textRenderer.TextBuffer.EndPrint();
            renderer.Requested.Mesh     = textRenderer.TextBuffer.Mesh;
            renderer.Requested.Material = textRenderer.Material;
            renderer.Requested.Program  = textRenderer.Material.Program;
            renderer.Requested.MeshMode = MeshMode.PolygonFill;
            //renderer.SetTexture("t_font", textRenderer.TextBuffer.FontStyle.Texture);
            renderer.SetFrame(renderer.DefaultFrame);
            renderer.RenderCurrent();

            renderer.Global.Floats("alpha").Set(0.5f);
            renderer.Global.Sync();

            renderer.Requested.Mesh = quadRenderer.Mesh;
            // \todo
            //renderer.Requested.Material = uiMaterial; //  this has blending on
            renderer.Requested.Program  = renderer.Programs["ColorFill"]; //colorFill;
            renderer.Requested.MeshMode = MeshMode.PolygonFill;
            renderer.SetFrame(renderer.DefaultFrame);
            renderer.RenderCurrent();

            renderer.Pop();
        }