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(); } }
public override void MouseUp(ViewportBase viewport, ViewportEvent e) { _state = State.None; }
public override void Render(ViewportBase viewport) { WidgetAction((w, vp, ev) => w.Render(vp), viewport, null); base.Render(viewport); }
public override void KeyPress(ViewportBase viewport, ViewportEvent e) { // Nothing }
public override void MouseLeave(ViewportBase viewport, ViewportEvent e) { // }
public override void KeyUp(ViewportBase viewport, ViewportEvent e) { // }
public IEnumerable <MapObject> Order(ViewportBase viewport, IEnumerable <MapObject> mapObjects) { return(mapObjects); }
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; } }
public override void MouseEnter(ViewportBase viewport, ViewportEvent e) { _activeViewport = viewport; }
public override void MouseLeave(ViewportBase viewport, ViewportEvent e) { _activeViewport = null; }
public override void KeyDown(ViewportBase viewport, ViewportEvent e) { }
/// <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; }
public override void UpdateFrame(ViewportBase viewport, FrameInfo frame) { WidgetAction((w, vp, ev) => w.UpdateFrame(vp, frame), viewport, null); base.UpdateFrame(viewport, frame); }
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); }
public override void MouseUp(ViewportBase viewport, ViewportEvent e) { }
public override void MouseDoubleClick(ViewportBase viewport, ViewportEvent e) { // Not used }
public override void Render(ViewportBase viewport) { }
public override void MouseEnter(ViewportBase viewport, ViewportEvent e) { // }
public ToolViewportListener(ViewportBase viewport) { Viewport = viewport; }
public override void MouseWheel(ViewportBase viewport, ViewportEvent e) { // }
public override void MouseLeave(ViewportBase viewport, ViewportEvent e) { viewport.Cursor = Cursors.Default; }
public override void UpdateFrame(ViewportBase viewport, FrameInfo frame) { // }
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); }