예제 #1
0
        private void processUserInput()
        {
            var ray = TW.Data.Get <CameraInfo>().GetCenterScreenRay();

            if (TW.Graphics.Mouse.RelativeScrollWheel > 0)
            {
                placementGridSize *= 2;
            }
            if (TW.Graphics.Mouse.RelativeScrollWheel < 0)
            {
                placementGridSize /= 2;
            }
            placementGridSize = (int)MathHelper.Clamp(placementGridSize, 1, 20);

            var raycaster = new Raycaster <Chunk>();

            chunks.ForEach((c, p) =>
            {
                TW.Graphics.LineManager3D.AddBox(c.Box, Color.Black);
                c.Raycast(raycaster, ray);
            });
            if (raycaster.GetClosest().IsHit)
            {
                Vector3 hitpoint = ray.GetPoint(raycaster.GetClosest().Distance);
                Vector3 normal   = -raycaster.GetClosest().HitNormal; //TODO: invert hack

                TW.Graphics.LineManager3D.AddCenteredBox(hitpoint, 0.02f, Color.Yellow);
                TW.Graphics.LineManager3D.AddLine(hitpoint, hitpoint + normal * 0.06f, Color.CadetBlue);


                var targetCube = CalculatePlacementCube(hitpoint - normal * voxelSize * 0.1f, placementGridSize);

                var halfVoxel          = new Vector3(voxelSize / 2);
                var placementWorldSize = placementGridSize * voxelSize;
                var targetBoundingBox  = new BoundingBox((Vector3)targetCube.ToVector3() * placementWorldSize + halfVoxel,
                                                         (targetCube + new Vector3(1, 1, 1)) * placementWorldSize + halfVoxel);

                TW.Graphics.LineManager3D.AddBox(targetBoundingBox, Color.GreenYellow);



                if (TW.Graphics.Mouse.LeftMouseJustPressed)
                {
                    var    addCube     = CalculatePlacementCube(hitpoint + normal * 0.06f, placementGridSize);
                    Point3 placeOffset = (addCube.ToVector3() * placementWorldSize / voxelSize).ToPoint3Rounded();

                    var placer = new BasicShapeBuilder().CreateCube(placementGridSize);
                    PlaceInWorld(placer, placeOffset);
                }
                if (TW.Graphics.Mouse.RightMouseJustPressed)
                {
                    Point3 placeOffset = (targetCube.ToVector3() * placementWorldSize / voxelSize).ToPoint3Rounded();

                    var placer = new BasicShapeBuilder().CreateCube(placementGridSize);
                    RemoveFromWorld(placer, placeOffset);
                }
            }
        }
예제 #2
0
        private void initDefaultWorld()
        {
            chunks = new Array3D <Chunk>(NumChunks);

            var totalTime = new TimeSpan(0);
            var i         = 0;

            chunks.ForEach((c, p) =>
            {
                i++;
                totalTime.Add(PerformanceHelper.Measure(() =>
                {
                    var grid = HermiteDataGrid.CopyGrid(new DensityFunctionHermiteGrid(v =>
                    {
                        v += (Vector3)p.ToVector3() * chunkSize;
                        return(20 - v.Y);
                    }, new Point3(chunkSize + 1, chunkSize + 1, chunkSize + 1)));

                    var chunk = new Chunk(p);
                    chunk.SetGrid(grid);
                    chunk.UpdateSurface(surfaceRenderer);
                    chunks[p] = chunk;
                }));
            });
            totalTime.Multiply(1f / i);
        }
        public static Array3D <float> generateNoise(int seed)
        {
            var ret = new Array3D <float>(new Point3(16, 16, 16));

            var r = new Seeder(seed);

            ret.ForEach((val, p) =>
            {
                ret[p] = r.NextFloat(-1, 1);
            });

            return(ret);
        }