Ejemplo n.º 1
0
        public void TestPlanetSurface()
        {
            var engine = EngineFactory.CreateEngine();

            engine.Initialize();

            var terr = new VoxelTerrainChunk();
            int i    = 300;

            terr.Size = new Point3(i, 30, i);
            terr.Create();

            for (int x = 1; x < i; x++)
            {
                for (int y = 1; y < 5; y++)
                {
                    for (int z = 1; z < i; z++)
                    {
                        terr.GetVoxelInternal(new Point3(x, y, z)).Filled = true;
                    }
                }
            }

            engine.AddSimulator(new VoxelTerrainSimulator());
            //engine.AddSimulator(new EntityBatcherSimulator());
            engine.AddSimulator(new WorldRenderingSimulator());

            engine.Run();
        }
Ejemplo n.º 2
0
        private static void generateFlat()
        {
            for (int x = -3; x < 3; x++)
            {
                for (int y = -3; y < 3; y++)
                {
                    var terr = new VoxelTerrainChunk();
                    terr.Size = new Point3(16, 30, 16);
                    //terr.Size = new Point3(5, 5, 5);
                    terr.WorldPosition = Vector3.Modulate(terr.Size.ToVector3() * terr.NodeSize, new Vector3(x, 0, y));
                    terr.Create();

                    for (int tx = 0; tx < terr.Size.X; tx++)
                    {
                        for (int ty = 0; ty < terr.Size.Y / 2; ty++)
                        {
                            for (int tz = 0; tz < terr.Size.Z; tz++)
                            {
                                terr.GetVoxelInternal(new Point3(tx, ty, tz)).Filled = true;
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 3
0
 /// <summary>
 ///     Enqueue chunk for voxel generation.
 /// </summary>
 /// <param name="chunk">The chunk instance.</param>
 public static void EnqueueVoxelGeneration(VoxelTerrainChunk chunk)
 {
     chunk.State = VoxelTerrainChunkState.QueuedForVoxelGeneration;
     Current._tasks.Enqueue(new GeneratorTask
     {
         Chunk          = chunk,
         GenerateVoxels = true,
         GenerateMesh   = false
     });
 }
Ejemplo n.º 4
0
        /// <summary>
        ///     Enqueue chunk for meshing.
        /// </summary>
        /// <param name="chunk">The chunk instance.</param>
        public static void EnqueueMeshGeneration(VoxelTerrainChunk chunk)
        {
            // TODO: Deal with neighbors

            chunk.State = VoxelTerrainChunkState.GeneratingMesh;
            Current._tasks.Enqueue(new GeneratorTask
            {
                Chunk          = chunk,
                GenerateVoxels = false,
                GenerateMesh   = true
            });
        }
Ejemplo n.º 5
0
        private static VoxelTerrainChunk createTerrain()
        {
            var terr = new VoxelTerrainChunk();

            terr.Size = new Point3(10, 10, 10);
            terr.Create();

            var random = new Random();

            for (int i = 0; i < 30; i++)
            {
                terr.GetVoxelInternal(new Point3(random.Next(9), random.Next(9), random.Next(9))).Filled = true;
            }

            terr.GetVoxelInternal(new Point3(1, 1, 1)).Filled = true;
            return(terr);
        }
        public void SetTerrain(bool[, ,] filled)
        {
            int width  = (filled.GetUpperBound(0) + 1);
            int height = (filled.GetUpperBound(2) + 1);
            int maxY   = filled.GetUpperBound(1) + 1;

            int chunksX = (width / 16) + 1;
            int chunksY = (height / 16) + 1;

            for (int x = 0; x < chunksX; x++)
            {
                for (int y = 0; y < chunksY; y++)
                {
                    var terr = new VoxelTerrainChunk();
                    terr.Size = new Point3(16, 64, 16);
                    //terr.Size = new Point3(5, 5, 5);
                    terr.WorldPosition = Vector3.Modulate(terr.Size.ToVector3() * terr.NodeSize, new Vector3(x, 0, y));
                    terr.Create();

                    TW.Data.GetSingleton <Datastore>().Persist(terr);

                    for (int tx = 0; tx < terr.Size.X; tx++)
                    {
                        for (int ty = 0; ty < terr.Size.Y; ty++)
                        {
                            for (int tz = 0; tz < terr.Size.Z; tz++)
                            {
                                var heightMapX = tx + (int)terr.WorldPosition.X;
                                var heightMapZ = tz + (int)terr.WorldPosition.Z;
                                if (heightMapX >= width || heightMapZ >= height)
                                {
                                    continue;
                                }
                                if (ty >= maxY)
                                {
                                    continue;
                                }

                                terr.GetVoxelInternal(new Point3(tx, ty, tz)).Filled = filled[heightMapX, ty, heightMapZ];
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 7
0
        private static VoxelTerrainChunk createBlob()
        {
            var terr = new VoxelTerrainChunk();

            terr.Size = new Point3(20, 20, 20);
            terr.Create();

            for (int x = 1; x < 10; x++)
            {
                for (int y = 1; y < 10; y++)
                {
                    for (int z = 1; z < 10; z++)
                    {
                        terr.GetVoxelInternal(new Point3(x, y, z)).Filled = true;
                    }
                }
            }
            return(terr);
        }
Ejemplo n.º 8
0
        /// <inheritdoc />
        public void GenerateMesh(VoxelTerrainChunk chunk)
        {
            // Generate in order: Y [XZ]
            for (var y = 0; y < VoxelTerrainChunk.Height; y++)
            {
                for (var x = 0; x < VoxelTerrainChunk.Width; x++)
                {
                    for (var z = 0; z < VoxelTerrainChunk.Length; z++)
                    {
                        var voxelOffset      = new Vector3Int(x, y, z);
                        var voxelOffsetFloat = new Vector3(x, y, z);
                        var baseVoxel        = chunk.GetVoxelFast(voxelOffset);

                        // Skip if current voxel is empty
                        if (baseVoxel.IsAir)
                        {
                            continue;
                        }

                        // Build case code
                        var caseCode = 0;
                        for (var i = 0; i < 6; i++)
                        {
                            var voxel = chunk.GetVoxel(voxelOffset + FaceTable[i]);
                            if (voxel.IsAir)
                            {
                                caseCode |= 1 << i;
                            }
                        }

                        // There is no need to process this cell,
                        // as there is no empty space or only empty space.
                        // When caseCode is 0, the cell is empty.
                        // When caseCode is == 64 (>= 64 - just sanity check...), the cell is full.
                        if (caseCode == 0 || caseCode >= 64)
                        {
                            continue;
                        }

                        // TODO: Different/Custom shapes

                        var cornerData = ErdroysCube.ErdroyTable[caseCode];
                        var uvData     = ErdroysCube.ErdroyUVTable[caseCode];

                        // Build triangles
                        for (var i = 0; i < 36; i += 3)
                        {
                            var corner0 = cornerData[i + 0];
                            if (corner0 == -1)
                            {
                                break;
                            }
                            var corner1 = cornerData[i + 1];
                            var corner2 = cornerData[i + 2];

                            var uv0 = uvData[i + 0];
                            var uv1 = uvData[i + 1];
                            var uv2 = uvData[i + 2];

                            AddTriangle(i, _vertices.Count, baseVoxel, voxelOffsetFloat, corner0, corner1, corner2, uv0, uv1, uv2);
                        }
                    }
                }
            }

            // Check if we have something
            if (_vertices.Count == 0)
            {
                Clear();
                return;
            }

            // Apply mesh
            chunk.Model.LODs[0].Meshes[0].UpdateMesh(_vertices.ToArray(), _triangles.ToArray(), _normals.ToArray(),
                                                     null,
                                                     _uvs.ToArray(), _colors.ToArray());

            // oof?
            chunk.Model.MaterialSlots[0].Material = VoxelTerrainManager.Current.DefaultMaterial;

            // Clear mesher state
            Clear();
        }
Ejemplo n.º 9
0
        public static void generateTerrain(int chunksX, int chunksY)
        {
            PerlinNoiseGenerater noise;

            noise = new PerlinNoiseGenerater();
            float          factor                  = 0.1f;
            float          scale                   = 1f;
            List <Vector3> positions               = new List <Vector3>();
            List <Vector3> positionsbase           = new List <Vector3>();
            List <Vector3> positionsbaseDifference = new List <Vector3>();

            List <Color> colors     = new List <Color>();
            List <Color> colorsbase = new List <Color>();

            int           width  = chunksX * 16;
            int           height = chunksY * 16;
            SimpleTerrain terrain;
            SimpleTerrain terrainbase;
            SimpleTerrain terrainbaseDiffernce;


            ProceduralHeigthGenerater gen = new ProceduralHeigthGenerater(8, 0.7f);

            float[,] heightData         = new float[width, height];
            float[,] heightDataErrosion = new float[width, height];
            //float[,] heightDataErrosionDiffernce = new float[width, height];



            for (int i = 0; i < (int)(width); i++)
            {
                for (int j = 0; j < height; j++)
                {
                    heightData[i, j] = (noise.GetPerlineNoise(i, j, 8, 0.1f, 0.8f, 0.8f) * 0.8f + noise.GetPerlineNoise(noise.Perturb(i, j, 0.1f, 30).X, noise.Perturb(i, j, 0.1f, 30).Y, 4, 0.2f, 0.5f, 0.5f) * 0.25f) * 70;
                }
            }
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    positionsbase.Add(new Vector3(i, heightData[i, j], j));
                    colorsbase.Add(Color.White);
                }
            }
            //heightDataErrosionDiffernce = heightData
            heightDataErrosion = gen.GenerateHydrolicErrosion(heightData, 50 * width * height, width, height);

            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    positions.Add(new Vector3(i, heightDataErrosion[i, j], j));
                    colors.Add(new Color(new Microsoft.Xna.Framework.Vector3(positions[i * width + j].Y - positionsbase[i * width + j].Y, 50, 50)));
                    //positionsbaseDifference.Add(new Vector3(i, positions[i * width + j].Y - positionsbase[i * width + j].Y, j));(
                }
            }


            for (int x = 0; x < chunksX; x++)
            {
                for (int y = 0; y < chunksY; y++)
                {
                    var terr = new VoxelTerrainChunk();
                    terr.Size = new Point3(16, 64, 16);
                    //terr.Size = new Point3(5, 5, 5);
                    terr.WorldPosition = Vector3.Modulate(terr.Size.ToVector3() * terr.NodeSize, new Vector3(x, 0, y));
                    terr.Create();

                    TW.Data.GetSingleton <Datastore>().Persist(terr);

                    for (int tx = 0; tx < terr.Size.X; tx++)
                    {
                        for (int ty = 0; ty < terr.Size.Y / 2; ty++)
                        {
                            for (int tz = 0; tz < terr.Size.Z; tz++)
                            {
                                var heightMapX = tx + (int)terr.WorldPosition.X;
                                var heightMapZ = tz + (int)terr.WorldPosition.Z;
                                if (heightMapX >= width || heightMapZ >= height)
                                {
                                    continue;
                                }
                                if (ty < heightDataErrosion[heightMapX, heightMapZ] / 2f)
                                {
                                    terr.GetVoxelInternal(new Point3(tx, ty, tz)).Filled = true;
                                }
                            }
                        }
                    }
                }
            }
        }