Ejemplo n.º 1
0
        private void view1_MouseDown(object sender, MouseButtonEventArgs e)
        {
            bool shift = (Keyboard.IsKeyDown(Key.LeftShift));
            var p = e.GetPosition(view1);

            Vector3D n;
            var source = FindSource(p, out n);
            if (source != null)
            {
                if (shift)
                    vm.Remove(source);
                else
                    vm.Add(source, n);
            }
            else
            {
                var ray = Viewport3DHelper.Point2DtoRay3D(view1.Viewport, p);
                if (ray != null)
                {
                    var pi = ray.PlaneIntersection(new Point3D(0, 0, 0.5), new Vector3D(0, 0, 1));
                    if (pi.HasValue)
                    {
                        var pRound = new Point3D(Math.Round(pi.Value.X), Math.Round(pi.Value.Y),0);
                    //    var pRound = new Point3D(Math.Floor(pi.Value.X), Math.Floor(pi.Value.Y), Math.Floor(pi.Value.Z));
                        //var pRound = new Point3D((int)pi.Value.X, (int)pi.Value.Y, (int)pi.Value.Z);
                        vm.AddVoxel(pRound);
                    }
                }
            }
            UpdatePreview();
            //CaptureMouse();
        }
Ejemplo n.º 2
0
        private void view1_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            var p = e.GetPosition(view1);
            var v = Viewport3DHelper.FindNearestVisual(view1.Viewport, p);

            // Left-clicking with control creates a bounding box around the object
            if (v != null && Keyboard.IsKeyDown(Key.LeftCtrl))
            {
                var rect = Visual3DHelper.FindBounds(v, Transform3D.Identity);
                view1.Children.Add(new BoundingBoxVisual3D()
                {
                    BoundingBox = rect
                });
                return;
            }

            // Left-clicking adds a blue sphere at the nearest hit point
            var pt = Viewport3DHelper.FindNearestPoint(view1.Viewport, p);

            if (pt.HasValue)
            {
                view1.Children.Add(new SphereVisual3D()
                {
                    Center = pt.Value, Radius = 0.03
                });
            }
        }
Ejemplo n.º 3
0
        private HitTestResultBehavior HitTestCallback(HitTestResult result)
        {
            RayMeshGeometry3DHitTestResult rayHit = result as RayMeshGeometry3DHitTestResult;
            ProjectionCamera      camera          = _viewport3D.Viewport.Camera as ProjectionCamera;
            HitTestResultBehavior result2;

            if (rayHit != null && rayHit.ModelHit != null)
            {
                Model3D  model    = rayHit.ModelHit;
                Visual3D visual3D = rayHit.VisualHit;
                if (visual3D != null)
                {
                    if (string.Compare(Convert.ToString(visual3D.GetValue(FrameworkElement.NameProperty)), "CurveVisual") != 0)
                    {
                        result2 = HitTestResultBehavior.Continue;
                        return(result2);
                    }
                }
                MeshGeometry3D mesh = rayHit.MeshHit;
                if (mesh != null)
                {
                    Point3D p  = mesh.Positions[rayHit.VertexIndex1];
                    Point3D p2 = mesh.Positions[rayHit.VertexIndex2];
                    Point3D p3 = mesh.Positions[rayHit.VertexIndex3];
                    double  x  = p.X * rayHit.VertexWeight1 + p2.X * rayHit.VertexWeight2 + p3.X * rayHit.VertexWeight3;
                    double  y  = p.Y * rayHit.VertexWeight1 + p2.Y * rayHit.VertexWeight2 + p3.Y * rayHit.VertexWeight3;
                    double  z  = p.Z * rayHit.VertexWeight1 + p2.Z * rayHit.VertexWeight2 + p3.Z * rayHit.VertexWeight3;

                    // point in local coordinates
                    Point3D localPoint = new Point3D(x, y, z);
                    Point3D p4         = localPoint;

                    // transform to global coordinates

                    // first transform the Model3D hierarchy
                    GeneralTransform3D t2 = Viewport3DHelper.GetTransform(rayHit.VisualHit, rayHit.ModelHit);
                    if (t2 != null)
                    {
                        p4 = t2.Transform(p4);
                    }

                    // then transform the Visual3D hierarchy up to the Viewport3D ancestor
                    GeneralTransform3D t3 = Viewport3DHelper.GetTransform(_viewport3D.Viewport, rayHit.VisualHit);
                    if (t3 != null)
                    {
                        p4 = t3.Transform(p4);
                    }
                    double distance = (camera.Position - p4).LengthSquared;
                    if (distance < _minimumDistance)
                    {
                        _minimumDistance = distance;
                        _nearestPt       = localPoint;
                        _nearestNormal   = Vector3D.CrossProduct(p2 - p, p3 - p);
                        _rayhit          = rayHit;
                    }
                }
            }
            result2 = HitTestResultBehavior.Continue;
            return(result2);
        }
Ejemplo n.º 4
0
        void UpdatePreview()
        {
            var      p     = Mouse.GetPosition(view1);
            bool     shift = (Keyboard.IsKeyDown(Key.LeftShift));
            Vector3D n;
            var      source = FindSource(p, out n);

            if (shift)
            {
                vm.PreviewCursorVoxel(null);
                vm.HighlightVoxel(source);
            }
            else
            {
                if (source != null)
                {
                    vm.PreviewCursorVoxel(source, n);
                }
                else
                {
                    var ray = Viewport3DHelper.Point2DtoRay3D(view1.Viewport, p);
                    if (ray != null)
                    {
                        var pi = ray.PlaneIntersection(new Point3D(0, 0, 0.5), new Vector3D(0, 0, 1));
                        if (pi.HasValue)
                        {
                            var pRound = new Point3D(Math.Round(pi.Value.X), Math.Round(pi.Value.Y), 0);
                            vm.PreviewVoxel(pRound, true);
                        }
                    }
                }
                vm.HighlightVoxel(null);
            }
        }
        private Point3D GetPosition(Point mousePosition)
        {
            var rayPosition  = Viewport3DHelper.Point2DtoRay3D(view.Viewport, mousePosition);
            var tempPosition = rayPosition.PlaneIntersection(new Point3D(0, 0, 0.5), new Vector3D(0, 0, 1));
            var position     = new Point3D(Math.Ceiling(tempPosition.Value.X - grid.xOffset), Math.Ceiling(tempPosition.Value.Y - grid.yOffset), 0);

            return(position);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// The composition target rendering.
        /// </summary>
        /// <param name="sender">
        /// The sender.
        /// </param>
        /// <param name="e">
        /// The e.
        /// </param>
        private void CompositionTargetRendering(object sender, EventArgs e)
        {
            var matrix = Viewport3DHelper.GetTotalTransform(this.view1.Viewport);

            foreach (FrameworkElement element in this.overlay1.Children)
            {
                var position   = Overlay.GetPosition3D(element);
                var position2D = matrix.Transform(position);
                Canvas.SetLeft(element, position2D.X - element.ActualWidth / 2);
                Canvas.SetTop(element, position2D.Y - element.ActualHeight / 2);
            }
        }
Ejemplo n.º 7
0
        private void BtnExport_Click(object sender, RoutedEventArgs e)
        {
            var d = new SaveFileDialog();

            d.Filter     = Exporters.Filter;
            d.DefaultExt = Exporters.DefaultExtension;
            if (!d.ShowDialog().Value)
            {
                return;
            }

            Viewport3DHelper.Export(viewport3D, d.FileName);
        }
Ejemplo n.º 8
0
        private void OpenOctane_Click(object sender, RoutedEventArgs e)
        {
            var filename = "octanetest.obj";

            Viewport3DHelper.Export(view1.Viewport, filename);
            var fullPath = Path.GetFullPath(filename);

            var os = new OctaneLauncher {
                MeshNode = filename, MeshFile = fullPath, ProjectFile = "octanetest.ocs"
            };

            os.SetCamera(view1.Viewport.Camera as ProjectionCamera);
            os.Start();
        }
Ejemplo n.º 9
0
 private void View2Loaded(object sender, RoutedEventArgs e)
 {
     if (_firstTime2)
     {
         _firstTime2 = false;
         // add visuals for all lights in the scene
         foreach (Light light in Viewport3DHelper.GetLights(view2.Viewport))
         {
             view2.Children.Add(new LightVisual3D {
                 Light = light
             });
         }
     }
 }
Ejemplo n.º 10
0
        Model3D FindSource(Point p, out Vector3D normal)
        {
            var hits = Viewport3DHelper.FindHits(view1.Viewport, p);

            foreach (var h in hits)
            {
                if (h.Model == vm.PreviewModel)
                    continue;
                normal = h.Normal;
                return h.Model;
            }

            normal = new Vector3D();
            return null;
        }
Ejemplo n.º 11
0
        private void OpenKerkythea_Click(object sender, RoutedEventArgs e)
        {
            Cursor = Cursors.Wait;
            var input  = "kerkytheatest.xml";
            var output = "kerkytheatest.png";

            Viewport3DHelper.Export(view1.Viewport, input);
            var ktl = new KerkytheaLauncher {
                InputFile = input, OutputFile = output
            };
            var p = ktl.Start();

            p.WaitForExit();
            Process.Start(output);
            Cursor = Cursors.Arrow;
        }
Ejemplo n.º 12
0
        private void Explode()
        {
            var pos  = Mouse.GetPosition(view1);
            var hits = Viewport3DHelper.FindHits(view1.Viewport, pos);

            if (hits.Count > 0)
            {
                var mesh   = hits[0].Mesh;
                var model  = hits[0].Model as GeometryModel3D;
                var hitpos = hits[0].Position;

                var explodingMesh = new ExplodingMesh(mesh, hitpos);
                model.Geometry = explodingMesh.Mesh;
                explodingMeshes.Add(explodingMesh);
            }
        }
Ejemplo n.º 13
0
        private void HViewport3D_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Point mouse2DPositionOnViewport = e.GetPosition(HViewport3D);

            //var nearestVisual = Viewport3DHelper.FindNearestVisual(Viewport3D.Viewport, mouse2DPositionOnViewport);
            //if (nearestVisual != null && Keyboard.IsKeyDown(Key.LeftCtrl))
            //{
            //    var rect = Visual3DHelper.FindBounds(nearestVisual, Transform3D.Identity);
            //    Viewport3D.Children.Add(new BoundingBoxVisual3D() { BoundingBox = rect });
            //    return;
            //}

            Point3D?clickPositionOnModel = Viewport3DHelper.FindNearestPoint(HViewport3D.Viewport, mouse2DPositionOnViewport);

            if (clickPositionOnModel.HasValue)
            {
                RequestAddModel(clickPositionOnModel.Value);
            }
        }
Ejemplo n.º 14
0
        private void Export_Click(object sender, RoutedEventArgs e)
        {
            var d = new SaveFileDialog();

            d.Filter     = Exporters.Filter;
            d.DefaultExt = Exporters.DefaultExtension;
            if (!d.ShowDialog().Value)
            {
                return;
            }

            Viewport3DHelper.Export(viewport.Viewport, d.FileName);

            //using (var exporter = new KerkytheaExporter(d.FileName))
            //{
            //    var m1 = this.Resources["m1"] as Material;
            //    exporter.RegisterMaterial(m1, @"Materials\water.xml");
            //    exporter.Export(view1.Viewport);
            //}
        }
Ejemplo n.º 15
0
        protected override CollisionMask OnInitialise(World world)
        {
            if (_visual != null)
            {
                DependencyObject parent = VisualTreeHelper.GetParent(_visual);
                if (parent == null)
                {
                    throw new InvalidOperationException("The Visual3D is not currently connected to a Viewport.");
                }

                VisualMatrix = MathUtils.GetTransformToWorld(_visual);

                if (!(parent is Viewport3DVisual))
                {
                    ModelVisual3D parentModel = (parent as ModelVisual3D);
                    if (parentModel == null)
                    {
                        throw new InvalidOperationException("The Visual3D does not belong to a ModelVisual3D.");
                    }

                    if (!(this is INullBody))
                    {
                        Viewport3DVisual viewport = Viewport3DHelper.GetViewportVisual(_visual);
                        parentModel.Children.Remove(_visual);
                        viewport.Children.Add(_visual);
                    }
                }

                _visual.Transform = VisualTransform;

                return(OnInitialise(VisualMatrix));
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 16
0
        private void viewPort3d_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            var Hits = Viewport3DHelper.FindHits(viewPort3d.Viewport, e.GetPosition(viewPort3d.Viewport));

            if (Hits.Count > 0)
            {
                var FirstHit = Hits[0].Visual;
                {
                    if (FirstHit is PointsVisual3D)
                    {
                        if (FirstHit != LastPoint3D)
                        {
                            if (LastPoint3D != null)
                            {
                                LastPoint3D.Color = Colors.White;
                            }

                            LastPoint3D       = FirstHit as PointsVisual3D;
                            LastPoint3D.Color = Colors.LightGreen;
                            return;
                        }
                        else
                        {
                            return;
                        }
                    }
                }
            }

            // If no valid points were found, set the last point's color to white
            if (LastPoint3D != null)
            {
                LastPoint3D.Color = Colors.White;
                LastPoint3D       = null;
            }
        }
Ejemplo n.º 17
0
        public TranslatePartGizmo(Viewport3D viewport)
        {
            this.viewport = viewport;
            x             = new TranslatePartVisual3D();
            y             = new TranslatePartVisual3D();
            x1            = new TranslationVisual3D(new Point3D(0, 0, 0), new Vector3D(1, 0, 0));
            y1            = new TranslationVisual3D(new Point3D(0, 0, 0), new Vector3D(1, 0, 0));
            x2            = new TranslationVisual3D(new Point3D(0, 0, 0), new Vector3D(-1, 0, 0));
            y2            = new TranslationVisual3D(new Point3D(0, 0, 0), new Vector3D(-1, 0, 0));

            containerX = new ContainerUIElement3D();
            containerX.Children.Add(x);
            containerY = new ContainerUIElement3D();
            containerY.Children.Add(y);

            containerX1 = new ContainerUIElement3D();
            containerY1 = new ContainerUIElement3D();
            containerX1.Children.Add(x1);
            containerY1.Children.Add(y1);

            containerX2 = new ContainerUIElement3D();
            containerY2 = new ContainerUIElement3D();
            containerX2.Children.Add(x2);
            containerY2.Children.Add(y2);



            x.Material  = new DiffuseMaterial(Brushes.LightCoral.MakeTransparent(0.6));
            y.Material  = new DiffuseMaterial(Brushes.LightSkyBlue.MakeTransparent(0.6));
            x1.Material = new DiffuseMaterial(Brushes.Red);
            y1.Material = new DiffuseMaterial(Brushes.Blue);
            x2.Material = new DiffuseMaterial(Brushes.Red);
            y2.Material = new DiffuseMaterial(Brushes.Blue);

            var scales     = new[] { x, y };
            var containers = new[] { containerX, containerY };

            for (int i = 0; i < 2; i++)
            {
                int iCopy     = i;
                var scale     = scales[i];
                var container = containers[i];
                var curMat    = scale.Material;
                container.MouseEnter += (sender, args) =>
                {
                    scale.Material = new DiffuseMaterial(Brushes.Yellow);
                };
                container.MouseLeave += (sender, args) =>
                {
                    scale.Material = curMat;
                };
                container.MouseDown += (sender, args) =>
                {
                    Mouse.Capture(container);
                    whichAxis    = iCopy + 1;
                    lastPosition = args.GetPosition(container);
                };
                container.MouseMove += (sender, args) =>
                {
                    if (whichAxis != 0)
                    {
                        Point curPosition = args.GetPosition(container);
                        //  double dy = Math.Pow(2,(curPosition.Y - lastPosition.Y)/200);
                        //  double dx = Math.Pow(2, (curPosition.X - lastPosition.X)/200);

                        Point screenCenter = viewport.Point3DtoPoint2D(center);
                        Viewport3DHelper.Point3DtoPoint2D(viewport, center);
                        Vector sX = viewport.Point3DtoPoint2D(center + xAxis) - screenCenter;
                        Vector sY = viewport.Point3DtoPoint2D(center + yAxis) - screenCenter;

                        ScaleTransform scaling = null;
                        if (whichAxis == 1)
                        {
                            //scale along x
                            Vector offset = curPosition - lastPosition;
                            double proj   = sX * offset / sX.Length;
                            scaling = new ScaleTransform(0.4 * proj, 0);
                        }
                        else if (whichAxis == 2)
                        {
                            //scale along y
                            Vector offset = curPosition - lastPosition;
                            double proj   = sY * offset / sY.Length;
                            scaling = new ScaleTransform(0, 0.4 * proj);
                        }


                        if (Scaled != null)
                        {
                            Scaled(scaling);
                        }

                        lastPosition = curPosition;
                    }
                };
                container.MouseUp += (sender, args) =>
                {
                    Mouse.Capture(null);
                    whichAxis = 0;
                };
            }
        }
Ejemplo n.º 18
0
 /// <summary>
 ///   Projects the point on the hit plane.
 /// </summary>
 /// <param name="p">
 ///   The p.
 /// </param>
 /// <param name="hitPlaneOrigin">
 ///   The hit Plane Origin.
 /// </param>
 /// <param name="hitPlaneNormal">
 ///   The hit plane normal (world coordinate system).
 /// </param>
 /// <returns>
 ///   The point in world coordinates.
 /// </returns>
 protected virtual Point3D?GetHitPlanePoint(Point p, Point3D hitPlaneOrigin, Vector3D hitPlaneNormal)
 {
     return(Viewport3DHelper.UnProject(ParentViewport, p, hitPlaneOrigin, hitPlaneNormal));
 }
        /// <summary>
        /// Handle Mouse Move when the Mouse is in the 3D View.
        /// </summary>
        /// <param name="sender">The Sender.</param>
        /// <param name="e">The MouseEventArgs.</param>
        private void ViewPort_MouseMove(object sender, MouseEventArgs e)
        {
            if (!ViewModel.ShowHoveredElement)
            {
                return;
            }

            var maxValue      = Math.Tan((ViewPort.Camera as PerspectiveCamera).FieldOfView * 0.5 * ExtensionMethods.DegreeToRadians);
            var width         = ViewPort.ActualWidth;
            var height        = ViewPort.ActualHeight;
            var aspectRatio   = height / width;
            var mousePosition = e.GetPosition(ViewPort);
            var xValue        = mousePosition.X / width * 2 * maxValue - maxValue;
            var yValue        = (height - mousePosition.Y) / height * maxValue - 0.5;
            var ray           = Camera.GetRay3D(xValue, yValue);

            var material = MaterialHelper.CreateMaterial(new SolidColorBrush(Colors.Orange), 1, 128, 255, false);

            MaterialHelper.ChangeOpacity(material, 0.5);

            var hitElements = Viewport3DHelper.FindHits(ViewPort.Viewport, mousePosition)
                              .Where(el => ViewModel.AddedSceneElements.Select(ae => ae.Visual3D).Contains(el.Visual));

            if (hitElements.Count() > 0)
            {
                var hitElement = hitElements.First().Visual;
                if (hitElement == ViewPort.Children.Last())
                {
                    return;
                }
                else if (ViewModel.HoveredElement != null)
                {
                    RemoveHoveredElement();
                }

                if (hitElement is MeshVisual3D)
                {
                    ViewModel.HoveredElement = new MeshVisual3D()
                    {
                        Mesh             = (hitElement as MeshVisual3D).Mesh,
                        FaceMaterial     = material,
                        FaceBackMaterial = material,
                        Transform        = hitElement.Transform,
                        EdgeDiameter     = 0,
                        VertexRadius     = 0
                    }
                }
                ;
                else if (hitElement is MeshGeometryVisual3D)
                {
                    ViewModel.HoveredElement = new MeshGeometryVisual3D()
                    {
                        MeshGeometry = (hitElement as MeshGeometryVisual3D).MeshGeometry,
                        Material     = material,
                        BackMaterial = material,
                        Transform    = hitElement.Transform,
                    };
                }

                if (ViewModel.HoveredElement != null)
                {
                    ViewPort.Children.Add(ViewModel.HoveredElement);
                }
            }
            else
            {
                RemoveHoveredElement();
            }

            ViewPort.DebugInfo = $"Origin: {ray.Origin.ToString(3)}, Direction: {ray.Direction.ToString(3)}";
        }