Example #1
0
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            _chunkManager.ChunkSystem.Renderer.RenderAll();

            lock (_physicsMutex)
            {
                if (drawPhysics)
                {
                    modelDrawer.Draw(MathConverter.Convert(cam.View), MathConverter.Convert(cam.Projection));
                }
            }

            if (pickedPos != Vector3I.One * -1)
            {
                BoundingBox picked = new BoundingBox(pickedPos.ToVector3() - 0.55f * Vector3.One, pickedPos.ToVector3() + 0.55f * Vector3.One);
                BoundingBoxRenderer.Render(GraphicsDevice, picked, camManager.MainCamera);

                BoundingBox sidePicked = new BoundingBox(sidePickedPos.ToVector3() - 0.55f * Vector3.One, sidePickedPos.ToVector3() + 0.55f * Vector3.One);
                BoundingBoxRenderer.Render(GraphicsDevice, sidePicked, Color.Blue, camManager.MainCamera);

                BoundingBox b1 = new BoundingBox(pickedPos.ToVector3(), pickedPos.ToVector3() + Vector3.One);
                BoundingBox b2 = new BoundingBox(pickedPos.ToVector3() + Vector3.Left, pickedPos.ToVector3() + Vector3.Up + Vector3.Backward);
                BoundingBox b3 = new BoundingBox(pickedPos.ToVector3() + Vector3.Forward, pickedPos.ToVector3() + Vector3.Up + Vector3.Right);
                BoundingBox b4 = new BoundingBox(pickedPos.ToVector3() + Vector3.Left + Vector3.Forward, pickedPos.ToVector3() + Vector3.Up);

                BoundingBox b5 = new BoundingBox(pickedPos.ToVector3() + Vector3.Down, pickedPos.ToVector3() + Vector3.Right + Vector3.Backward);
                BoundingBox b6 = new BoundingBox(pickedPos.ToVector3() + Vector3.Left + Vector3.Down, pickedPos.ToVector3() + Vector3.Backward);
                BoundingBox b7 = new BoundingBox(pickedPos.ToVector3() + Vector3.Forward + Vector3.Down, pickedPos.ToVector3() + Vector3.Right);
                BoundingBox b8 = new BoundingBox(pickedPos.ToVector3() + Vector3.Left + Vector3.Forward + Vector3.Down, pickedPos.ToVector3());
            }

            spriteBatch.Begin();

            spriteBatch.DrawString(font, "Target: " + cam.Target, Vector2.One * 2f, Color.White);
            spriteBatch.DrawString(font, "Position: " + cam.Position, new Vector2(2, 2 + font.LineSpacing + 2), Color.White);
            spriteBatch.DrawString(font, "Selected: " + ((pickedPos == Vector3I.One * -1) ? "None" : pickedPos.ToString()), new Vector2(2, 2 + 2 * font.LineSpacing + 2), Color.White);

            if (_paused)
            {
                Vector2 dim = font.MeasureString("Paused");

                spriteBatch.DrawString(font, "Paused", new Vector2(GraphicsDevice.Viewport.Width - dim.X - 2, 2), Color.White);
            }

            spriteBatch.Draw(contentLibrary.DummyPixel, new Rectangle(GraphicsDevice.Viewport.Width / 2 - 1, GraphicsDevice.Viewport.Height / 2 - 1, 2, 2), Color.White);

            spriteBatch.End();

            _fpsCounter.Draw();

            base.Draw(gameTime);
        }
        private Tuple <HermiteData, Edge[]> CubeInfo(Chunk c, Vector3I min, GridPoint XYZ, GridPoint XMaxYZ, GridPoint XYMaxZ, GridPoint XYZMax, GridPoint XMaxYMaxZ, GridPoint XMaxYZMax, GridPoint XYMaxZMax, GridPoint XMaxYMaxZMax)
        {
            HermiteData hermiteData = new HermiteData(new List <Vector3>(), new List <Vector3>());

            // get edge table index
            int cubeIndex = 0;

            if (XYZ.Density < _minimumSolidDensity)
            {
                cubeIndex += 1;
            }
            if (XMaxYZ.Density < _minimumSolidDensity)
            {
                cubeIndex += 2;
            }
            if (XMaxYMaxZ.Density < _minimumSolidDensity)
            {
                cubeIndex += 4;
            }
            if (XYMaxZ.Density < _minimumSolidDensity)
            {
                cubeIndex += 8;
            }
            if (XYZMax.Density < _minimumSolidDensity)
            {
                cubeIndex += 16;
            }
            if (XMaxYZMax.Density < _minimumSolidDensity)
            {
                cubeIndex += 32;
            }
            if (XMaxYMaxZMax.Density < _minimumSolidDensity)
            {
                cubeIndex += 64;
            }
            if (XYMaxZMax.Density < _minimumSolidDensity)
            {
                cubeIndex += 128;
            }

            GridPoint[][][] lookupTable = new GridPoint[][][]
            {
                new GridPoint[][]
                {
                    new GridPoint[]
                    {
                        XYZ,
                        XYZMax,
                    },
                    new GridPoint[]
                    {
                        XYMaxZ,
                        XYMaxZMax,
                    }
                },
                new GridPoint[][]
                {
                    new GridPoint[]
                    {
                        XMaxYZ,
                        XMaxYZMax,
                    },
                    new GridPoint[]
                    {
                        XMaxYMaxZ,
                        XMaxYMaxZMax,
                    }
                },
            };

            int edge = _edgeTable[cubeIndex];

            List <Edge> xEdges = new List <Edge>();

            // loop through all the edges
            for (int i = 0; i < 12; i++)
            {
                // if this edge contains no intersection, skip it
                if ((edge & (1 << i)) == 0)
                {
                    continue;
                }

                int[] corner1Offset = _intersections[i][0];
                int[] corner2Offset = _intersections[i][1];

                Vector3I corner1 = min;
                Vector3I corner2 = min;

                corner1.X += corner1Offset[0];
                corner1.Y += corner1Offset[1];
                corner1.Z += corner1Offset[2];

                corner2.X += corner2Offset[0];
                corner2.Y += corner2Offset[1];
                corner2.Z += corner2Offset[2];

                GridPoint corner1Point = lookupTable[corner1Offset[0]][corner1Offset[1]][corner1Offset[2]];
                GridPoint corner2Point = lookupTable[corner2Offset[0]][corner2Offset[1]][corner2Offset[2]];

                Vector3I  delta = (corner2 - corner1) * (corner1Point.Density < _minimumSolidDensity ? -1 : 1); // negate if corner1 is less than the isovalue because we assume corner2 at first.
                Direction dir   = GetDirectionFromDelta(delta);

                xEdges.Add(new Edge(corner1, corner2, dir));

                Vector3 intersectionPoint = DualContouring.InterpolateIntersectionPoint(_minimumSolidDensity, corner1.ToVector3(), corner2.ToVector3(),
                                                                                        corner1Point.Density,
                                                                                        corner2Point.Density);

                Vector3I  minCorner = Vector3I.Min(corner1, corner2);
                GridPoint minPoint  = (minCorner == corner1) ? corner1Point : corner2Point;

                Vector3   naturalNormal           = _densityGradientFunction.df(intersectionPoint.X, intersectionPoint.Y, intersectionPoint.Z);
                Vector3F8 compressedNaturalNormal = new Vector3F8(naturalNormal);

                Vector3 normal = compressedNaturalNormal.ToVector3();
                //normal = naturalNormal;

                switch (dir)
                {
                case Direction.XIncreasing:
                case Direction.XDecreasing:
                    normal = minPoint.XPositiveNormal;

                    if (normal == Vector3.Zero)
                    {
                        GridPoint withNormal = new GridPoint(minPoint);

                        withNormal.XPositiveNormal = naturalNormal;

                        c.SetPoint(minCorner.X, minCorner.Y, minCorner.Z, withNormal, true);
                    }
                    break;

                case Direction.YIncreasing:
                case Direction.YDecreasing:
                    normal = minPoint.YPositiveNormal;

                    if (normal == Vector3.Zero)
                    {
                        GridPoint withNormal = new GridPoint(minPoint);

                        withNormal.YPositiveNormal = naturalNormal;

                        c.SetPoint(minCorner.X, minCorner.Y, minCorner.Z, withNormal, true);
                    }
                    break;

                case Direction.ZIncreasing:
                case Direction.ZDecreasing:
                    normal = minPoint.ZPositiveNormal;

                    if (normal == Vector3.Zero)
                    {
                        GridPoint withNormal = new GridPoint(minPoint);

                        withNormal.ZPositiveNormal = naturalNormal;

                        c.SetPoint(minCorner.X, minCorner.Y, minCorner.Z, withNormal, true);
                    }
                    break;
                }

                if (normal == Vector3.Zero)
                {
                    normal = naturalNormal;
                }

                normal.Normalize();

                hermiteData.Add(intersectionPoint, normal);
            }

            Tuple <HermiteData, Edge[]> ret = new Tuple <HermiteData, Edge[]>(hermiteData, xEdges.ToArray());

            return(ret);
        }