/
alexmakov
/
Minecraft_Java
Обзор
Документация
Войти
/
alexmakov
/
Minecraft_Java
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/main/java/com/mojang/minecraft/render/LevelRenderer.java
253 строки
9 KB
Oliver Yasuna
Fixed walking on water. Close #2.
04 окт 2012, 00:19
04 окт 2012, 00:19
17a47fc
Код
Авторство
О чём код?
package com.mojang.minecraft.render; import com.mojang.minecraft.Minecraft; import com.mojang.minecraft.level.Level; import com.mojang.minecraft.player.Player; import com.mojang.minecraft.render.Chunk; import com.mojang.minecraft.render.ChunkDistanceComparator; import com.mojang.minecraft.render.ShapeRenderer; import com.mojang.minecraft.render.TextureManager; import java.nio.IntBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; public final class LevelRenderer { public Level level; public TextureManager textureManager; public int listId; public IntBuffer buffer = BufferUtils.createIntBuffer(65536); public List chunks = new ArrayList(); private Chunk[] loadQueue; public Chunk[] chunkCache; private int xChunks; private int yChunks; private int zChunks; private int baseListId; public Minecraft minecraft; private int[] chunkDataCache = new int['\uc350']; public int ticks = 0; private float lastLoadX = -9999.0F; private float lastLoadY = -9999.0F; private float lastLoadZ = -9999.0F; public float cracks; public LevelRenderer(Minecraft var1, TextureManager var2) { this.minecraft = var1; this.textureManager = var2; this.listId = GL11.glGenLists(2); this.baseListId = GL11.glGenLists(4096 << 6 << 1); } public final void refresh() { int var1; if(this.chunkCache != null) { for(var1 = 0; var1 < this.chunkCache.length; ++var1) { this.chunkCache[var1].dispose(); } } this.xChunks = this.level.width / 16; this.yChunks = this.level.depth / 16; this.zChunks = this.level.height / 16; this.chunkCache = new Chunk[this.xChunks * this.yChunks * this.zChunks]; this.loadQueue = new Chunk[this.xChunks * this.yChunks * this.zChunks]; var1 = 0; int var2; int var4; for(var2 = 0; var2 < this.xChunks; ++var2) { for(int var3 = 0; var3 < this.yChunks; ++var3) { for(var4 = 0; var4 < this.zChunks; ++var4) { this.chunkCache[(var4 * this.yChunks + var3) * this.xChunks + var2] = new Chunk(this.level, var2 << 4, var3 << 4, var4 << 4, 16, this.baseListId + var1); this.loadQueue[(var4 * this.yChunks + var3) * this.xChunks + var2] = this.chunkCache[(var4 * this.yChunks + var3) * this.xChunks + var2]; var1 += 2; } } } for(var2 = 0; var2 < this.chunks.size(); ++var2) { ((Chunk)this.chunks.get(var2)).loaded = false; } this.chunks.clear(); GL11.glNewList(this.listId, 4864); LevelRenderer var9 = this; float var10 = 0.5F; GL11.glColor4f(0.5F, var10, var10, 1.0F); ShapeRenderer var11 = ShapeRenderer.instance; float var12 = this.level.getGroundLevel(); int var5 = 128; if(128 > this.level.width) { var5 = this.level.width; } if(var5 > this.level.height) { var5 = this.level.height; } int var6 = 2048 / var5; var11.begin(); int var7; for(var7 = -var5 * var6; var7 < var9.level.width + var5 * var6; var7 += var5) { for(int var8 = -var5 * var6; var8 < var9.level.height + var5 * var6; var8 += var5) { var10 = var12; if(var7 >= 0 && var8 >= 0 && var7 < var9.level.width && var8 < var9.level.height) { var10 = 0.0F; } var11.vertexUV((float)var7, var10, (float)(var8 + var5), 0.0F, (float)var5); var11.vertexUV((float)(var7 + var5), var10, (float)(var8 + var5), (float)var5, (float)var5); var11.vertexUV((float)(var7 + var5), var10, (float)var8, (float)var5, 0.0F); var11.vertexUV((float)var7, var10, (float)var8, 0.0F, 0.0F); } } var11.end(); GL11.glColor3f(0.8F, 0.8F, 0.8F); var11.begin(); for(var7 = 0; var7 < var9.level.width; var7 += var5) { var11.vertexUV((float)var7, 0.0F, 0.0F, 0.0F, 0.0F); var11.vertexUV((float)(var7 + var5), 0.0F, 0.0F, (float)var5, 0.0F); var11.vertexUV((float)(var7 + var5), var12, 0.0F, (float)var5, var12); var11.vertexUV((float)var7, var12, 0.0F, 0.0F, var12); var11.vertexUV((float)var7, var12, (float)var9.level.height, 0.0F, var12); var11.vertexUV((float)(var7 + var5), var12, (float)var9.level.height, (float)var5, var12); var11.vertexUV((float)(var7 + var5), 0.0F, (float)var9.level.height, (float)var5, 0.0F); var11.vertexUV((float)var7, 0.0F, (float)var9.level.height, 0.0F, 0.0F); } GL11.glColor3f(0.6F, 0.6F, 0.6F); for(var7 = 0; var7 < var9.level.height; var7 += var5) { var11.vertexUV(0.0F, var12, (float)var7, 0.0F, 0.0F); var11.vertexUV(0.0F, var12, (float)(var7 + var5), (float)var5, 0.0F); var11.vertexUV(0.0F, 0.0F, (float)(var7 + var5), (float)var5, var12); var11.vertexUV(0.0F, 0.0F, (float)var7, 0.0F, var12); var11.vertexUV((float)var9.level.width, 0.0F, (float)var7, 0.0F, var12); var11.vertexUV((float)var9.level.width, 0.0F, (float)(var7 + var5), (float)var5, var12); var11.vertexUV((float)var9.level.width, var12, (float)(var7 + var5), (float)var5, 0.0F); var11.vertexUV((float)var9.level.width, var12, (float)var7, 0.0F, 0.0F); } var11.end(); GL11.glEndList(); GL11.glNewList(this.listId + 1, 4864); var9 = this; GL11.glColor3f(1.0F, 1.0F, 1.0F); var10 = this.level.getWaterLevel(); GL11.glBlendFunc(770, 771); var11 = ShapeRenderer.instance; var4 = 128; if(128 > this.level.width) { var4 = this.level.width; } if(var4 > this.level.height) { var4 = this.level.height; } var5 = 2048 / var4; var11.begin(); for(var6 = -var4 * var5; var6 < var9.level.width + var4 * var5; var6 += var4) { for(var7 = -var4 * var5; var7 < var9.level.height + var4 * var5; var7 += var4) { float var13 = var10 - 0.1F; if(var6 < 0 || var7 < 0 || var6 >= var9.level.width || var7 >= var9.level.height) { var11.vertexUV((float)var6, var13, (float)(var7 + var4), 0.0F, (float)var4); var11.vertexUV((float)(var6 + var4), var13, (float)(var7 + var4), (float)var4, (float)var4); var11.vertexUV((float)(var6 + var4), var13, (float)var7, (float)var4, 0.0F); var11.vertexUV((float)var6, var13, (float)var7, 0.0F, 0.0F); var11.vertexUV((float)var6, var13, (float)var7, 0.0F, 0.0F); var11.vertexUV((float)(var6 + var4), var13, (float)var7, (float)var4, 0.0F); var11.vertexUV((float)(var6 + var4), var13, (float)(var7 + var4), (float)var4, (float)var4); var11.vertexUV((float)var6, var13, (float)(var7 + var4), 0.0F, (float)var4); } } } var11.end(); GL11.glDisable(3042); GL11.glEndList(); this.queueChunks(0, 0, 0, this.level.width, this.level.depth, this.level.height); } public final int sortChunks(Player var1, int var2) { float var3 = var1.x - this.lastLoadX; float var4 = var1.y - this.lastLoadY; float var5 = var1.z - this.lastLoadZ; if(var3 * var3 + var4 * var4 + var5 * var5 > 64.0F) { this.lastLoadX = var1.x; this.lastLoadY = var1.y; this.lastLoadZ = var1.z; Arrays.sort(this.loadQueue, new ChunkDistanceComparator(var1)); } int var6 = 0; for(int var7 = 0; var7 < this.loadQueue.length; ++var7) { var6 = this.loadQueue[var7].appendLists(this.chunkDataCache, var6, var2); } this.buffer.clear(); this.buffer.put(this.chunkDataCache, 0, var6); this.buffer.flip(); if(this.buffer.remaining() > 0) { GL11.glBindTexture(3553, this.textureManager.load("/terrain.png")); GL11.glCallLists(this.buffer); } return this.buffer.remaining(); } public final void queueChunks(int var1, int var2, int var3, int var4, int var5, int var6) { var1 /= 16; var2 /= 16; var3 /= 16; var4 /= 16; var5 /= 16; var6 /= 16; if(var1 < 0) { var1 = 0; } if(var2 < 0) { var2 = 0; } if(var3 < 0) { var3 = 0; } if(var4 > this.xChunks - 1) { var4 = this.xChunks - 1; } if(var5 > this.yChunks - 1) { var5 = this.yChunks - 1; } if(var6 > this.zChunks - 1) { var6 = this.zChunks - 1; } for(var1 = var1; var1 <= var4; ++var1) { for(int var7 = var2; var7 <= var5; ++var7) { for(int var8 = var3; var8 <= var6; ++var8) { Chunk var9; if(!(var9 = this.chunkCache[(var8 * this.yChunks + var7) * this.xChunks + var1]).loaded) { var9.loaded = true; this.chunks.add(this.chunkCache[(var8 * this.yChunks + var7) * this.xChunks + var1]); } } } } } }