mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-19 04:15:14 -04:00
wip: massive performance improvements (rendering)
This commit is contained in:
parent
6ae472a36d
commit
1fd57b8f52
@ -20,20 +20,23 @@ import de.bixilon.minosoft.render.blockModels.Face.Face;
|
|||||||
import de.bixilon.minosoft.render.blockModels.Face.FaceOrientation;
|
import de.bixilon.minosoft.render.blockModels.Face.FaceOrientation;
|
||||||
import javafx.util.Pair;
|
import javafx.util.Pair;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
import static de.bixilon.minosoft.render.blockModels.Face.RenderConstants.faceDir;
|
import static de.bixilon.minosoft.render.blockModels.Face.RenderConstants.faceDir;
|
||||||
import static org.lwjgl.opengl.GL11.*;
|
import static org.lwjgl.opengl.GL11.*;
|
||||||
|
|
||||||
public class WorldRenderer {
|
public class WorldRenderer {
|
||||||
private final HashMap<BlockPosition, HashSet<Face>> faces;
|
private final ConcurrentHashMap<BlockPosition, HashSet<Face>> faces;
|
||||||
private AssetsLoader assetsLoader;
|
private AssetsLoader assetsLoader;
|
||||||
|
|
||||||
private LinkedBlockingQueue<Pair<ChunkLocation, Chunk>> queuedChunks;
|
private LinkedBlockingQueue<Pair<ChunkLocation, Chunk>> queuedChunks;
|
||||||
|
|
||||||
public WorldRenderer() {
|
public WorldRenderer() {
|
||||||
faces = new HashMap<>();
|
faces = new ConcurrentHashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init() {
|
public void init() {
|
||||||
@ -85,12 +88,12 @@ public class WorldRenderer {
|
|||||||
|
|
||||||
public void prepareBlock(BlockPosition position, Block block) {
|
public void prepareBlock(BlockPosition position, Block block) {
|
||||||
if (block.equals(Blocks.nullBlock)) {
|
if (block.equals(Blocks.nullBlock)) {
|
||||||
faces.put(position, null);
|
return;
|
||||||
}
|
}
|
||||||
HashMap<FaceOrientation, Boolean> adjacentBlocks = new HashMap<>();
|
HashMap<FaceOrientation, Boolean> adjacentBlocks = new HashMap<>();
|
||||||
|
|
||||||
for (FaceOrientation orientation : FaceOrientation.values()) {
|
for (FaceOrientation orientation : FaceOrientation.values()) {
|
||||||
BlockPosition neighbourPos = position.add(faceDir[orientation.getId()]);
|
BlockPosition neighbourPos = position.add(faceDir[orientation.ordinal()]);
|
||||||
|
|
||||||
if (neighbourPos.getY() >= 0 && neighbourPos.getY() <= 255) {
|
if (neighbourPos.getY() >= 0 && neighbourPos.getY() <= 255) {
|
||||||
Block neighbourBlock = GameWindow.getConnection().getPlayer().getWorld().getBlock(neighbourPos);
|
Block neighbourBlock = GameWindow.getConnection().getPlayer().getWorld().getBlock(neighbourPos);
|
||||||
@ -100,22 +103,14 @@ public class WorldRenderer {
|
|||||||
adjacentBlocks.put(orientation, false);
|
adjacentBlocks.put(orientation, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
synchronized (faces) {
|
faces.put(position, assetsLoader.getBlockModelLoader().prepare(block, adjacentBlocks));
|
||||||
faces.put(position, assetsLoader.getBlockModelLoader().prepare(block, adjacentBlocks));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void draw() {
|
public void draw() {
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glBindTexture(GL_TEXTURE_2D, assetsLoader.getTextureLoader().getTextureID());
|
glBindTexture(GL_TEXTURE_2D, assetsLoader.getTextureLoader().getTextureID());
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
synchronized (faces) {
|
faces.forEach(((position, faces) -> faces.forEach((face) -> face.draw(position))));
|
||||||
for (Map.Entry<BlockPosition, HashSet<Face>> entry : faces.entrySet()) {
|
|
||||||
for (Face face : entry.getValue()) {
|
|
||||||
face.draw(entry.getKey());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,6 @@ import de.bixilon.minosoft.render.blockModels.specialModels.*;
|
|||||||
import de.bixilon.minosoft.render.texture.TextureLoader;
|
import de.bixilon.minosoft.render.texture.TextureLoader;
|
||||||
import org.apache.commons.collections.primitives.ArrayFloatList;
|
import org.apache.commons.collections.primitives.ArrayFloatList;
|
||||||
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -123,14 +122,11 @@ public class BlockModelLoader {
|
|||||||
|
|
||||||
public BlockModelInterface getBlockDescription(Block block) {
|
public BlockModelInterface getBlockDescription(Block block) {
|
||||||
HashMap<String, BlockModelInterface> modList = blockDescriptionMap.get(block.getMod());
|
HashMap<String, BlockModelInterface> modList = blockDescriptionMap.get(block.getMod());
|
||||||
if (modList == null || !modList.containsKey(block.getIdentifier())) {
|
|
||||||
throw new IllegalArgumentException(String.format("No block %s:%s found", block.getMod(), block.getIdentifier()));
|
|
||||||
}
|
|
||||||
return modList.get(block.getIdentifier());
|
return modList.get(block.getIdentifier());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFull(Block block) {
|
public boolean isFull(Block block) {
|
||||||
if (block == Blocks.nullBlock || block == null) {
|
if (block == null || block.equals(Blocks.nullBlock)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
BlockModelInterface description = getBlockDescription(block);
|
BlockModelInterface description = getBlockDescription(block);
|
||||||
|
@ -14,14 +14,10 @@
|
|||||||
package de.bixilon.minosoft.render.blockModels.Face;
|
package de.bixilon.minosoft.render.blockModels.Face;
|
||||||
|
|
||||||
public enum FaceOrientation {
|
public enum FaceOrientation {
|
||||||
EAST(0), WEST(1), UP(2), DOWN(3), SOUTH(4), NORTH(5);
|
EAST,
|
||||||
private final int id;
|
WEST,
|
||||||
|
UP,
|
||||||
FaceOrientation(int id) {
|
DOWN,
|
||||||
this.id = id;
|
SOUTH,
|
||||||
}
|
NORTH
|
||||||
|
|
||||||
public int getId() {
|
|
||||||
return this.id;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user