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(); }