示例#1
0
        public void Render(IViewport viewport, PerspectiveCamera camera, I2DRenderer im)
        {
            var str  = $"3-D View";
            var size = im.CalcTextSize(FontType.Normal, str);

            im.AddText(new Vector2(2, 2), Color.White, FontType.Normal, str);
            im.AddRectFilled(Vector2.Zero, size + new Vector2(4, 4), Color.FromArgb(128, Color.Pink));
        }
示例#2
0
        public void TestInitialize()
        {
            _mockRenderContext = new Mock <IRenderContext>(MockBehavior.Strict);
            _mockFactory       = new Mock <IFactory>(MockBehavior.Strict);

            _mockVertexBuffer = new Mock <IVertexBuffer>(MockBehavior.Strict);
            _mockIndexBuffer  = new Mock <IIndexBuffer>(MockBehavior.Strict);
            _mockVertexArray  = new Mock <IVertexArray>(MockBehavior.Strict);
            _mockShader       = new Mock <IShader>(MockBehavior.Strict);

            _target = new Renderer2D(_mockRenderContext.Object, _mockFactory.Object);
        }
示例#3
0
        public void Render(IViewport viewport, PerspectiveCamera camera, I2DRenderer im)
        {
            if (CursorVisible)
            {
                return;
            }
            if (Viewport.Viewport != viewport)
            {
                return;
            }

            var       x    = viewport.Width / 2;
            var       y    = viewport.Height / 2;
            const int size = 3;

            im.AddRectFilled(new Vector2(x - 1, y - size - 1), new Vector2(x + 2, y + size + 2), Color.Black);
            im.AddRectFilled(new Vector2(x - size - 1, y - 1), new Vector2(x + size + 2, y + 2), Color.Black);

            im.AddLine(new Vector2(x, y - size), new Vector2(x, y + size + 1), Color.White, 1, false);
            im.AddLine(new Vector2(x - size, y), new Vector2(x + size + 1, y), Color.White, 1, false);
        }
示例#4
0
        protected override void Render(MapDocument document, IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            base.Render(document, viewport, camera, worldMin, worldMax, im);

            if (_state != ClipState.None && _clipPlanePoint1 != null && _clipPlanePoint2 != null && _clipPlanePoint3 != null)
            {
                var p1     = _clipPlanePoint1.Value;
                var p2     = _clipPlanePoint2.Value;
                var p3     = _clipPlanePoint3.Value;
                var points = new[] { p1, p2, p3 };

                foreach (var p in points)
                {
                    const int size = 4;
                    var       spos = camera.WorldToScreen(p);

                    im.AddRectOutlineOpaque(new Vector2(spos.X - size, spos.Y - size), new Vector2(spos.X + size, spos.Y + size), Color.Black, Color.White);
                }
            }
        }
        protected override void Render(MapDocument document, IViewport viewport, PerspectiveCamera camera, I2DRenderer im)
        {
            if (!document.Selection.IsEmpty)
            {
                switch (_mouseMovePoint == null ? CircleType.None : _mouseDown)
                {
                case CircleType.None:
                    RenderCircleTypeNone(camera, im);
                    break;

                case CircleType.Outer:
                case CircleType.X:
                case CircleType.Y:
                case CircleType.Z:
                    RenderAxisRotating(viewport, camera, im);
                    break;
                }
            }
            base.Render(document, viewport, camera, im);
        }
示例#6
0
        public void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            var str = $"";

            switch (camera.ViewType)
            {
            case OrthographicCamera.OrthographicType.Front:
                str = $"2-D Side";
                break;

            case OrthographicCamera.OrthographicType.Side:
                str = $"Gameplay View (Front)";
                break;

            case OrthographicCamera.OrthographicType.Top:
                str = $"2-D Top";
                break;
            }

            var size = im.CalcTextSize(FontType.Normal, str);

            im.AddText(new Vector2(2, 2), Color.White, FontType.Normal, str);
            im.AddRectFilled(Vector2.Zero, size + new Vector2(4, 4), Color.FromArgb(128, Color.Pink));
        }
示例#7
0
        public void Render(IViewport viewport, ICollection <IMapObject> objects, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            if (camera.Zoom < 0.5f)
            {
                return;
            }

            foreach (var ed in objects.OfType <Entity>().Where(x => x.EntityData != null).Where(x => !x.Data.OfType <IObjectVisibility>().Any(v => v.IsHidden)))
            {
                var ang = ed.EntityData.GetVector3("angles");
                if (!ang.HasValue)
                {
                    continue;
                }

                var c = ed.Color?.Color ?? Color.White;

                var angRad = ang.Value * (float)Math.PI / 180f;
                var min    = Math.Min(ed.BoundingBox.Width, Math.Min(ed.BoundingBox.Height, ed.BoundingBox.Length));
                var tform  = Matrix4x4.CreateFromYawPitchRoll(angRad.X, angRad.Z, angRad.Y);

                var origin = ed.BoundingBox.Center;

                var start = camera.WorldToScreen(origin).ToVector2();
                var end   = camera.WorldToScreen(origin + Vector3.Transform(Vector3.UnitX, tform) * 0.4f * min).ToVector2();

                im.AddLine(start, end, c, 2);
            }
        }
示例#8
0
        protected virtual void DrawBoxText(IViewport viewport, OrthographicCamera camera, I2DRenderer im, Vector3 start, Vector3 end)
        {
            // Don't draw the text at all if the rectangle is entirely outside the viewport
            if (start.X > camera.Width || end.X < 0)
            {
                return;
            }
            if (start.Y < 0 || end.Y > camera.Height)
            {
                return;
            }

            // Find the width and height for the given projection
            var st = camera.Flatten(State.Start);
            var en = camera.Flatten(State.End);

            var widthText  = (Math.Abs(Math.Round(en.X - st.X, 1))).ToString("0.##");
            var heightText = (Math.Abs(Math.Round(en.Y - st.Y, 1))).ToString("0.##");

            // Determine the size of the value strings
            var mWidth  = im.CalcTextSize(FontType.Large, widthText);
            var mHeight = im.CalcTextSize(FontType.Large, heightText);

            const int padding = 6;

            // Ensure the text is clamped inside the viewport
            var vWidth = new Vector3((end.X + start.X - mWidth.X) / 2, end.Y - mWidth.Y - padding, 0);

            vWidth = Vector3.Clamp(vWidth, Vector3.Zero, new Vector3(camera.Width - mWidth.X - padding, camera.Height - mHeight.Y - padding, 0));

            var vHeight = new Vector3(end.X + padding, (end.Y + start.Y - mHeight.Y) / 2, 0);

            vHeight = Vector3.Clamp(vHeight, new Vector3(0, mWidth.Y + padding, 0), new Vector3(camera.Width - mWidth.X - padding, camera.Height - mHeight.Y - padding, 0));

            // Draw the strings
            im.AddText(vWidth.ToVector2(), GetRenderBoxColour(), FontType.Large, widthText);
            im.AddText(vHeight.ToVector2(), GetRenderBoxColour(), FontType.Large, heightText);
        }
        public void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            if (!_overlays.Any())
            {
                return;
            }
            if (!_document.TryGetTarget(out var doc))
            {
                return;
            }

            // Determine which objects are visible
            var padding = Vector3.One * 100;
            var box     = new Box(worldMin - padding, worldMax + padding);
            var objects = doc.Map.Root.Find(x => x.BoundingBox.IntersectsWith(box)).ToList();

            // Render the overlay for each object
            foreach (var overlay in _overlays)
            {
                overlay.Value.Render(viewport, objects, camera, worldMin, worldMax, im);
            }
        }
示例#10
0
 public abstract void Render(IViewport viewport, PerspectiveCamera camera, I2DRenderer im);
示例#11
0
        public override void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            if (ShouldDrawBox())
            {
                var start = camera.WorldToScreen(Vector3.Min(State.Start, State.End));
                var end   = camera.WorldToScreen(Vector3.Max(State.Start, State.End));
                DrawBox(viewport, camera, im, start, end);
            }

            if (ShouldDrawBoxText())
            {
                var start = camera.WorldToScreen(Vector3.Min(State.Start, State.End));
                var end   = camera.WorldToScreen(Vector3.Max(State.Start, State.End));
                DrawBoxText(viewport, camera, im, start, end);
            }
        }
示例#12
0
        public override void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            var(wpos, soff) = GetWorldPositionAndScreenOffset(camera);
            var spos = camera.WorldToScreen(wpos) + soff;

            const float radius = 4;

            im.AddCircleFilled(spos.ToVector2(), radius, Color.White);
            im.AddCircle(spos.ToVector2(), radius, Color.Black);
        }
示例#13
0
        public override void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            if (HighlightedViewport != viewport)
            {
                return;
            }

            var b     = GetRectangle(camera);
            var start = camera.WorldToScreen(camera.Expand(b.Start));
            var end   = camera.WorldToScreen(camera.Expand(b.End));

            im.AddRectFilled(start.ToVector2(), end.ToVector2(), State.FillColour);

            if (Handle == ResizeHandle.Center && SnappedMoveOrigin != null)
            {
                const int size = 4;
                var       orig = camera.WorldToScreen(camera.Expand(SnappedMoveOrigin.Value));

                im.AddLine(new Vector2(orig.X - size, orig.Y - size), new Vector2(orig.X + size, orig.Y + size), Color.Yellow, 1, false);
                im.AddLine(new Vector2(orig.X + size, orig.Y - size), new Vector2(orig.X - size, orig.Y + size), Color.Yellow, 1, false);
            }
        }
示例#14
0
        public override void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            var spos = camera.WorldToScreen(Position);

            const int size = 4;

            var col = Highlighted ? Color.Red : Color.Green;

            im.AddRectOutlineOpaque(spos.ToVector2() - new Vector2(size, size), spos.ToVector2() + new Vector2(size, size), Color.Black, col);
        }
示例#15
0
 protected override void Render(MapDocument document, IViewport viewport, PerspectiveCamera camera, I2DRenderer im)
 {
     foreach (var obj in CollectObjects(x => new[] { x }).OrderByDescending(x => (x.Origin - camera.Position).LengthSquared()))
     {
         obj.Render(viewport, camera, im);
     }
     base.Render(document, viewport, camera, im);
 }
示例#16
0
 protected override void Render(MapDocument document, IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
 {
     foreach (var obj in CollectObjects(x => new[] { x }).OrderBy(x => camera.GetUnusedValue(x.ZIndex)))
     {
         obj.Render(viewport, camera, worldMin, worldMax, im);
     }
     base.Render(document, viewport, camera, worldMin, worldMax, im);
 }
        public override void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            var spos = camera.WorldToScreen(Position);

            const float inner = 4;
            const float outer = 8;

            var col = Highlighted ? Color.Red : Color.White;

            im.AddCircle(spos.ToVector2(), inner, Color.Cyan);
            im.AddCircle(spos.ToVector2(), outer, col);
        }
        public override void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            if (State.State.Action != BoxAction.Drawn)
            {
                return;
            }

            var(wpos, soff) = GetWorldPositionAndScreenOffset(camera);
            var spos = camera.WorldToScreen(wpos) + soff;

            const int size = 4;

            im.AddRectOutlineOpaque(new Vector2(spos.X - size, spos.Y - size), new Vector2(spos.X + size, spos.Y + size), Color.Black, Color.White);
        }
示例#19
0
 public abstract void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im);
        private void RenderAxisRotating(IViewport viewport, PerspectiveCamera camera, I2DRenderer im)
        {
            if (ActiveViewport.Viewport != viewport || !_mouseDownPoint.HasValue || !_mouseMovePoint.HasValue)
            {
                return;
            }

            var st = camera.WorldToScreen(_pivotPoint);
            var en = _mouseDownPoint.Value;

            im.AddLine(st.ToVector2(), en.ToVector2(), Color.Gray);

            en = _mouseMovePoint.Value;
            im.AddLine(st.ToVector2(), en.ToVector2(), Color.LightGray);
        }
        public void Render(IViewport viewport, ICollection <IMapObject> objects, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            if (camera.Zoom < 1)
            {
                return;
            }

            // Escape hatch in case there's too many entities on screen
            var ents = objects.OfType <Entity>().Where(x => x.EntityData != null).Where(x => !x.Data.OfType <IObjectVisibility>().Any(v => v.IsHidden)).ToList();

            if (ents.Count <= 0 || ents.Count > 1000)
            {
                return;
            }

            var renderNames = camera.Zoom > 2 && ents.Count < 50;

            foreach (var ed in ents)
            {
                var c = ed.Color?.Color ?? Color.White;

                var loc = camera.WorldToScreen(ed.BoundingBox.Center);

                var box = ed.BoundingBox;
                var dim = camera.Flatten(box.Dimensions / 2);
                loc.Y -= camera.UnitsToPixels(dim.Y);

                var str        = ed.EntityData.Name;
                var targetname = ed.EntityData.Get <string>("targetname")?.Trim() ?? "";

                var size = im.CalcTextSize(FontType.Normal, str);

                var pos = new Vector2(loc.X - size.X / 2, loc.Y - size.Y - 2);

                im.AddText(pos, c, FontType.Normal, str);

                if (renderNames && targetname.Length > 0)
                {
                    var nmms = im.CalcTextSize(FontType.Bold, targetname);
                    im.AddText(new Vector2(loc.X - nmms.X / 2, loc.Y + 2), c, FontType.Bold, targetname);
                }
            }
        }
        private void RenderCircleTypeNone(PerspectiveCamera camera, I2DRenderer im)
        {
            var center = _pivotPoint;
            var origin = new Vector3(center.X, center.Y, center.Z);

            var distance = (camera.EyeLocation - origin).Length();

            if (distance <= 1)
            {
                return;
            }

            // Ensure points that can't be projected properly don't get rendered
            var screenOrigin = camera.WorldToScreen(origin);
            var sop          = new PointF(screenOrigin.X, screenOrigin.Y);
            var rec          = new RectangleF(-200, -200, camera.Width + 400, camera.Height + 400);

            if (!rec.Contains(sop))
            {
                return;
            }

            var radius = 0.15f * distance;

            var normal = Vector3.Normalize(Vector3.Subtract(camera.EyeLocation, origin));
            var right  = Vector3.Normalize(Vector3.Cross(normal, Vector3.UnitZ));
            var up     = Vector3.Normalize(Vector3.Cross(normal, right));

            const int   sides = 32;
            const float diff  = (float)(2 * Math.PI) / sides;

            for (var i = 0; i < sides; i++)
            {
                var cos1 = (float)Math.Cos(diff * i);
                var sin1 = (float)Math.Sin(diff * i);
                var cos2 = (float)Math.Cos(diff * (i + 1));
                var sin2 = (float)Math.Sin(diff * (i + 1));

                var line = new Line(
                    origin + right * cos1 * radius + up * sin1 * radius,
                    origin + right * cos2 * radius + up * sin2 * radius
                    );

                var st = camera.WorldToScreen(line.Start);
                var en = camera.WorldToScreen(line.End);

                im.AddLine(st.ToVector2(), en.ToVector2(), Color.DarkGray);

                line = new Line(
                    origin + right * cos1 * radius * 1.2f + up * sin1 * radius * 1.2f,
                    origin + right * cos2 * radius * 1.2f + up * sin2 * radius * 1.2f
                    );

                st = camera.WorldToScreen(line.Start);
                en = camera.WorldToScreen(line.End);

                var c = _mouseOver == CircleType.Outer ? Color.White : Color.LightGray;
                im.AddLine(st.ToVector2(), en.ToVector2(), c);
            }

            var plane = new Plane(normal, Vector3.Dot(origin, normal));

            for (var i = 0; i < sides; i++)
            {
                var cos1 = (float)Math.Cos(diff * i) * radius;
                var sin1 = (float)Math.Sin(diff * i) * radius;
                var cos2 = (float)Math.Cos(diff * (i + 1)) * radius;
                var sin2 = (float)Math.Sin(diff * (i + 1)) * radius;

                RenderLine(
                    (origin + Vector3.UnitX * cos1 + Vector3.UnitY * sin1),
                    (origin + Vector3.UnitX * cos2 + Vector3.UnitY * sin2),
                    plane,
                    _mouseOver == CircleType.Z ? Color.Blue : Color.DarkBlue,
                    camera, im);

                RenderLine(
                    (origin + Vector3.UnitY * cos1 + Vector3.UnitZ * sin1),
                    (origin + Vector3.UnitY * cos2 + Vector3.UnitZ * sin2),
                    plane,
                    _mouseOver == CircleType.X ? Color.Red : Color.DarkRed,
                    camera, im);

                RenderLine(
                    (origin + Vector3.UnitZ * cos1 + Vector3.UnitX * sin1),
                    (origin + Vector3.UnitZ * cos2 + Vector3.UnitX * sin2),
                    plane,
                    _mouseOver == CircleType.Y ? Color.Lime : Color.LimeGreen,
                    camera, im);
            }
        }
示例#23
0
        protected virtual void DrawBox(IViewport viewport, OrthographicCamera camera, I2DRenderer im, Vector3 start, Vector3 end)
        {
            start = Vector3.Max(start, new Vector3(-100, -100, -100));
            end   = Vector3.Min(end, new Vector3(viewport.Width + 100, viewport.Height + 100, 100));

            im.AddRectFilled(start.ToVector2(), end.ToVector2(), GetRenderFillColour());
            im.AddRect(start.ToVector2(), end.ToVector2(), GetRenderBoxColour());
        }
        private void RenderLine(Vector3 start, Vector3 end, Plane plane, Color color, ICamera camera, I2DRenderer im)
        {
            var line = new Line(start, end);
            var cls  = line.ClassifyAgainstPlane(plane);

            if (cls == PlaneClassification.Back)
            {
                return;
            }
            if (cls == PlaneClassification.Spanning)
            {
                var isect = plane.GetIntersectionPoint(line, true);
                var first = plane.OnPlane(line.Start) > 0 ? line.Start : line.End;
                if (!isect.HasValue)
                {
                    return;
                }
                line = new Line(first, isect.Value);
            }

            var st = camera.WorldToScreen(line.Start);
            var en = camera.WorldToScreen(line.End);

            im.AddLine(st.ToVector2(), en.ToVector2(), color, 2);
        }
示例#25
0
 public override void Render(IViewport viewport, PerspectiveCamera camera, I2DRenderer im)
 {
     //
 }
示例#26
0
        public void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            var str  = $"2D {camera.ViewType}";
            var size = im.CalcTextSize(FontType.Normal, str);

            im.AddText(new Vector2(2, 2), Color.White, FontType.Normal, str);
            im.AddRectFilled(Vector2.Zero, size + new Vector2(4, 4), Color.FromArgb(128, Color.Pink));
        }
 public void Render(IViewport viewport, PerspectiveCamera camera, I2DRenderer im)
 {
     // 2D only
 }
示例#28
0
文件: Scene.cs 项目: ejrich/Pretend
 public Scene(I2DRenderer renderer, ITextRenderer textRenderer, IEntityContainer entityContainer)
 {
     _renderer       = renderer;
     _textRenderer   = textRenderer;
     EntityContainer = entityContainer;
 }
示例#29
0
        protected override void Render(MapDocument document, IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
        {
            base.Render(document, viewport, camera, worldMin, worldMax, im);

            foreach (var cam in GetCameraList(document))
            {
                var p1 = camera.WorldToScreen(cam.EyePosition);
                var p2 = camera.WorldToScreen(cam.LookPosition);

                var lineColor   = cam.IsActive ? Color.Red : Color.Cyan;
                var handleColor = cam.IsActive ? Color.DarkOrange : Color.LawnGreen;

                im.AddLine(p1.ToVector2(), p2.ToVector2(), lineColor);
                im.AddCircleFilled(p1.ToVector2(), 4, handleColor);
                im.AddCircle(p1.ToVector2(), 4, Color.Black);

                // todo post-beta: triangle arrow for cameras in 2D?
            }
        }
示例#30
0
            public override void Render(IViewport viewport, OrthographicCamera camera, Vector3 worldMin, Vector3 worldMax, I2DRenderer im)
            {
                var spos = camera.WorldToScreen(Position);

                const int inner = 4;
                const int outer = 8;

                var col = Highlighted ? Color.DarkOrange : Color.LightBlue;

                im.AddCircle(spos.ToVector2(), inner, Color.AliceBlue);
                im.AddCircle(spos.ToVector2(), outer, col);
            }