Example #1
0
        public void Draw3D(ViewportBase context, Matrix4 viewport, Matrix4 camera, Matrix4 modelView)
        {
            if (_document.TextureCollection.LightmapTextureOutdated)
            {
                _document.TextureCollection.UpdateLightmapTexture();
                List <Face> faces = new List <Face>();
                foreach (Solid solid in _document.Map.WorldSpawn.Find(x => x is Solid).OfType <Solid>())
                {
                    foreach (Face tface in solid.Faces)
                    {
                        faces.Add(tface);
                    }
                }
                UpdatePartial(faces);
            }

            var type = ((Viewport3D)context).Type;
            var opts = new Viewport3DRenderOptions {
                Viewport        = viewport,
                Camera          = camera,
                ModelView       = modelView,
                ShowGrid        = Document.Map.Show3DGrid,
                GridSpacing     = Document.Map.GridSpacing,
                Shaded          = type == Viewport3D.ViewType.Shaded || type == Viewport3D.ViewType.Textured || type == Viewport3D.ViewType.Lightmapped,
                Textured        = type == Viewport3D.ViewType.Textured || type == Viewport3D.ViewType.Lightmapped,
                Wireframe       = type == Viewport3D.ViewType.Wireframe,
                LightmapEnabled = type == Viewport3D.ViewType.Lightmapped
            };

            var cam      = ((Viewport3D)context).Camera;
            var location = new Coordinate((decimal)cam.Location.X, (decimal)cam.Location.Y, (decimal)cam.Location.Z);
            var lookAt   = new Coordinate((decimal)cam.LookAt.X, (decimal)cam.LookAt.Y, (decimal)cam.LookAt.Z);

            if (!opts.Wireframe)
            {
                _mapObject3DShader.Bind(opts);
                _mapObject3DShader.SelectionTransform        = _selectionTransform;
                _mapObject3DShader.SelectionColourMultiplier = Document.Map.HideFaceMask &&
                                                               Document.Selection.InFaceSelection
                                                                   ? new Vector4(1, 1, 1, 1)
                                                                   : new Vector4(1, 0.5f, 0.5f, 1);

                // Render textured polygons
                _array.RenderTextured(context.Context, _document.TextureCollection.LightmapTexture);

                // Render textured models
                if (!CBRE.Settings.View.DisableModelRendering)
                {
                    foreach (var tuple in _models)
                    {
                        var arr    = _modelArrays[tuple.Item2];
                        var origin = tuple.Item1.Origin;
                        if (tuple.Item1.HideDistance() <= (location - origin).VectorMagnitude())
                        {
                            continue;
                        }

                        var scale = tuple.Item1.EntityData.GetPropertyCoordinate("scale", Coordinate.One);
                        scale = new Coordinate(scale.X, scale.Z, scale.Y);
                        var angles = tuple.Item1.EntityData.GetPropertyCoordinate("angles", Coordinate.Zero);
                        if (tuple.Item1.IsSelected)
                        {
                            origin *= _selectionTransformMat;

                            angles = Entity.TransformToEuler(new UnitMatrixMult(_selectionTransformMat.Inverse()), angles);
                        }
                        Matrix pitch = Matrix.Rotation(Quaternion.EulerAngles(DMath.DegreesToRadians(angles.X), 0, 0));
                        Matrix yaw   = Matrix.Rotation(Quaternion.EulerAngles(0, 0, -DMath.DegreesToRadians(angles.Y)));
                        Matrix roll  = Matrix.Rotation(Quaternion.EulerAngles(0, DMath.DegreesToRadians(angles.Z), 0));
                        var    tform = (yaw * pitch * roll * Matrix.Scale(scale)).Translate(origin);
                        _mapObject3DShader.Transformation = tform.ToGLSLMatrix4();
                        arr.RenderTextured(context.Context);
                    }
                    _mapObject3DShader.Transformation = Matrix4.Identity;
                }

                // Render untextured polygons
                _mapObject3DShader.IsTextured = false;
                _array.RenderUntextured(context.Context, location);

                // todo Render sprites

                _mapObject3DShader.Unbind();
            }

            // Render wireframe
            _mapObject2DShader.Bind(opts);
            _mapObject2DShader.SelectedColour = new Vector4(1, 1, 0, 1);

            if (opts.Wireframe)
            {
                _mapObject2DShader.SelectedOnly       = false;
                _mapObject2DShader.SelectionTransform = _selectionTransform;
                _array.RenderWireframe(context.Context);
                _decalArray.RenderWireframe(context.Context);
            }

            if (!Document.Selection.InFaceSelection || !Document.Map.HideFaceMask)
            {
                _mapObject2DShader.SelectedOnly       = true;
                _mapObject2DShader.SelectionTransform = Matrix4.Identity;
                _array.RenderWireframe(context.Context);
                _decalArray.RenderWireframe(context.Context);
            }

            _mapObject2DShader.Unbind();

            if (!opts.Wireframe)
            {
                // Render transparent
                _mapObject3DShader.Bind(opts);
                _decalArray.RenderTransparent(context.Context, location);
                _array.RenderTransparent(context.Context, x => {
                    _mapObject3DShader.IsTextured = x.Texture != null && opts.Textured;
                    _mapObject3DShader.SqrtAlpha  = !x.IsToolTexture;
                }, location, lookAt);
                _mapObject3DShader.Unbind();
            }
        }
Example #2
0
 public override void MouseUp(ViewportBase viewport, ViewportEvent e)
 {
     _state = State.None;
 }
Example #3
0
 public override void Render(ViewportBase viewport)
 {
     WidgetAction((w, vp, ev) => w.Render(vp), viewport, null);
     base.Render(viewport);
 }
Example #4
0
 public override void KeyPress(ViewportBase viewport, ViewportEvent e)
 {
     // Nothing
 }
Example #5
0
 public override void MouseLeave(ViewportBase viewport, ViewportEvent e)
 {
     //
 }
Example #6
0
 public override void KeyUp(ViewportBase viewport, ViewportEvent e)
 {
     //
 }
Example #7
0
 public IEnumerable <MapObject> Order(ViewportBase viewport, IEnumerable <MapObject> mapObjects)
 {
     return(mapObjects);
 }
Example #8
0
        public override void MouseMove(ViewportBase vp, ViewportEvent e)
        {
            if (!(vp is Viewport2D))
            {
                return;
            }
            var viewport = (Viewport2D)vp;

            var point = SnapIfNeeded(viewport.Expand(viewport.ScreenToWorld(e.X, viewport.Height - e.Y)));
            var st    = GetStateAtPoint(e.X, viewport.Height - e.Y, viewport);

            if (_state == ClipState.Drawing)
            {
                _state           = ClipState.MovingPoint2;
                _clipPlanePoint1 = _drawingPoint;
                _clipPlanePoint2 = point;
                _clipPlanePoint3 = _clipPlanePoint1 + SnapIfNeeded(viewport.GetUnusedCoordinate(new Coordinate(128, 128, 128)));
            }
            else if (_state == ClipState.MovingPoint1)
            {
                // Move point 1
                var cp1 = viewport.GetUnusedCoordinate(_clipPlanePoint1) + point;
                if (KeyboardState.Ctrl)
                {
                    var diff = _clipPlanePoint1 - cp1;
                    _clipPlanePoint2 -= diff;
                    _clipPlanePoint3 -= diff;
                }
                _clipPlanePoint1 = cp1;
            }
            else if (_state == ClipState.MovingPoint2)
            {
                // Move point 2
                var cp2 = viewport.GetUnusedCoordinate(_clipPlanePoint2) + point;
                if (KeyboardState.Ctrl)
                {
                    var diff = _clipPlanePoint2 - cp2;
                    _clipPlanePoint1 -= diff;
                    _clipPlanePoint3 -= diff;
                }
                _clipPlanePoint2 = cp2;
            }
            else if (_state == ClipState.MovingPoint3)
            {
                // Move point 3
                var cp3 = viewport.GetUnusedCoordinate(_clipPlanePoint3) + point;
                if (KeyboardState.Ctrl)
                {
                    var diff = _clipPlanePoint3 - cp3;
                    _clipPlanePoint1 -= diff;
                    _clipPlanePoint2 -= diff;
                }
                _clipPlanePoint3 = cp3;
            }

            Editor.Instance.CaptureAltPresses = _state != ClipState.None && _state != ClipState.Drawn;

            if (st != ClipState.None || (_state != ClipState.None && _state != ClipState.Drawn))
            {
                viewport.Cursor = Cursors.Cross;
            }
            else
            {
                viewport.Cursor = Cursors.Default;
            }
        }
Example #9
0
 public override void MouseEnter(ViewportBase viewport, ViewportEvent e)
 {
     _activeViewport = viewport;
 }
Example #10
0
 public override void MouseLeave(ViewportBase viewport, ViewportEvent e)
 {
     _activeViewport = null;
 }
Example #11
0
 public override void KeyDown(ViewportBase viewport, ViewportEvent e)
 {
 }
Example #12
0
        /// <summary>
        /// When the mouse wheel is scrolled while the mouse is down in the 3D view, cycle through the candidate elements.
        /// </summary>
        /// <param name="viewport">The viewport that was scrolled</param>
        /// <param name="e">The scroll event</param>
        public override void MouseWheel(ViewportBase viewport, ViewportEvent e)
        {
            if (WidgetAction((w, vp, ev) => w.MouseWheel(vp, ev), viewport, e))
            {
                return;
            }

            // If we're not in 3D cycle mode, carry on
            if (!(viewport is Viewport3D) ||
                IntersectingObjectsFor3DSelection == null ||
                ChosenItemFor3DSelection == null)
            {
                return;
            }

            var desel = new List <MapObject>();
            var sel   = new List <MapObject>();

            // Select (or deselect) the current element
            if (ChosenItemFor3DSelection.IsSelected)
            {
                desel.Add(ChosenItemFor3DSelection);
            }
            else
            {
                sel.Add(ChosenItemFor3DSelection);
            }

            // Get the index of the current element
            var index = IntersectingObjectsFor3DSelection.IndexOf(ChosenItemFor3DSelection);

            if (index < 0)
            {
                return;
            }

            // Move the index in the mouse wheel direction, cycling if needed
            var dir = e.Delta / Math.Abs(e.Delta);

            index = (index + dir) % IntersectingObjectsFor3DSelection.Count;
            if (index < 0)
            {
                index += IntersectingObjectsFor3DSelection.Count;
            }

            ChosenItemFor3DSelection = IntersectingObjectsFor3DSelection[index];

            // Select (or deselect) the new current element
            if (ChosenItemFor3DSelection.IsSelected)
            {
                desel.Add(ChosenItemFor3DSelection);
            }
            else
            {
                sel.Add(ChosenItemFor3DSelection);
            }

            SetSelected(desel, sel, false, IgnoreGrouping());

            State.ActiveViewport = null;
        }
Example #13
0
 public override void UpdateFrame(ViewportBase viewport, FrameInfo frame)
 {
     WidgetAction((w, vp, ev) => w.UpdateFrame(vp, frame), viewport, null);
     base.UpdateFrame(viewport, frame);
 }
Example #14
0
        public override void Render(ViewportBase viewport)
        {
            var vp = viewport as Viewport2D;

            if (vp == null)
            {
                return;
            }

            var cams = GetCameras().ToList();

            if (!cams.Any())
            {
                return;
            }

            var z = (double)vp.Zoom;

            GL.Enable(EnableCap.LineSmooth);
            GL.Hint(HintTarget.LineSmoothHint, HintMode.Nicest);

            // Draw lines between points and point outlines
            GL.Begin(BeginMode.Lines);

            foreach (var camera in cams)
            {
                var p1 = vp.Flatten(camera.EyePosition);
                var p2 = vp.Flatten(camera.LookPosition);

                GL.Color3(camera == Document.Map.ActiveCamera ? Color.Red : Color.Cyan);
                GL.Vertex2(p1.DX, p1.DY);
                GL.Vertex2(p2.DX, p2.DY);
                GL.Vertex2(p2.DX, p2.DY);
                GL.Vertex2(p1.DX, p1.DY);
            }

            GL.End();

            GL.Enable(EnableCap.PolygonSmooth);
            GL.Hint(HintTarget.PolygonSmoothHint, HintMode.Nicest);

            foreach (var camera in cams)
            {
                var p1 = vp.Flatten(camera.EyePosition);

                // Position circle
                GL.Begin(BeginMode.Polygon);
                GL.Color3(camera == Document.Map.ActiveCamera ? Color.DarkOrange : Color.LawnGreen);
                GLX.Circle(new Vector2d(p1.DX, p1.DY), 4, z, loop: true);
                GL.End();
            }
            foreach (var camera in cams)
            {
                var p1 = vp.Flatten(camera.EyePosition);
                var p2 = vp.Flatten(camera.LookPosition);

                var multiplier = 4 / vp.Zoom;
                var dir        = (p2 - p1).Normalise();
                var cp         = new Coordinate(-dir.Y, dir.X, 0).Normalise();

                // Direction Triangle
                GL.Begin(BeginMode.Triangles);
                GL.Color3(camera == Document.Map.ActiveCamera ? Color.Red : Color.Cyan);
                Coord(p2 - (dir - cp) * multiplier);
                Coord(p2 - (dir + cp) * multiplier);
                Coord(p2 + dir * 1.5m * multiplier);
                GL.End();
            }

            GL.Disable(EnableCap.PolygonSmooth);

            GL.Begin(BeginMode.Lines);

            foreach (var camera in cams)
            {
                var p1 = vp.Flatten(camera.EyePosition);
                var p2 = vp.Flatten(camera.LookPosition);

                var multiplier = 4 / vp.Zoom;
                var dir        = (p2 - p1).Normalise();
                var cp         = new Coordinate(-dir.Y, dir.X, 0).Normalise();

                GL.Color3(Color.Black);
                GLX.Circle(new Vector2d(p1.DX, p1.DY), 4, z);
                Coord(p2 + dir * 1.5m * multiplier);
                Coord(p2 - (dir + cp) * multiplier);
                Coord(p2 - (dir + cp) * multiplier);
                Coord(p2 - (dir - cp) * multiplier);
                Coord(p2 - (dir - cp) * multiplier);
                Coord(p2 + dir * 1.5m * multiplier);
            }

            GL.End();

            GL.Disable(EnableCap.LineSmooth);
        }
Example #15
0
 public override void MouseUp(ViewportBase viewport, ViewportEvent e)
 {
 }
Example #16
0
 public override void MouseDoubleClick(ViewportBase viewport, ViewportEvent e)
 {
     // Not used
 }
Example #17
0
 public override void Render(ViewportBase viewport)
 {
 }
Example #18
0
 public override void MouseEnter(ViewportBase viewport, ViewportEvent e)
 {
     //
 }
Example #19
0
 public ToolViewportListener(ViewportBase viewport)
 {
     Viewport = viewport;
 }
Example #20
0
 public override void MouseWheel(ViewportBase viewport, ViewportEvent e)
 {
     //
 }
Example #21
0
 public override void MouseLeave(ViewportBase viewport, ViewportEvent e)
 {
     viewport.Cursor = Cursors.Default;
 }
Example #22
0
 public override void UpdateFrame(ViewportBase viewport, FrameInfo frame)
 {
     //
 }
Example #23
0
 private bool WidgetAction(Action <Widget, ViewportBase, ViewportEvent> action, ViewportBase viewport, ViewportEvent ev)
 {
     if (_widgets == null)
     {
         return(false);
     }
     foreach (var widget in _widgets)
     {
         action(widget, viewport, ev);
         if (ev != null && ev.Handled)
         {
             return(true);
         }
     }
     return(false);
 }