Ejemplo n.º 1
0
        private static Model3DGroup CreateAxisAndArrowHead(RotateTransform3D rotateTransform, TranslateTransform3D translateTransform, Material material)
        {
            Model3DGroup      model3Dgroup      = new Model3DGroup();
            Model3DCollection model3Dcollection = new Model3DCollection();

            model3Dgroup.Children = model3Dcollection;
            Model3DGroup cylinder = Cylinder.CreateCylinder(0.02, 0.5, 12, material, material, (Material)null);

            if (rotateTransform != null)
            {
                cylinder.Transform = (Transform3D)rotateTransform;
            }
            model3Dgroup.Children.Add((Model3D)cylinder);
            Model3DGroup cone = Cone.CreateCone(0.04, 0.1, 12, material, material);

            if (rotateTransform != null)
            {
                cone.Transform = (Transform3D) new Transform3DGroup()
                {
                    Children =
                    {
                        (Transform3D)rotateTransform,
                        (Transform3D)translateTransform
                    }
                }
            }
            ;
            else
            {
                cone.Transform = (Transform3D)translateTransform;
            }
            model3Dgroup.Children.Add((Model3D)cone);
            model3Dgroup.Freeze();
            return(model3Dgroup);
        }
Ejemplo n.º 2
0
        private Model3DCollection Create_Sbox()
        {
            Model3DCollection col = new Model3DCollection();
            double            offsetX = 7, offsetY = 3, offsetZ = -7, scale = 1.9;

            for (int r = 0; r < 16; r++)
            {
                for (int a = 0; a < 4; a++)
                {
                    gma3D_sbox[r, a] = eBuilder.CreateCube(0.5, new Point3D(offsetX + a / scale, offsetY - r / scale, offsetZ));
                    col.Add(gma3D_sbox[r, a]);
                }

                for (int b = 0; b < 4; b++)
                {
                    gma3D_sbox[r, b + 4] = eBuilder.CreateCube(0.5, new Point3D(offsetX + (b + 5) / scale, offsetY - r / scale, offsetZ));
                    col.Add(gma3D_sbox[r, b + 4]);
                }
                GeometryModel3D ar = eBuilder.CreateArrowRight(0.3, 0.2, new Point3D(offsetX + 4.35 / scale, offsetY - r / scale, offsetZ), Colors.Blue, 0.6);
                col.Add(ar);
            }
            GeometryModel3D lblsbox = eBuilder.CreateLabel(4, 2, new Point3D(offsetX, offsetY + 2, offsetZ), Colors.Transparent, "S-Box", Colors.Black, 1);

            col.Add(lblsbox);
            return(col);
        }
Ejemplo n.º 3
0
        public LotEditorItemMarker CreateGeometry()
        {
            LotEditorItemMarker   marker = new LotEditorItemMarker(this);
            Model3DCollection     coll   = new Model3DCollection();
            TruncatedConeVisual3D cone   = new TruncatedConeVisual3D();

            cone.Height             = 2.5;
            cone.BaseRadius         = 0;
            cone.TopRadius          = 1;
            cone.Material           = MaterialHelper.CreateMaterial(Brushes.Red, new SolidColorBrush(Color.FromScRgb(1f, 0.2f, 0.0f, 0f)));
            marker.ManipulatorModel = cone.Model;
            marker.Transform        = new MatrixTransform3D(this.Transform.GetAsMatrix3D());
            ModelRepresentation     = marker;

            BillboardTextVisual3D billboard = new BillboardTextVisual3D();

            billboard.Text       = Index.ToString();
            billboard.Background = Brushes.White;
            billboard.Transform  = new TranslateTransform3D(0, 0, 5);

            marker.Children.Add(billboard);


            return(marker);
        }
Ejemplo n.º 4
0
        private Model3DCollection Create_Label()
        {
            Point3D           pos;
            Material          mat;
            GeometryModel3D   num;
            Model3DCollection col = new Model3DCollection();

            for (int i = 0; i < 80; i++)
            {
                pos    = GetRingPos(i);
                pos.Y -= 0.3;
                mat    = new DiffuseMaterial(new VisualBrush(new TextBlock()
                {
                    Text = i.ToString(), Background = new SolidColorBrush(Colors.Transparent), Foreground = new SolidColorBrush(Colors.Black), Padding = new Thickness(1)
                })
                {
                    Stretch = Stretch.Uniform
                });
                num = eBuilder.CreateCubeLabel(0.3, pos, mat);
                double            a  = Math.Atan2((parent.KS_Cam.Position.X - pos.X), (parent.KS_Cam.Position.Z - pos.Z)) / Math.PI * 180;
                RotateTransform3D rt = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), a), pos);
                num.Transform = rt;
                col.Add(num);
            }
            return(col);
        }
Ejemplo n.º 5
0
        private void btnOpenSandbox_Click(object sender, RoutedEventArgs e)
        {
            var ofd = new OpenFileDialog();

            if ((bool)ofd.ShowDialog())
            {
                var h3 = new Halo3(ofd.FileName);
                lblSandboxPath.Text = ofd.FileName;

                var container = new Model3DCollection();
                foreach (var placedObject in h3.SandboxObjects.Where(placedObject => placedObject.TagIndex != -1))
                {
                    // Try to load Model
                    if (placedObject.TagEntry.Tag.TagPath.Contains("spawning"))
                    {
                    }

                    string gameAssetPath;
                    try
                    {
                        gameAssetPath = VariousFunctions.GetGameAsset(Halo3.GameId, placedObject.TagEntry.Tag.TagPath);
                    }
                    catch (FileNotFoundException)
                    {
                        ActionLog.AddEntry("Missing Game Asset");
                        continue;
                    }

                    var model = (Model3D)ModelImporter.Load(gameAssetPath);
                    model.Transform = CreateTransformGroup(placedObject);
                    container.Add(model);
                }

                ModelViewport.Children.Clear();
                ModelViewport.Children.Add(new GridLines());
                foreach (var model in container)
                {
                    ModelViewport.Children.Add(new ModelVisual3D
                    {
                        Content = model
                    });
                }
                var light        = new LightVisual3D();
                var ambientLight = new AmbientLight(Colors.WhiteSmoke)
                {
                    Transform = new MatrixTransform3D(new Matrix3D
                    {
                        OffsetX = 0,
                        OffsetY = 0,
                        OffsetZ = 100
                    })
                };
                light.Content = ambientLight;
                ModelViewport.Children.Add(light);

                ModelViewport.ShowCameraInfo = true;
                ModelViewport.ZoomExtents();
                ModelViewport.IsHeadLightEnabled = true;
            }
        }
Ejemplo n.º 6
0
        private void CreateArea(RoamArea area)
        {
            Model3DGroup group = Model as Model3DGroup;

            Model3DCollection collection = new Model3DCollection();
            if (_mapping.ContainsKey(area))
            {
                foreach (Model3D model in _mapping[area])
                {
                    group.Children.Remove(model);
                }
            }

            foreach (var vertex in area.Vertices)
            {
                MeshBuilder builder = new MeshBuilder();
                Point3D p1 = new Point3D(vertex.X, vertex.Y, area.MaxZ);
                Point3D p2 = new Point3D(vertex.X, vertex.Y, area.MinZ);

                //if (Clipping != null && !Clipping.DrawPoint(p)) continue;

                builder.AddBox(p1, 4, 4, 4);
                builder.AddBox(p2, 4, 4, 4);
                builder.AddPipe(p1, p2, 1.5, 1.5, 50);

                GeometryModel3D box = new GeometryModel3D(builder.ToMesh(), Materials.Yellow);
                collection.Add(box);

                builder = new MeshBuilder();

                Point3D next = new Point3D();
                if (vertex == area.Vertices.Last())
                {
                    next.X = area.Vertices[0].X;
                    next.Y = area.Vertices[0].Y;
                }
                else
                {
                    next.X = area.Vertices.ElementAt(area.Vertices.IndexOf(vertex) + 1).X;
                    next.Y = area.Vertices.ElementAt(area.Vertices.IndexOf(vertex) + 1).Y;
                }
                Point3D n1 = new Point3D(next.X, next.Y, area.MaxZ);
                Point3D n2 = new Point3D(next.X, next.Y, area.MinZ);

                //builder.AddPipe(p1, p2);
                builder.AddPipe(p1, n1, 0.5, 0.5, 50);
                builder.AddPipe(p2, n2, 0.5, 0.5, 50);
                collection.Add(new GeometryModel3D(builder.ToMesh(), Materials.Yellow));

            }

            _mapping[area] = collection;
            foreach (Model3D model in collection)
            {
                group.Children.Add(model);
            }
        }
        // http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Components-PostAttachments/00-04-01-86-12/SceneSortingHelper_2E00_cs

        /// <summary>
        /// Sort Modelgroups in Farthest to Closest order, to enable transparency
        /// Should be applied whenever the scene is significantly re-oriented
        /// </summary>
        public static void AlphaSort(Point3D cameraPosition, Model3DCollection models, Transform3D worldTransform)
        {
            var sortedList = models.OrderBy(model => Point3D.Subtract(cameraPosition, worldTransform.Transform(model.Bounds.Location)).Length);
            models.Clear();
            foreach (var model in sortedList)
            {
                models.Add(model);
            }
        }
Ejemplo n.º 8
0
        // clears model without deleting light objects
        public void clearModel(Model3DCollection models)
        {
            Model3D light1 = models[0];
            Model3D light2 = models[1];

            models.Clear();
            models.Add(light1);
            models.Add(light2);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Creates on empty collection for the viewport.
        /// </summary>
        protected void CreateEmptyCollection()
        {
            _collection     = new Model3DCollection();
            _group          = new Model3DGroup();
            _group.Children = _collection;
            var mw3 = new ModelVisual3D();

            mw3.Content = _group;
            _viewPort.Children.Add(mw3);
        }
Ejemplo n.º 10
0
        // http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Components-PostAttachments/00-04-01-86-12/SceneSortingHelper_2E00_cs

        /// <summary>
        /// Sort Modelgroups in Farthest to Closest order, to enable transparency
        /// Should be applied whenever the scene is significantly re-oriented
        /// </summary>
        public static void AlphaSort(Point3D cameraPosition, Model3DCollection models, Transform3D worldTransform)
        {
            var sortedList = models.OrderBy(model => Point3D.Subtract(cameraPosition, worldTransform.Transform(model.Bounds.Location)).Length);

            models.Clear();
            foreach (var model in sortedList)
            {
                models.Add(model);
            }
        }
Ejemplo n.º 11
0
        private static string Model3DCollectionToString(Model3DCollection models, string indent)
        {
            string result = string.Empty;

            foreach (Model3D model in models)
            {
                result += Model3DToString(model, indent) + "\r\n";
            }
            return(result);
        }
Ejemplo n.º 12
0
        private static Model3DCollection MakeModelCollection(Variation v, string namePrefix)
        {
            // Meta-symbology:
            //  { }* == Klene star, or 0 or more occurrances of the stuff inside the brackets
            //  { }? == Optional, the stuff inside the brackets may or may not exist
            //  < >  == Description of what's parsed, the stuff inside the brackets is not a literal string

            // You can specify up to 10 children per model group (0-9)
            // namePrefix has format:  "Child{n}*"

            Model3DCollection collection = new Model3DCollection();

            for (int i = 0; i < 10; i++)
            {
                string modelName  = namePrefix + i.ToString();
                string modelValue = v[modelName];
                if (modelValue == null)
                {
                    break;
                }

                string materialName     = modelName.Replace("Child", "Material");
                string backMaterialName = modelName.Replace("Child", "BackMaterial");
                string transformName    = modelName.Replace("Child", "ModelTransform");

                try
                {
                    Model3D model = ModelFactory.MakeModel(modelValue);
                    if (model is GeometryModel3D)
                    {
                        Material front = MakeMaterial(v, materialName);
                        Material back  = MakeMaterial(v, backMaterialName);
                        if (front != null)
                        {
                            ((GeometryModel3D)model).Material = front;
                        }
                        ((GeometryModel3D)model).BackMaterial = back;
                    }
                    model.Transform = TransformFactory.MakeTransform(v[transformName]);

                    if (model is Model3DGroup && v[modelName + "0"] != null)
                    {
                        ((Model3DGroup)model).Children = MakeModelCollection(v, modelName);
                    }
                    collection.Add(model);
                }
                catch (ArgumentException)
                {
                    throw new ApplicationException("Confused by attribute (" + modelName + " = " + modelValue + ")");
                }
            }

            return(collection);
        }
Ejemplo n.º 13
0
        public Model3DCollection GetModel3D()
        {
            var Model = new Model3DCollection();

            foreach (var seg in this)
            {
                Model.Add(new GeometryModel3D {
                    Geometry = seg.Model, Material = Material
                });
            }
            return(Model);
        }
Ejemplo n.º 14
0
        private Model3DCollection Create_Ring()
        {
            Model3DCollection col  = new Model3DCollection();
            double            size = 0.3;

            for (int i = 0; i < 80; i++)
            {
                gma3D_keyreg[i] = eBuilder.CreateCube(size, GetRingPos(i));
                col.Add(gma3D_keyreg[i]);
            }
            return(col);
        }
Ejemplo n.º 15
0
        private Model3DCollection Create_State()
        {
            Model3DCollection col = new Model3DCollection();

            for (int i = 63; i >= 0; i--)
            {
                gma3D_state[i]     = eBuilder.CreateCube(0.8, GetCubePos(i));
                gma3D_statetemp[i] = eBuilder.CreateCube(0.8, GetCubePos(i), null);
                col.Add(gma3D_statetemp[i]);
                col.Add(gma3D_state[i]);
            }
            return(col);
        }
Ejemplo n.º 16
0
 public void Redraw(Model3DCollection geometry)
 {
     geometry.Clear();
     for (var i = 0; i < 3; i++)
     {
         for (var j = 0; j < 3; j++)
         {
             for (var k = 0; k < 3; k++)
             {
                 geometry.Add(_cubicles[i, j, k].GetGeometry(i, j, k));
             }
         }
     }
 }
Ejemplo n.º 17
0
 public static bool Transform(this Visual3D v3d, Func<Point3D, Point3D> pt,
     Func<System.Windows.Media.Media3D.Vector3D, System.Windows.Media.Media3D.Vector3D> vt)
 {
     if (v3d is ModelVisual3D)
     {
         ModelVisual3D m3d = v3d as ModelVisual3D;
         object ob = m3d.Content;
         if (ob != null)
         {
             GeometryModel3D geom = null;
             if (ob is GeometryModel3D)
             {
                 geom = ob as GeometryModel3D;
             }
             else if (ob is Model3DGroup)
             {
                 Model3DGroup gr = ob as Model3DGroup;
                 Model3DCollection ch = gr.Children;
                 foreach (object o in ch)
                 {
                     if (o is GeometryModel3D)
                     {
                         geom = o as GeometryModel3D;
                         break;
                     }
                 }
             }
             if (geom != null)
             {
                 Geometry3D g3d = geom.Geometry;
                 if (g3d is MeshGeometry3D)
                 {
                     MeshGeometry3D mesh = g3d as MeshGeometry3D;
                     mesh.Transform(pt, vt);
                 }
             }
         }
         else
         {
             foreach (Visual3D vtd in m3d.Children)
             {
                 if (vtd.Transform(pt, vt)) ;
                 {
                     return true;
                 }
             }
         }
     }
     return false;
 }
Ejemplo n.º 18
0
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var engines = value as IEnumerable<EngineViewModel>;
            if (engines == null)
                return null;

            var collection = new Model3DCollection();
            foreach (var engine in engines)
            {
                collection.Add(ConvertOne(engine));
            }

            return collection;
        }
Ejemplo n.º 19
0
        public void LoadPreview3D()
        {
            PointCloudTileSource tileSource = CurrentTileSource;

            Jacere.Core.Geometry.Extent3D extent = tileSource.Extent;

            Model3DGroup modelGroup = new Model3DGroup();

            Model3DGroup modelSubGroup = new Model3DGroup();

            modelGroup.Children.Add(modelSubGroup);

            Model3DGroup modelStitchingGroup = new Model3DGroup();

            modelGroup.Children.Add(modelStitchingGroup);

            DirectionalLight lightSource = new DirectionalLight(System.Windows.Media.Colors.White, new Vector3D(-1, -1, -1));

            modelGroup.Children.Add(lightSource);

            ModelVisual3D model = new ModelVisual3D();

            model.Content = modelGroup;

            Jacere.Core.Geometry.Point3D centerOfMass = tileSource.CenterOfMass;
            Point3D  lookatPoint   = new Point3D(0, 0, 0);
            Point3D  cameraPoint   = new Point3D(0, extent.MinY - centerOfMass.Y, centerOfMass.Z - extent.MinZ + extent.RangeX);
            Vector3D lookDirection = lookatPoint - cameraPoint;

            lookDirection.Normalize();

            PerspectiveCamera camera = new PerspectiveCamera();

            camera.Position      = cameraPoint;
            camera.LookDirection = lookDirection;
            camera.UpDirection   = new Vector3D(0, 0, 1);
            camera.FieldOfView   = 70;

            RenderOptions.SetEdgeMode(viewport, EdgeMode.Aliased);
            //viewport.ClipToBounds = false;
            //viewport.IsHitTestVisible = false;

            viewport.Camera = camera;
            viewport.Children.Add(model);

            m_tileModelCollection      = modelSubGroup.Children;
            m_stitchingModelCollection = modelStitchingGroup.Children;

            m_backgroundWorker.RunWorkerAsync(CurrentTileSource);
        }
Ejemplo n.º 20
0
        private void UpdateInit()
        {
            Circle3D circle3d = generalFiguresList[iterator] as Circle3D;

            if (circle3d != null)
            {
                figureName = "circle";
            }

            Rectangle3D rectangle3d = generalFiguresList[iterator] as Rectangle3D;

            if (rectangle3d != null)
            {
                if (rectangle3d.figureType == 3)
                {
                    figureName = "triang";
                }
                else
                {
                    figureName = "rectan";
                }
            }

            Custom3D custom3d = generalFiguresList[iterator] as Custom3D;

            if (custom3d != null)
            {
                figureName = "custom";
            }

            string modelName = string.Concat(comboBox.SelectedItem.ToString(), figureName);

            int it = 0;
            Model3DCollection model3Ds = model3DGroup.Children;

            foreach (Model3D t in model3Ds)
            {
                if (t.GetValue(FrameworkElement.NameProperty).ToString() == modelName)
                {
                    model3Ds.RemoveAt(it);
                    break;
                }
                it++;
            }

            generalFiguresList.RemoveAt(iterator);

            MainWindow.FiguresListChanges();
        }
Ejemplo n.º 21
0
 public static bool Multiply(this Visual3D v3d, double scale)
 {
     if (v3d is ModelVisual3D)
     {
         ModelVisual3D m3d = v3d as ModelVisual3D;
         object ob = m3d.Content;
         if (ob != null)
         {
             GeometryModel3D geom = null;
             if (ob is GeometryModel3D)
             {
                 geom = ob as GeometryModel3D;
             }
             else if (ob is Model3DGroup)
             {
                 Model3DGroup gr = ob as Model3DGroup;
                 Model3DCollection ch = gr.Children;
                 foreach (object o in ch)
                 {
                     if (o is GeometryModel3D)
                     {
                         geom = o as GeometryModel3D;
                         break;
                     }
                 }
             }
             if (geom != null)
             {
                 Geometry3D g3d = geom.Geometry;
                 if (g3d is MeshGeometry3D)
                 {
                     MeshGeometry3D mesh = g3d as MeshGeometry3D;
                     mesh.Multiply(scale);
                 }
             }
         }
         else
         {
             foreach (Visual3D vtd in m3d.Children)
             {
                 if (vtd.Multiply(scale))
                 {
                     return true;
                 }
             }
         }
     }
     return false;
 }
Ejemplo n.º 22
0
        private void ChangeMaterials(Model3DCollection children, Material material)
        {
            foreach (var child in children)
            {
                if (child is GeometryModel3D)
                {
                    ((GeometryModel3D)child).Material = material;
                }

                if (child is Model3DGroup)
                {
                    this.ChangeMaterials(((Model3DGroup)child).Children, material);
                }
            }
        }
        object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            IList<TileViewModel> tileViewModels = value as IList<TileViewModel>;
            //Debug.Assert(tileMappingViewModel != null);

            if (tileViewModels == null)
                return new Model3DCollection();

            Model3DCollection ModelCollection = new Model3DCollection(tileViewModels.Count<TileViewModel>());
            foreach (TileViewModel t in tileViewModels)
            {
                ModelCollection.Add(t.Model);
            }
            return ModelCollection;
        }
Ejemplo n.º 24
0
        //Constructor
        public MainWindowViewModel(IDialogCoordinator dialogCoordinator, Model3DCollection sphereContainer, Model3DCollection detailsSphereContainer)
        {
            // Dialog coordinator provided by Mahapps framework
            // Either passed into MainViewModel constructor to conform to MVVM:-

            _dialogCoordinator          = dialogCoordinator;
            sphereService               = new SphereClientService();
            sphereDrawService           = new SphereDrawService();
            persistanceService          = new PersistanceService();
            this.sphereContainer        = sphereContainer;
            this.detailsSphereContainer = detailsSphereContainer;

            initSpheresFromApplicationState(PersistanceService.getApplicationState().Spheres);

            // if was loaded from state
        }
Ejemplo n.º 25
0
        public static void FiguresListChanges()
        {
            MainWindow mainWindow = Window.GetWindow(Application.Current.MainWindow) as MainWindow;
            ComboBox   comboBox   = (ComboBox)mainWindow.FiguresList3D;

            comboBox.Items.Clear();
            Model3DGroup      model3DGroup = mainWindow.Figures3D;
            Model3DCollection model3Ds     = model3DGroup.Children;

            foreach (GeometryModel3D t in model3Ds)
            {
                string unHandled = t.GetValue(FrameworkElement.NameProperty).ToString();
                string handled   = unHandled.Substring(0, unHandled.Length - 6);
                comboBox.Items.Add(handled);
            }
        }
Ejemplo n.º 26
0
        private Model3DCollection Create_RoundCounter()
        {
            Model3DCollection col = new Model3DCollection();
            Point3D           pos;

            for (int i = 0; i < 5; i++)
            {
                pos = GetRingPos(i + 15);
                gma3D_roundcountertemp[i] = eBuilder.CreateCube(0.3, pos, null);
                col.Add(gma3D_roundcountertemp[i]);
                pos.Y += 1.2;
                gma3D_roundcounter[i] = eBuilder.CreateCube(0.3, pos);
                col.Add(gma3D_roundcounter[i]);
            }
            return(col);
        }
Ejemplo n.º 27
0
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is IEnumerable <Geometry3D> geometries)
            {
                Model3DCollection collection = new Model3DCollection();

                foreach (Geometry3D mesh in geometries)
                {
                    GeometryModel3D model = new GeometryModel3D(mesh, new DiffuseMaterial(Brushes.White));
                    collection.Add(model);
                }

                return(collection);
            }

            return(null);
        }
Ejemplo n.º 28
0
        private Model3DCollection Create_RoundKeyCubes()
        {
            Model3DCollection col = new Model3DCollection();

            for (int r = 31; r >= 0; r--)
            {
                mdc3D_roundkeys[r] = new Model3DCollection();
                mdl3D_roundkey[r]  = new Model3DGroup();
                for (int i = 63; i >= 0; i--)
                {
                    gma3D_roundkeys[r, i] = eBuilder.CreateCube(0.8, GetCubePos(i), null);
                    mdc3D_roundkeys[r].Add(gma3D_roundkeys[r, i]);
                }
                mdl3D_roundkey[r].Children = mdc3D_roundkeys[r];
                col.Add(mdl3D_roundkey[r]);
            }
            return(col);
        }
Ejemplo n.º 29
0
        private static Model3DGroup CreateCube(Vector3D axis, Material material)
        {
            Model3DGroup      model3Dgroup      = new Model3DGroup();
            Model3DCollection model3Dcollection = new Model3DCollection();

            model3Dgroup.Children = model3Dcollection;
            double       num  = -0.04;
            Model3DGroup cube = Cube.CreateCube(new Rect3D(new Point3D(num, num, num), new Size3D(0.08, 0.08, 0.08)), material);

            cube.Transform = (Transform3D) new Transform3DGroup()
            {
                Children =
                {
                    (Transform3D) new TranslateTransform3D(axis * 0.35)
                }
            };
            model3Dgroup.Children.Add((Model3D)cube);
            model3Dgroup.Freeze();
            return(model3Dgroup);
        }
Ejemplo n.º 30
0
        public GeometryModel3D draw(Model3DCollection container, Sphere sphere, int offsetX)
        {
            MeshGeometry3D mesh = new MeshGeometry3D();

            for (int pi = 0; pi <= sphere.getAccurasy(); pi++)
            {
                for (int ti = 0; ti <= sphere.getAccurasy(); ti++)
                {
                    mesh.Positions.Add(new Point3D(sphere.getPoints()[pi, ti].X + offsetX, sphere.getPoints()[pi, ti].Y, sphere.getPoints()[pi, ti].Z));
                    mesh.Normals.Add((Vector3D)sphere.getPoints()[pi, ti]);
                    //mesh.TextureCoordinates.Add(new Point(theta / (2 * Math.PI), phi / (Math.PI)));
                }
            }

            for (int pi = 0; pi < sphere.getAccurasy(); pi++)
            {
                for (int ti = 0; ti < sphere.getAccurasy(); ti++)
                {
                    int x0 = ti;
                    int x1 = (ti + 1);
                    int y0 = pi * (sphere.getAccurasy() + 1);
                    int y1 = (pi + 1) * (sphere.getAccurasy() + 1);

                    mesh.TriangleIndices.Add(x0 + y0);
                    mesh.TriangleIndices.Add(x0 + y1);
                    mesh.TriangleIndices.Add(x1 + y0);

                    mesh.TriangleIndices.Add(x1 + y0);
                    mesh.TriangleIndices.Add(x0 + y1);
                    mesh.TriangleIndices.Add(x1 + y1);
                }
            }

            GeometryModel3D mGeometry = new GeometryModel3D(mesh, new DiffuseMaterial(new SolidColorBrush(sphere.getColor())));

            mGeometry.Transform = new Transform3DGroup();

            container.Add(mGeometry);

            return(mGeometry);
        }
Ejemplo n.º 31
0
        private void InitRect()
        {
            Model3DCollection model3Ds = model3DGroup.Children;

            int index = 0;

            foreach (GeometryModel3D model in model3Ds)
            {
                if (model.GetValue(FrameworkElement.NameProperty).ToString() == name)
                {
                    model3Ds.RemoveAt(index);
                    break;
                }
                index++;
            }

            Int32Collection triangles = new Int32Collection();

            foreach (Point3D t in triangles3Ds)
            {
                triangles.Add(Convert.ToInt32(t.X));
                triangles.Add(Convert.ToInt32(t.Y));
                triangles.Add(Convert.ToInt32(t.Z));
            }

            MeshGeometry3D meshGeometry3D = new MeshGeometry3D();

            meshGeometry3D.Positions       = point3Ds;
            meshGeometry3D.TriangleIndices = triangles;

            GeometryModel3D geometry = new GeometryModel3D(meshGeometry3D, new DiffuseMaterial(new SolidColorBrush(color)));

            geometry.SetValue(FrameworkElement.NameProperty, name);

            model3DGroup.Children.Add(geometry);
            Custom3D custom3D = new Custom3D(model3DGroup, point3Ds, triangles3Ds, name, color, generalFiguresList, false);

            generalFiguresList.Add(custom3D);

            MainWindow.FiguresListChanges();
        }
Ejemplo n.º 32
0
        private void BuildModel()
        {
            var surfaceModel = BuildSurfaceModel();

            var models = new Model3DCollection
            {
                new DirectionalLight(Colors.White, new Vector3D(-1, -1, -1)),
                BuildBaseModel(surfaceModel),
                BuildGraphModel(),
                surfaceModel
            };

            _groupModel = new ModelVisual3D {
                Content = new Model3DGroup {
                    Children = models
                }
            };

            mainViewport.Children.Clear();
            mainViewport.Children.Add(_groupModel);
        }
        private void AddModelFileBtn_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                //openFileDialog.InitialDirectory = "D:\\";
                //Have found out by trial that .stl, .3ds, .obj 3d files get rendered correctly
                Filter      = "Supported 3d files(*.stl,*.3ds,*.obj)|*.stl;*.3ds;*.obj|All Files(*.*)|*.*",
                FilterIndex = 0
            };

            openFileDialog.ShowDialog();

            string filePath = openFileDialog.FileName;

            if (filePath != null && File.Exists(filePath))
            {
                Model3DCollection modelCollectionFromFilePath = Get3DModelFromFilePath(filePath).Children;
                if (modelCollectionFromFilePath.Count == 0)
                {
                    //Added breakpoint for debugging
                }
                for (int i = 0; i < modelCollectionFromFilePath.Count; i++)
                {
                    Model3D modelItem = modelCollectionFromFilePath[i];
                    string  modelName = string.IsNullOrEmpty(modelItem?.GetName()?.Trim()) ?
                                        string.IsNullOrEmpty((modelItem as GeometryModel3D)?.Geometry?.GetName()?.Trim()) ?
                                        System.IO.Path.GetFileNameWithoutExtension(filePath) + (modelCollectionFromFilePath.Count > 1 ? "-" + (i + 1) : "")
                            : (modelItem as GeometryModel3D)?.Geometry?.GetName()
                        : modelItem.GetName();

                    if ((modelItem as GeometryModel3D)?.Geometry != null)
                    {
                        modelItem.SetName(modelName);
                        (modelItem as GeometryModel3D).Geometry.SetName(modelName);
                    }
                    (modelVisual3dRef.Content as Model3DGroup).Children.Add(modelItem);
                }
            }
        }
Ejemplo n.º 34
0
        private ModelVisual3D CreateContainerWorld()
        {
            ModelVisual3D modelVisual3D = new ModelVisual3D();
            Model3DGroup  model3Dgroup  = new Model3DGroup();

            modelVisual3D.Content = (Model3D)model3Dgroup;
            Model3DCollection model3Dcollection = new Model3DCollection();

            model3Dgroup.Children = model3Dcollection;
            Color.FromScRgb(1f, 1f, 1f, 1f);
            Color    color     = Color.FromScRgb(1f, 0.5f, 0.5f, 0.5f);
            Vector3D direction = new Vector3D(1.0, -1.0, -1.0);

            direction.Normalize();
            DirectionalLight directionalLight = new DirectionalLight(color, direction);

            model3Dgroup.Children.Add((Model3D)directionalLight);
            AmbientLight ambientLight = new AmbientLight(color);

            model3Dgroup.Children.Add((Model3D)ambientLight);
            return(modelVisual3D);
        }
Ejemplo n.º 35
0
        private void CreateNode(EQEmu.Path.Node node)
        {
            Model3DGroup group = Model as Model3DGroup;
            MeshBuilder builder;

            Model3DCollection collection = new Model3DCollection();

            if (_mapping[node] != null)
            {
                foreach (Model3D model in _mapping[node])
                {
                    group.Children.Remove(model);
                }
            }

            if (Clipping != null && !Clipping.DrawPoint(node.Location)) return;

            //builder.AddBox(node.Location, 2, 2, 2);

            _mapping[node] = collection;

            GeometryModel3D box = GetNodeModel();
            box.Transform = new TranslateTransform3D(node.X,node.Y,node.Z);
            collection.Add(box);
            //collection.Add(new GeometryModel3D(builder.ToMesh(), Materials.Green));
            //_mapping[node] = new GeometryModel3D(builder.ToMesh(), Materials.Green);

            if (Options.ShowTextLabels)
            {
                GeometryModel3D text = TextCreator.CreateTextLabelModel3D(node.Id.ToString(), BrushHelper.CreateGrayBrush(5), true, 2,
                                                                            new Point3D(node.X, node.Y, node.Z + 5), new Vector3D(1, 0, 0), new Vector3D(0, 0, 1));
                text.Transform = new ScaleTransform3D(new Vector3D(-1, 1, 1), new Point3D(node.X, node.Y, node.Z));
                collection.Add(text);
            }

            foreach (EQEmu.Path.Neighbor neighbor in node.Neighbors)
            {
                if (neighbor.Node == null) continue;

                builder = new MeshBuilder();
                builder.AddArrow(new Point3D(node.X, node.Y, node.Z), new Point3D(neighbor.Node.X, neighbor.Node.Y, neighbor.Node.Z), 0.5);
                //builder.AddPipe(new Point3D(n.X, n.Y, n.Z), new Point3D(neighbor.Node.X, neighbor.Node.Y, neighbor.Node.Z), 0.5, 0.5, 50);
                collection.Add(new GeometryModel3D(builder.ToMesh(), Materials.Yellow));
            }

            foreach (Model3D model in collection)
            {
                group.Children.Add(model);
            }

            //group.Children.Add(_mapping[node]);
        }
Ejemplo n.º 36
0
        private void CreateSpawn(EQEmu.Spawns.Spawn2 spawn,DisplayFlags flags)
        {
            Model3DGroup group = Model as Model3DGroup;

            Model3DCollection collection = new Model3DCollection();

            if (_mapping.ContainsKey(spawn))
            {
                foreach (Model3D model in _mapping[spawn])
                {
                    group.Children.Remove(model);
                }
            }

            MeshBuilder builder = new MeshBuilder();
            Point3D p = new Point3D(spawn.X,spawn.Y,spawn.Z);

            if( !Clipping.DrawPoint(p) ) return;

            builder.AddBox(p,2,2,2);

            Transform3D headingRotate = new RotateTransform3D()
            {
                CenterX = p.X,
                CenterY = p.Y,
                CenterZ = p.Z,
                Rotation = new AxisAngleRotation3D(
                    new Vector3D(0,0,-1),spawn.HeadingDegrees)
            };

            GeometryModel3D box;
            Material mat = Materials.White;

            if (flags == DisplayFlags.None)
            {
                if (spawn.RoamAreaId > 0)
                {
                    mat = Materials.Red;
                }
                else if (spawn.GridId > 0)
                {
                    mat = Materials.Yellow;
                }
            }
            else if (flags == DisplayFlags.Green)
            {
                mat = Materials.Green;
            }
            else if (flags == DisplayFlags.DarkGray)
            {
                mat = Materials.DarkGray;
            }
            else if (flags == DisplayFlags.Rainbow)
            {
                mat = Materials.Rainbow;
            }
            else if (flags == DisplayFlags.Blue)
            {
                mat = Materials.Blue;
            }

            box = new GeometryModel3D(builder.ToMesh(), mat);
            box.Transform = headingRotate;
            collection.Add(box);

            builder = new MeshBuilder();
            float radius = 3.0f;
            double hx = spawn.X + Math.Cos((spawn.HeadingDegrees - 90) / 180 * Math.PI) * radius;
            double hy = spawn.Y + Math.Sin((spawn.HeadingDegrees + 90) / 180 * Math.PI) * radius;

            builder.AddArrow(new Point3D(spawn.X, spawn.Y, spawn.Z), new Point3D(hx, hy, spawn.Z), 0.5, 1);
            collection.Add(new GeometryModel3D(builder.ToMesh(), mat));

            _mapping[spawn] = collection;
            foreach (Model3D model in collection)
            {
                group.Children.Add(model);
            }
        }
Ejemplo n.º 37
0
        private void btnOpenSandbox_Click(object sender, RoutedEventArgs e)
        {
            var ofd = new OpenFileDialog();
            if ((bool)ofd.ShowDialog())
            {
                var h3 = new Halo3(ofd.FileName);
                lblSandboxPath.Text = ofd.FileName;

                var container = new Model3DCollection();
                foreach (var placedObject in h3.SandboxObjects.Where(placedObject => placedObject.TagIndex != -1))
                {
                    // Try to load Model
                    if (placedObject.TagEntry.Tag.TagPath.Contains("spawning"))
                    {

                    }

                    string gameAssetPath;
                    try
                    {
                        gameAssetPath = VariousFunctions.GetGameAsset(Halo3.GameId, placedObject.TagEntry.Tag.TagPath);
                    }
                    catch (FileNotFoundException)
                    {
                        ActionLog.AddEntry("Missing Game Asset");
                        continue;
                    }

                    var model = (Model3D)ModelImporter.Load(gameAssetPath);
                    model.Transform = CreateTransformGroup(placedObject);
                    container.Add(model);
                }

                ModelViewport.Children.Clear();
                ModelViewport.Children.Add(new GridLines());
                foreach (var model in container)
                {
                    ModelViewport.Children.Add(new ModelVisual3D
                                                   {
                                                       Content = model
                                                   });
                }
                var light = new LightVisual3D();
                var ambientLight = new AmbientLight(Colors.WhiteSmoke)
                                       {
                                           Transform = new MatrixTransform3D(new Matrix3D
                                                                                 {
                                                                                     OffsetX = 0,
                                                                                     OffsetY = 0,
                                                                                     OffsetZ = 100
                                                                                 })
                                       };
                light.Content = ambientLight;
                ModelViewport.Children.Add(light);

                ModelViewport.ShowCameraInfo = true;
                ModelViewport.ZoomExtents();
                ModelViewport.IsHeadLightEnabled = true;
            }
        }
        private void CreateArea(LineOfSightArea area)
        {
            Model3DGroup group = Model as Model3DGroup;

            Model3DCollection collection = new Model3DCollection();
            try
            {
                if (_mapping[area] != null)
                {
                    foreach (Model3D model in _mapping[area])
                    {
                        group.Children.Remove(model);
                    }
                }
            }
            catch (KeyNotFoundException)
            {
                //nothing needs to be done
            }

            foreach (var vertex in area.Vertices)
            {
                MeshBuilder builder = new MeshBuilder();
                Point3D p1 = new Point3D(vertex.X, vertex.Y, area.MaxZ);
                Point3D p2 = new Point3D(vertex.X, vertex.Y, area.MinZ);

                //if (Clipping != null && !Clipping.DrawPoint(p)) continue;

                builder.AddBox(p1, 4, 4, 4);
                builder.AddBox(p2, 4, 4, 4);
                builder.AddPipe(p1, p2, 1.5, 1.5, 50);

                GeometryModel3D box = new GeometryModel3D(builder.ToMesh(), Materials.Yellow);
                collection.Add(box);

                builder = new MeshBuilder();

                Point3D next;
                if (vertex == area.Vertices.Last())
                {
                    next = area.Vertices[0];
                }
                else
                {
                    next = area.Vertices.ElementAt(area.Vertices.IndexOf(vertex) + 1);
                }
                Point3D n1 = new Point3D(next.X, next.Y, area.MaxZ);
                Point3D n2 = new Point3D(next.X, next.Y, area.MinZ);

                //builder.AddPipe(p1, p2);
                builder.AddPipe(p1, n1, 0.5, 0.5, 50);
                builder.AddPipe(p2, n2, 0.5, 0.5, 50);
                collection.Add(new GeometryModel3D(builder.ToMesh(), Materials.Yellow));

            }

            _mapping[area] = collection;
            foreach (Model3D model in collection)
            {
                group.Children.Add(model);
            }
        }
        private void BuildModel()
        {
            var surfaceModel = BuildSurfaceModel();

            var models = new Model3DCollection
                            {
                                new DirectionalLight(Colors.White, new Vector3D(-1, -1, -1)),
                                BuildBaseModel(surfaceModel),
                                BuildGraphModel(),
                                surfaceModel
                            };

            _groupModel = new ModelVisual3D { Content = new Model3DGroup { Children = models } };

            mainViewport.Children.Clear();
            mainViewport.Children.Add(_groupModel);
        }
Ejemplo n.º 40
0
        private void CreateGrid(Grid grid)
        {
            Model3DGroup group = Model as Model3DGroup;

            Model3DCollection collection = new Model3DCollection();

            if (_mapping.ContainsKey(grid))
            {
                foreach (Model3D model in _mapping[grid])
                {
                    group.Children.Remove(model);
                }
            }

            foreach (Waypoint wp in grid.Waypoints)
            {
                MeshBuilder builder = new MeshBuilder();
                Point3D p = new Point3D(wp.X,wp.Y,wp.Z);

                if (Clipping != null && !Clipping.DrawPoint(p)) continue;
                builder.AddBox(p, 2, 2, 2);

                Transform3D headingRotate = new RotateTransform3D()
                {
                    CenterX = wp.X,
                    CenterY = wp.Y,
                    CenterZ = wp.Z,
                    Rotation = new AxisAngleRotation3D(
                        new Vector3D(0, 0, -1), wp.HeadingDegrees)
                };

                GeometryModel3D box;
                Material mat;

                if (wp.PauseTime > 0)
                {
                    mat = Materials.Red;
                }
                else
                {
                    mat = Materials.DarkGray;
                }

                box = new GeometryModel3D(builder.ToMesh(),mat);
                box.Transform = headingRotate;
                collection.Add(box);

                builder = new MeshBuilder();
                float radius = 3.0f;
                double hx = wp.X + Math.Cos( (wp.HeadingDegrees-90) / 180 * Math.PI ) * radius;
                double hy = wp.Y + Math.Sin( (wp.HeadingDegrees + 90) / 180 * Math.PI ) * radius;

                builder.AddArrow(new Point3D(wp.X, wp.Y, wp.Z),new Point3D(hx, hy, wp.Z), 0.5,1);
                collection.Add(new GeometryModel3D(builder.ToMesh(), mat));

                //box = new GeometryModel3D(builder.ToMesh(), mat);
                //collection.Add(box);

                if(wp.Name != null && !String.IsNullOrWhiteSpace(wp.Name) )
                {
                    GeometryModel3D text = TextCreator.CreateTextLabelModel3D(wp.Name, BrushHelper.CreateGrayBrush(50), true, 2, new Point3D(p.X, p.Y, p.Z + 5), new Vector3D(1, 0, 0), new Vector3D(0, 0, 1));
                    text.Transform = new ScaleTransform3D(new Vector3D(-1, 1, 1), new Point3D(p.X, p.Y, p.Z));
                    collection.Add(text);
                }

                //GeometryModel3D text = TextCreator.CreateTextLabelModel3D(wp.GridId.ToString() + "G:" + wp.Number.ToString() + "N:" + wp.PauseTime.ToString() + "P", BrushHelper.CreateGrayBrush(5), true, 2,
                  //                                                          new Point3D(p.X, p.Y, p.Z + 5), new Vector3D(1, 0, 0), new Vector3D(0, 0, 1));
                //text.Transform = new ScaleTransform3D(new Vector3D(-1, 1, 1), new Point3D(p.X, p.Y, p.Z));
                //collection.Add(text);

                builder = new MeshBuilder();

                if (grid.WanderType == Grid.WanderTypes.Patrol || grid.WanderType == Grid.WanderTypes.Circular)
                {
                    IEnumerable<Waypoint> nextWaypointQuery = grid.Waypoints.Where(
                        x => x.Number > wp.Number).OrderBy(y => y.Number);
                    if (nextWaypointQuery.Count() > 0)
                    {
                        Waypoint nextWaypoint = nextWaypointQuery.ElementAt(0);
                        builder.AddArrow(p, new Point3D(nextWaypoint.X, nextWaypoint.Y, nextWaypoint.Z), 0.5);

                        collection.Add(
                            new GeometryModel3D(builder.ToMesh(), Materials.White));
                    }
                }

                //collection.Add( new GeometryModel3D(builder.ToMesh(), Materials.
            }

            //collection.Add(new GeometryModel3D(builder.ToMesh(), Materials.White));

            _mapping[grid] = collection;
            foreach (Model3D model in collection)
            {
                group.Children.Add(model);
            }
        }
Ejemplo n.º 41
0
        private void CreatePoint(ZonePoint zp,DisplayFlags flags)
        {
            Model3DGroup group = Model as Model3DGroup;
            Model3DCollection collection = new Model3DCollection();

            if (_mapping.ContainsKey(zp))
            {
                foreach (Model3D model in _mapping[zp])
                {
                    group.Children.Remove(model);
                }
            }

            double px, py, pz;
            px = zp.X == 999999 ? 0 : zp.X;
            py = zp.Y == 999999 ? 0 : zp.Y;
            pz = zp.Z == 999999 ? 0 : zp.Z;

            Point3D p = new Point3D(px,py,pz);

            if (!Clipping.DrawPoint(p)) return;

            MeshBuilder builder = new MeshBuilder();
            builder.AddBox(p, 20, 20, 2);

            //connect box to destination
            px = zp.TargetX == 999999 ? px : zp.TargetX;
            py = zp.TargetY == 999999 ? py : zp.TargetY;
            pz = zp.TargetZ == 999999 ? pz : zp.TargetZ;

            GeometryModel3D box;
            box = new GeometryModel3D(builder.ToMesh(), Materials.Red);
            collection.Add(box);

            builder = new MeshBuilder();
            Point3D destP = new Point3D(px, py, pz);
            builder.AddArrow(p, destP, 0.5);
            builder.AddBox(destP, 20, 20, 2);

            if (zp.X == 999999 || zp.Y == 999999 || zp.Z == 999999 ||
                zp.TargetX == 999999 || zp.TargetY == 999999 || zp.TargetZ == 999999)
            {
                box = new GeometryModel3D(builder.ToMesh(), Materials.Gold);
            }
            else
            {
                box = new GeometryModel3D(builder.ToMesh(), Materials.White);
            }

            collection.Add(box);

            if (flags != DisplayFlags.None)
            {
                builder = new MeshBuilder();

                if (flags.HasFlag(DisplayFlags.DarkGrayAura))
                {
                    builder.AddBox(p, 25,25, 1);
                    builder.AddBox(destP, 25, 25, 1);
                    box = new GeometryModel3D(builder.ToMesh(), Materials.DarkGray);
                    collection.Add(box);
                }
                else if (flags.HasFlag(DisplayFlags.GreenAura))
                {
                    builder.AddBox(p, 25, 25, 1);
                    builder.AddBox(destP, 25, 25, 1);
                    box = new GeometryModel3D(builder.ToMesh(), Materials.Green);
                    collection.Add(box);
                }
            }

            _mapping[zp] = collection;

            foreach (Model3D model in collection)
            {
                group.Children.Add(model);
            }
        }
        private void HideSpawn(GroundSpawn spawn)
        {
            Model3DGroup group = Model as Model3DGroup;
            Model3DCollection collection = new Model3DCollection();

            if (_mapping.ContainsKey(spawn))
            {
                foreach (Model3D model in _mapping[spawn])
                {
                    group.Children.Remove(model);
                }
            }
        }
Ejemplo n.º 43
0
        public void LoadPreview3D()
        {
            PointCloudTileSource tileSource = CurrentTileSource;
            Jacere.Core.Geometry.Extent3D extent = tileSource.Extent;

            Model3DGroup modelGroup = new Model3DGroup();

            Model3DGroup modelSubGroup = new Model3DGroup();
            modelGroup.Children.Add(modelSubGroup);

            Model3DGroup modelStitchingGroup = new Model3DGroup();
            modelGroup.Children.Add(modelStitchingGroup);

            DirectionalLight lightSource = new DirectionalLight(System.Windows.Media.Colors.White, new Vector3D(-1, -1, -1));
            modelGroup.Children.Add(lightSource);

            ModelVisual3D model = new ModelVisual3D();
            model.Content = modelGroup;

            Jacere.Core.Geometry.Point3D centerOfMass = tileSource.CenterOfMass;
            Point3D lookatPoint = new Point3D(0, 0, 0);
            Point3D cameraPoint = new Point3D(0, extent.MinY - centerOfMass.Y, centerOfMass.Z - extent.MinZ + extent.RangeX);
            Vector3D lookDirection = lookatPoint - cameraPoint;
            lookDirection.Normalize();

            PerspectiveCamera camera = new PerspectiveCamera();
            camera.Position = cameraPoint;
            camera.LookDirection = lookDirection;
            camera.UpDirection = new Vector3D(0, 0, 1);
            camera.FieldOfView = 70;

            RenderOptions.SetEdgeMode(viewport, EdgeMode.Aliased);
            //viewport.ClipToBounds = false;
            //viewport.IsHitTestVisible = false;

            viewport.Camera = camera;
            viewport.Children.Add(model);

            m_tileModelCollection = modelSubGroup.Children;
            m_stitchingModelCollection = modelStitchingGroup.Children;

            m_backgroundWorker.RunWorkerAsync(CurrentTileSource);
        }
Ejemplo n.º 44
0
        private void HidePoint(ZonePoint pt)
        {
            Model3DGroup group = Model as Model3DGroup;
            Model3DCollection collection = new Model3DCollection();

            if (_mapping.ContainsKey(pt))
            {
                foreach (Model3D model in _mapping[pt])
                {
                    group.Children.Remove(model);
                }
            }
        }
        private void CreateSpawn(GroundSpawn spawn,DisplayFlags flags)
        {
            Model3DGroup group = Model as Model3DGroup;
            Model3DCollection collection = new Model3DCollection();

            if (_mapping.ContainsKey(spawn))
            {
                foreach (Model3D model in _mapping[spawn])
                {
                    group.Children.Remove(model);
                }
            }

            Point3D p = new Point3D(
                (spawn.MaxX + spawn.MinX) / 2,
                (spawn.MaxY + spawn.MinY) / 2,
                spawn.MaxZ);

            if (!Clipping.DrawPoint(p)) return;

            var xlen = spawn.MaxX - spawn.MinX;
            var ylen = spawn.MaxY - spawn.MinY;

            xlen = xlen <= 0 ? 4 : xlen;
            ylen = ylen <= 0 ? 4 : ylen;

            MeshBuilder builder = new MeshBuilder();
            builder.AddBox(p, ylen, xlen, 2);

            GeometryModel3D box = new GeometryModel3D(builder.ToMesh(), Materials.Gold);

            collection.Add(box);

            if ( flags != DisplayFlags.None )
            {
                var scale = 1.25;
                builder = new MeshBuilder();

                if (flags.HasFlag(DisplayFlags.DarkGrayAura))
                {
                    builder.AddBox(p, ylen * scale, xlen * scale, 1);
                    box = new GeometryModel3D(builder.ToMesh(), Materials.DarkGray);
                    collection.Add(box);
                }
                else if (flags.HasFlag(DisplayFlags.GreenAura))
                {
                    builder.AddBox(p, ylen * scale, xlen * scale, 1);
                    box = new GeometryModel3D(builder.ToMesh(), Materials.Green);
                    collection.Add(box);
                }
            }

            _mapping[spawn] = collection;

            foreach (Model3D model in collection)
            {
                group.Children.Add(model);
            }
        }