Example #1
0
        /// <summary>
        /// Инициализирует новый экземпляр класса <see cref="MultiThreadGZipStream"/>
        /// </summary>
        /// <param name="inputStream">
        /// Поток данных для упаковки/распаковки.
        /// </param>
        /// <param name="compressionMode">
        /// Режим работы <see cref="CompressionMode"/>.
        /// </param>
        public MultiThreadGZipStream(
            Stream inputStream,
            CompressionMode compressionMode)
        {
            if (inputStream == null)
            {
                throw new ArgumentNullException("inputStream");
            }

            _inputStream     = inputStream;
            _compressionMode = compressionMode;

            if (compressionMode == CompressionMode.Compress)
            {
                _blocksProvider = new InitialBlocksProvider(_inputStream);
            }
            else
            {
                _blocksProvider = new CompressedBlocksProvider(_inputStream);
            }
        }
Example #2
0
 public ChunkPartManager(IWorldManager worldManager, IChunkManager chunkManager, IBlocksProvider blocksProvider)
 {
     _blocksProvider = blocksProvider;
     _chunkManager   = chunkManager;
     _worldManager   = worldManager;
 }
Example #3
0
        public GameStatePlay(IGameStateManager gameStateManager, IWorldManager worldManager, IChunkManager chunkManager, IChunkPartManager chunkPartManager, IBlockSelector blockSelector, IBlocksProvider blocksProvider, World world)
        {
            Debug = new DebugObjects();

            _world                 = world;
            _gameStateManager      = gameStateManager;
            _worldManager          = worldManager;
            _chunkManager          = chunkManager;
            _chunkPartManager      = chunkPartManager;
            _blockSelector         = blockSelector;
            _blocksProvider        = blocksProvider;
            _selectedBlockId       = _blockSelector.GetNextBlock(0);
            _selectedBlockMetadata = 0;

            _aabbShader   = ShaderManager.GetWithGeometry("AabbShader");
            _baseShader   = ShaderManager.GetWithGeometry("BaseShader");
            _debugShader  = ShaderManager.GetWithGeometry("Debug");
            _guiShader    = ShaderManager.Get("GuiShader");
            _skyboxShader = ShaderManager.Get("SkyboxShader");
            _player       = new Player()
            {
                Position = new Vector3(0, 90, 0)
            };
            _camera  = new Camera(new Vector3(0), new Vector3(0), (float)(80f * (Math.PI / 180f)));
            _frustum = new Plane[6];
            for (int i = 0; i < _frustum.Length; i++)
            {
                _frustum[i] = new Plane();
            }
            _terrainTexture = TextureManager.Get("terrain.png", TextureMinFilter.Nearest, TextureMagFilter.Nearest);
            _iconsTexture   = TextureManager.Get("icons.png", TextureMinFilter.Nearest, TextureMagFilter.Nearest);
            _skyTexture     = TextureManager.Get("skybox.png", TextureMinFilter.Nearest, TextureMagFilter.Nearest);
            _text           = new Text(new Vector2(5, 0), FontManager.Get("glyphs"), _guiShader, "");
            _renderDistance = 16;

            _crosshair = new Sprite(new Vector2(36, 36), new Vector2(0), new Vector2(16 / 256f), _guiShader);
            _crosshair.UploadInGl();

            _selectedBlocks = new AABBObjects();

            _skybox = new Mesh()
            {
                Vertices = new List <Vertex>()
                {
                    // FRONT
                    new Vertex(new Vector3(-10, -10, -10), Vector3.One, new Vector2(1 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(10, -10, -10), Vector3.One, new Vector2(2 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(-10, 10, -10), Vector3.One, new Vector2(1 / 4f, 1 / 3f)),

                    new Vertex(new Vector3(-10, 10, -10), Vector3.One, new Vector2(1 / 4f, 1 / 3f)),
                    new Vertex(new Vector3(10, -10, -10), Vector3.One, new Vector2(2 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(10, 10, -10), Vector3.One, new Vector2(2 / 4f, 1 / 3f)),

                    // RIGHT
                    new Vertex(new Vector3(10, -10, -10), Vector3.One, new Vector2(2 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(10, -10, 10), Vector3.One, new Vector2(3 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(10, 10, -10), Vector3.One, new Vector2(2 / 4f, 1 / 3f)),

                    new Vertex(new Vector3(10, 10, -10), Vector3.One, new Vector2(2 / 4f, 1 / 3f)),
                    new Vertex(new Vector3(10, -10, 10), Vector3.One, new Vector2(3 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(10, 10, 10), Vector3.One, new Vector2(3 / 4f, 1 / 3f)),

                    // LEFT
                    new Vertex(new Vector3(-10, -10, 10), Vector3.One, new Vector2(0 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(-10, -10, -10), Vector3.One, new Vector2(1 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(-10, 10, 10), Vector3.One, new Vector2(0 / 4f, 1 / 3f)),

                    new Vertex(new Vector3(-10, 10, 10), Vector3.One, new Vector2(0 / 4f, 1 / 3f)),
                    new Vertex(new Vector3(-10, -10, -10), Vector3.One, new Vector2(1 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(-10, 10, -10), Vector3.One, new Vector2(1 / 4f, 1 / 3f)),

                    // TOP
                    new Vertex(new Vector3(-10, 10, -10), Vector3.One, new Vector2(1 / 4f, 1 / 3f)),
                    new Vertex(new Vector3(10, 10, -10), Vector3.One, new Vector2(2 / 4f, 1 / 3f)),
                    new Vertex(new Vector3(-10, 10, 10), Vector3.One, new Vector2(1 / 4f, 0 / 3f)),

                    new Vertex(new Vector3(-10, 10, 10), Vector3.One, new Vector2(1 / 4f, 0 / 3f)),
                    new Vertex(new Vector3(10, 10, -10), Vector3.One, new Vector2(2 / 4f, 1 / 3f)),
                    new Vertex(new Vector3(10, 10, 10), Vector3.One, new Vector2(2 / 4f, 0 / 3f)),

                    // BOTTOM
                    new Vertex(new Vector3(-10, -10, 10), Vector3.One, new Vector2(1 / 4f, 3 / 3f)),
                    new Vertex(new Vector3(10, -10, 10), Vector3.One, new Vector2(2 / 4f, 3 / 3f)),
                    new Vertex(new Vector3(-10, -10, -10), Vector3.One, new Vector2(1 / 4f, 2 / 3f)),

                    new Vertex(new Vector3(-10, -10, -10), Vector3.One, new Vector2(1 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(10, -10, 10), Vector3.One, new Vector2(2 / 4f, 3 / 3f)),
                    new Vertex(new Vector3(10, -10, -10), Vector3.One, new Vector2(2 / 4f, 2 / 3f)),

                    // BACK
                    new Vertex(new Vector3(10, -10, 10), Vector3.One, new Vector2(3 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(-10, -10, 10), Vector3.One, new Vector2(4 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(10, 10, 10), Vector3.One, new Vector2(3 / 4f, 1 / 3f)),

                    new Vertex(new Vector3(10, 10, 10), Vector3.One, new Vector2(3 / 4f, 1 / 3f)),
                    new Vertex(new Vector3(-10, -10, 10), Vector3.One, new Vector2(4 / 4f, 2 / 3f)),
                    new Vertex(new Vector3(-10, 10, 10), Vector3.One, new Vector2(4 / 4f, 1 / 3f)),
                }
            };
            _skybox.LoadInGl();

            _loadingThread =
                new Thread(new ThreadStart(() =>
            {
                Func <int, Tuple <int, int> > spiral = (n) =>
                {
                    var k  = (int)Math.Ceiling((Math.Sqrt(n) - 1) / 2);
                    var t  = 2 * k + 1;
                    var m  = t * t;
                    t      = t - 1;
                    var mt = m - t;
                    if (n > mt)
                    {
                        return(new Tuple <int, int>(k - (m - n), -k));
                    }
                    m  = mt;
                    mt = m - t;
                    if (n > mt)
                    {
                        return(new Tuple <int, int>(-k, -k + (m - n)));
                    }
                    m  = mt;
                    mt = m - t;
                    if (n > mt)
                    {
                        return(new Tuple <int, int>(-k + (m - n), k));
                    }
                    return(new Tuple <int, int>(k, k - (m - n - t)));
                };
                while (!_stopLoading)
                {
                    var chunks         = _worldManager.GetLoadedChunks(_world);
                    var playerPosition = _player.Position;
                    var playerPos2D    = playerPosition.Xz;

                    ChunkPosition?chunkToLoad = null;

                    var renderDistanceTime2Square = _renderDistance * 2;
                    renderDistanceTime2Square     = renderDistanceTime2Square * renderDistanceTime2Square;
                    for (var i = 0; i < renderDistanceTime2Square; i++)
                    {
                        var pos = spiral(i);
                        var chunkPositionInLocalCoordinates = new Vector2(pos.Item1, pos.Item2);
                        if (chunkPositionInLocalCoordinates.LengthFast < _renderDistance)
                        {
                            var chunkPosition = new ChunkPosition((int)((chunkPositionInLocalCoordinates.X + Math.Floor(playerPos2D.X / 16f))), (int)((chunkPositionInLocalCoordinates.Y + Math.Floor(playerPos2D.Y / 16f))));
                            if (!chunks.Any(chunk => chunk.Item1.Equals(chunkPosition)))
                            {
                                chunkToLoad = chunkPosition;
                                break;
                            }
                        }
                    }

                    if (chunkToLoad != null)
                    {
                        _worldManager.GetChunkAt(_world, chunkToLoad.Value.X, chunkToLoad.Value.Z);
                    }
                    else
                    {
                        Thread.Sleep(1000);
                    }
                }
            }))
            {
                IsBackground = true
            };
            _loadingThread.Start();
        }
Example #4
0
 public WorldManager(IBlocksProvider blocksProvider, IChunkManager chunkManager, IChunkGenerator chunkGenerator)
 {
     _blocksProvider = blocksProvider;
     _chunkManager   = chunkManager;
     _chunkGenerator = chunkGenerator;
 }