diff --git a/src/js/net/minecraft/client/Minecraft.js b/src/js/net/minecraft/client/Minecraft.js index 49fccc9..a665c74 100644 --- a/src/js/net/minecraft/client/Minecraft.js +++ b/src/js/net/minecraft/client/Minecraft.js @@ -15,7 +15,7 @@ window.Minecraft = class { Block.create(); // Create world - this.world = new World(); + this.world = new World(this); this.worldRenderer.scene.add(this.world.group); // Create player @@ -78,7 +78,7 @@ window.Minecraft = class { this.window.mouseMotionX = 0; this.window.mouseMotionY = 0; } - + while (this.world.updateLights()) ; // Render the game diff --git a/src/js/net/minecraft/client/render/WorldRenderer.js b/src/js/net/minecraft/client/render/WorldRenderer.js index 4d7be68..d3f48ed 100644 --- a/src/js/net/minecraft/client/render/WorldRenderer.js +++ b/src/js/net/minecraft/client/render/WorldRenderer.js @@ -34,6 +34,7 @@ window.WorldRenderer = class { this.webRenderer.shadowMap.enabled = true; this.webRenderer.shadowMap.type = THREE.PCFSoftShadowMap; // default THREE.PCFShadowMap this.webRenderer.autoClear = false; + this.webRenderer.sortObjects = false; this.webRenderer.setClearColor(0x000000, 0); this.webRenderer.clear(); @@ -102,15 +103,16 @@ window.WorldRenderer = class { renderChunks(cameraChunkX, cameraChunkZ) { let world = this.minecraft.world; - let renderDistance = WorldRenderer.RENDER_DISTANCE; + // Load chunks for (let x = -renderDistance; x <= renderDistance; x++) { for (let z = -renderDistance; z <= renderDistance; z++) { world.getChunkAt(cameraChunkX + x, cameraChunkZ + z); } } + // Update chunks for (let [index, chunk] of world.chunks) { let distanceX = Math.abs(cameraChunkX - chunk.x); let distanceZ = Math.abs(cameraChunkZ - chunk.z); diff --git a/src/js/net/minecraft/client/world/Chunk.js b/src/js/net/minecraft/client/world/Chunk.js index 03afa51..59aa3de 100644 --- a/src/js/net/minecraft/client/world/Chunk.js +++ b/src/js/net/minecraft/client/world/Chunk.js @@ -7,6 +7,8 @@ window.Chunk = class { this.group = new THREE.Object3D(); this.group.matrixAutoUpdate = false; + this.group.chunkX = x; + this.group.chunkZ = z; this.loaded = false; diff --git a/src/js/net/minecraft/client/world/World.js b/src/js/net/minecraft/client/world/World.js index 8b7bdc6..af8efe6 100644 --- a/src/js/net/minecraft/client/world/World.js +++ b/src/js/net/minecraft/client/world/World.js @@ -2,7 +2,9 @@ window.World = class { static TOTAL_HEIGHT = ChunkSection.SIZE * 16 - 1; - constructor() { + constructor(minecraft) { + this.minecrat = minecraft; + this.group = new THREE.Object3D(); this.group.matrixAutoUpdate = false; this.chunks = new Map(); @@ -14,7 +16,16 @@ window.World = class { } onTick() { + let player = this.minecrat.player; + let cameraChunkX = Math.floor(player.x >> 4); + let cameraChunkZ = Math.floor(player.z >> 4); + // Update render order of chunks + this.group.children.sort((a, b) => { + let distance1 = Math.floor(Math.pow(a.chunkX - cameraChunkX, 2) + Math.pow(a.chunkZ - cameraChunkZ, 2)); + let distance2 = Math.floor(Math.pow(b.chunkX - cameraChunkX, 2) + Math.pow(b.chunkZ - cameraChunkZ, 2)); + return distance2 - distance1; + }); } getChunkAt(x, z) {