Skip to content

Commit 0ed3fcb

Browse files
authored
Merge pull request #645 from BlueMap-Minecraft/feat/entity
Entity rendering pipeline
2 parents 63d7516 + 60d40e1 commit 0ed3fcb

File tree

246 files changed

+3199
-1715
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

246 files changed

+3199
-1715
lines changed

buildSrc/src/main/kotlin/bluemap.base.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ version = gitVersion()
1010

1111
repositories {
1212
maven ("https://repo.bluecolored.de/releases") {
13-
content { includeGroupByRegex ("de\\.bluecolored\\..*") }
13+
content { includeGroupByRegex ("de\\.bluecolored.*") }
1414
}
1515
maven ("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") {
1616
content { includeGroup ("org.spigotmc") }

common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@
5555
import de.bluecolored.bluemap.core.storage.MapStorage;
5656
import de.bluecolored.bluemap.core.storage.Storage;
5757
import de.bluecolored.bluemap.core.util.Grid;
58+
import de.bluecolored.bluemap.core.world.BlockEntity;
5859
import de.bluecolored.bluemap.core.world.Chunk;
5960
import de.bluecolored.bluemap.core.world.ChunkConsumer;
6061
import de.bluecolored.bluemap.core.world.World;
6162
import de.bluecolored.bluemap.core.world.block.Block;
62-
import de.bluecolored.bluemap.core.world.block.entity.BlockEntity;
6363

6464
import java.io.IOException;
6565
import java.nio.file.Path;
@@ -594,8 +594,8 @@ public int debugBlockCommand(CommandContext<S> context) {
594594
new Thread(() -> {
595595
// collect and output debug info
596596
Vector3i blockPos = position.floor().toInt();
597-
Block<?> block = new Block<>(world, blockPos.getX(), blockPos.getY(), blockPos.getZ());
598-
Block<?> blockBelow = new Block<>(world, blockPos.getX(), blockPos.getY() - 1, blockPos.getZ());
597+
Block block = new Block(world, blockPos.getX(), blockPos.getY(), blockPos.getZ());
598+
Block blockBelow = new Block(world, blockPos.getX(), blockPos.getY() - 1, blockPos.getZ());
599599

600600
source.sendMessages(Arrays.asList(
601601
Text.of(TextColor.GOLD, "Block at you: \n", formatBlock(block)),
@@ -606,7 +606,7 @@ public int debugBlockCommand(CommandContext<S> context) {
606606
return 1;
607607
}
608608

609-
private Text formatBlock(Block<?> block) {
609+
private Text formatBlock(Block block) {
610610
World world = block.getWorld();
611611
Chunk chunk = block.getChunk();
612612

core/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,17 @@
2424
*/
2525
package de.bluecolored.bluemap.core.map.hires;
2626

27+
import com.flowpowered.math.vector.Vector3d;
2728
import com.flowpowered.math.vector.Vector3i;
2829
import de.bluecolored.bluemap.core.map.TextureGallery;
2930
import de.bluecolored.bluemap.core.map.TileMetaConsumer;
30-
import de.bluecolored.bluemap.core.map.hires.blockmodel.BlockStateModelRenderer;
31+
import de.bluecolored.bluemap.core.map.hires.block.BlockStateModelRenderer;
32+
import de.bluecolored.bluemap.core.map.hires.entity.EntityModelRenderer;
3133
import de.bluecolored.bluemap.core.resources.pack.resourcepack.ResourcePack;
3234
import de.bluecolored.bluemap.core.util.math.Color;
3335
import de.bluecolored.bluemap.core.world.Chunk;
3436
import de.bluecolored.bluemap.core.world.World;
37+
import de.bluecolored.bluemap.core.world.block.Block;
3538
import de.bluecolored.bluemap.core.world.block.BlockNeighborhood;
3639

3740
public class HiresModelRenderer {
@@ -40,12 +43,14 @@ public class HiresModelRenderer {
4043
private final RenderSettings renderSettings;
4144

4245
private final ThreadLocal<BlockStateModelRenderer> threadLocalBlockRenderer;
46+
private final ThreadLocal<EntityModelRenderer> threadLocalEntityRenderer;
4347

4448
public HiresModelRenderer(ResourcePack resourcePack, TextureGallery textureGallery, RenderSettings renderSettings) {
4549
this.resourcePack = resourcePack;
4650
this.renderSettings = renderSettings;
4751

4852
this.threadLocalBlockRenderer = ThreadLocal.withInitial(() -> new BlockStateModelRenderer(resourcePack, textureGallery, renderSettings));
53+
this.threadLocalEntityRenderer = ThreadLocal.withInitial(() -> new EntityModelRenderer(resourcePack, textureGallery, renderSettings));
4954
}
5055

5156
public void render(World world, Vector3i modelMin, Vector3i modelMax, TileModel model) {
@@ -57,13 +62,15 @@ public void render(World world, Vector3i modelMin, Vector3i modelMax, TileModel
5762
Vector3i max = modelMax.min(renderSettings.getMaxPos());
5863
Vector3i modelAnchor = new Vector3i(modelMin.getX(), 0, modelMin.getZ());
5964

65+
// render blocks
6066
BlockStateModelRenderer blockRenderer = threadLocalBlockRenderer.get();
67+
EntityModelRenderer entityRenderer = threadLocalEntityRenderer.get();
6168

6269
int maxHeight, minY, maxY;
6370
double topBlockLight;
6471
Color columnColor = new Color(), blockColor = new Color();
65-
BlockNeighborhood<?> block = new BlockNeighborhood<>(resourcePack, renderSettings, world, 0, 0, 0);
66-
TileModelView blockModel = new TileModelView(tileModel);
72+
BlockNeighborhood block = new BlockNeighborhood(new Block(world, 0, 0, 0), resourcePack, renderSettings, world.getDimensionType());
73+
TileModelView tileModelView = new TileModelView(tileModel);
6774

6875
int x, y, z;
6976
for (x = modelMin.getX(); x <= modelMax.getX(); x++){
@@ -80,18 +87,21 @@ public void render(World world, Vector3i modelMin, Vector3i modelMax, TileModel
8087
maxY = Math.min(max.getY(), chunk.getMaxY(x, z));
8188

8289
for (y = maxY; y >= minY; y--) {
90+
if (x == -1743 && y == 64 && z == 1393)
91+
System.out.println();
92+
8393
block.set(x, y, z);
8494
if (!block.isInsideRenderBounds()) continue;
8595

86-
blockModel.initialize();
96+
tileModelView.initialize();
8797

88-
blockRenderer.render(block, blockModel, blockColor);
98+
blockRenderer.render(block, tileModelView, blockColor);
8999

90100
//update topBlockLight
91101
topBlockLight = Math.max(topBlockLight, block.getBlockLightLevel() * (1 - columnColor.a));
92102

93103
// move block-model to correct position
94-
blockModel.translate(x - modelAnchor.getX(), y - modelAnchor.getY(), z - modelAnchor.getZ());
104+
tileModelView.translate(x - modelAnchor.getX(), y - modelAnchor.getY(), z - modelAnchor.getZ());
95105

96106
//update color and height (only if not 100% translucent)
97107
if (blockColor.a > 0) {
@@ -110,5 +120,18 @@ public void render(World world, Vector3i modelMin, Vector3i modelMax, TileModel
110120
tileMetaConsumer.set(x, z, columnColor, maxHeight, (int) topBlockLight);
111121
}
112122
}
123+
124+
// render entities
125+
world.iterateEntities(min.getX(), min.getZ(), max.getX(), max.getZ(), entity -> {
126+
Vector3d pos = entity.getPos();
127+
block.set(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ());
128+
entityRenderer.render(entity, block, tileModelView.initialize());
129+
tileModelView.translate(
130+
(float) pos.getX() - modelAnchor.getX(),
131+
(float) pos.getY() - modelAnchor.getY(),
132+
(float) pos.getZ() - modelAnchor.getZ()
133+
);
134+
});
135+
113136
}
114137
}

core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockRenderer.java renamed to core/src/main/java/de/bluecolored/bluemap/core/map/hires/block/BlockRenderer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2323
* THE SOFTWARE.
2424
*/
25-
package de.bluecolored.bluemap.core.map.hires.blockmodel;
25+
package de.bluecolored.bluemap.core.map.hires.block;
2626

2727
import de.bluecolored.bluemap.core.map.hires.TileModelView;
2828
import de.bluecolored.bluemap.core.resources.pack.resourcepack.blockstate.Variant;
@@ -43,9 +43,9 @@ public interface BlockRenderer {
4343
* </p>
4444
* @param block The block information that should be rendered.
4545
* @param variant The block-state variant that should be rendered.
46-
* @param blockModel The model(-view) where the block should be rendered to.
46+
* @param tileModel The model(-view) where the block should be rendered to.
4747
* @param blockColor The color that should be set to the color that represents the rendered block.
4848
*/
49-
void render(BlockNeighborhood<?> block, Variant variant, TileModelView blockModel, Color blockColor);
49+
void render(BlockNeighborhood block, Variant variant, TileModelView tileModel, Color blockColor);
5050

5151
}

core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockRendererFactory.java renamed to core/src/main/java/de/bluecolored/bluemap/core/map/hires/block/BlockRendererFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2323
* THE SOFTWARE.
2424
*/
25-
package de.bluecolored.bluemap.core.map.hires.blockmodel;
25+
package de.bluecolored.bluemap.core.map.hires.block;
2626

2727
import de.bluecolored.bluemap.core.map.TextureGallery;
2828
import de.bluecolored.bluemap.core.map.hires.RenderSettings;

core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockRendererType.java renamed to core/src/main/java/de/bluecolored/bluemap/core/map/hires/block/BlockRendererType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2323
* THE SOFTWARE.
2424
*/
25-
package de.bluecolored.bluemap.core.map.hires.blockmodel;
25+
package de.bluecolored.bluemap.core.map.hires.block;
2626

2727
import de.bluecolored.bluemap.core.map.TextureGallery;
2828
import de.bluecolored.bluemap.core.map.hires.RenderSettings;

core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockStateModelRenderer.java renamed to core/src/main/java/de/bluecolored/bluemap/core/map/hires/block/BlockStateModelRenderer.java

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,18 @@
2222
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2323
* THE SOFTWARE.
2424
*/
25-
package de.bluecolored.bluemap.core.map.hires.blockmodel;
25+
package de.bluecolored.bluemap.core.map.hires.block;
2626

2727
import com.github.benmanes.caffeine.cache.Caffeine;
2828
import com.github.benmanes.caffeine.cache.LoadingCache;
2929
import de.bluecolored.bluemap.core.map.TextureGallery;
30-
import de.bluecolored.bluemap.core.map.hires.TileModelView;
3130
import de.bluecolored.bluemap.core.map.hires.RenderSettings;
31+
import de.bluecolored.bluemap.core.map.hires.TileModelView;
3232
import de.bluecolored.bluemap.core.resources.pack.resourcepack.ResourcePack;
33-
import de.bluecolored.bluemap.core.resources.pack.resourcepack.blockmodel.BlockModel;
3433
import de.bluecolored.bluemap.core.resources.pack.resourcepack.blockstate.Variant;
3534
import de.bluecolored.bluemap.core.util.math.Color;
36-
import de.bluecolored.bluemap.core.world.block.BlockNeighborhood;
3735
import de.bluecolored.bluemap.core.world.BlockState;
36+
import de.bluecolored.bluemap.core.world.block.BlockNeighborhood;
3837

3938
import java.util.ArrayList;
4039
import java.util.List;
@@ -52,35 +51,35 @@ public BlockStateModelRenderer(ResourcePack resourcePack, TextureGallery texture
5251
.build(type -> type.create(resourcePack, textureGallery, renderSettings));
5352
}
5453

55-
public void render(BlockNeighborhood<?> block, TileModelView blockModel, Color blockColor) {
54+
public void render(BlockNeighborhood block, TileModelView blockModel, Color blockColor) {
5655
render(block, block.getBlockState(), blockModel, blockColor);
5756
}
5857

5958
private final Color waterloggedColor = new Color();
60-
public void render(BlockNeighborhood<?> block, BlockState blockState, TileModelView blockModel, Color blockColor) {
59+
public void render(BlockNeighborhood block, BlockState blockState, TileModelView tileModel, Color blockColor) {
6160
blockColor.set(0, 0, 0, 0, true);
6261

6362
//shortcut for air
6463
if (blockState.isAir()) return;
6564

66-
int modelStart = blockModel.getStart();
65+
int modelStart = tileModel.getStart();
6766

6867
// render block
69-
renderModel(block, blockState, blockModel.initialize(), blockColor);
68+
renderModel(block, blockState, tileModel.initialize(), blockColor);
7069

7170
// add water if block is waterlogged
7271
if (blockState.isWaterlogged() || block.getProperties().isAlwaysWaterlogged()) {
7372
waterloggedColor.set(0f, 0f, 0f, 0f, true);
74-
renderModel(block, WATERLOGGED_BLOCKSTATE, blockModel.initialize(), waterloggedColor);
73+
renderModel(block, WATERLOGGED_BLOCKSTATE, tileModel.initialize(), waterloggedColor);
7574
blockColor.set(waterloggedColor.overlay(blockColor.premultiplied()));
7675
}
7776

78-
blockModel.initialize(modelStart);
77+
tileModel.initialize(modelStart);
7978
}
8079

8180
private final Color variantColor = new Color();
82-
private void renderModel(BlockNeighborhood<?> block, BlockState blockState, TileModelView blockModel, Color blockColor) {
83-
int modelStart = blockModel.getStart();
81+
private void renderModel(BlockNeighborhood block, BlockState blockState, TileModelView tileModel, Color blockColor) {
82+
int modelStart = tileModel.getStart();
8483

8584
var stateResource = resourcePack.getBlockState(blockState);
8685
if (stateResource == null) return;
@@ -91,19 +90,14 @@ private void renderModel(BlockNeighborhood<?> block, BlockState blockState, Tile
9190

9291
//noinspection ForLoopReplaceableByForEach
9392
for (int i = 0; i < variants.size(); i++) {
94-
Variant variant = variants.get(i);
95-
96-
BlockModel modelResource = variant.getModel().getResource(resourcePack::getBlockModel);
97-
if (modelResource == null) continue;
98-
9993
variantColor.set(0f, 0f, 0f, 0f, true);
10094

101-
blockRenderers.get(modelResource.getRenderer())
102-
.render(block, variant, blockModel.initialize(), variantColor);
95+
Variant variant = variants.get(i);
96+
blockRenderers.get(variant.getRenderer())
97+
.render(block, variant, tileModel.initialize(), variantColor);
10398

10499
if (variantColor.a > blockColorOpacity)
105100
blockColorOpacity = variantColor.a;
106-
107101
blockColor.add(variantColor.premultiplied());
108102
}
109103

@@ -112,7 +106,7 @@ private void renderModel(BlockNeighborhood<?> block, BlockState blockState, Tile
112106
blockColor.a = blockColorOpacity;
113107
}
114108

115-
blockModel.initialize(modelStart);
109+
tileModel.initialize(modelStart);
116110
}
117111

118112
private final static BlockState WATERLOGGED_BLOCKSTATE = new BlockState("minecraft:water");

core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/LiquidModelRenderer.java renamed to core/src/main/java/de/bluecolored/bluemap/core/map/hires/block/LiquidModelRenderer.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,28 @@
2222
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2323
* THE SOFTWARE.
2424
*/
25-
package de.bluecolored.bluemap.core.map.hires.blockmodel;
25+
package de.bluecolored.bluemap.core.map.hires.block;
2626

2727
import com.flowpowered.math.TrigMath;
2828
import com.flowpowered.math.vector.Vector3i;
2929
import de.bluecolored.bluemap.core.map.TextureGallery;
30-
import de.bluecolored.bluemap.core.map.hires.TileModelView;
31-
import de.bluecolored.bluemap.core.map.hires.TileModel;
3230
import de.bluecolored.bluemap.core.map.hires.RenderSettings;
31+
import de.bluecolored.bluemap.core.map.hires.TileModel;
32+
import de.bluecolored.bluemap.core.map.hires.TileModelView;
3333
import de.bluecolored.bluemap.core.resources.BlockColorCalculatorFactory;
3434
import de.bluecolored.bluemap.core.resources.ResourcePath;
3535
import de.bluecolored.bluemap.core.resources.pack.resourcepack.ResourcePack;
36-
import de.bluecolored.bluemap.core.resources.pack.resourcepack.blockmodel.BlockModel;
37-
import de.bluecolored.bluemap.core.resources.pack.resourcepack.blockmodel.TextureVariable;
36+
import de.bluecolored.bluemap.core.resources.pack.resourcepack.model.Model;
37+
import de.bluecolored.bluemap.core.resources.pack.resourcepack.model.TextureVariable;
3838
import de.bluecolored.bluemap.core.resources.pack.resourcepack.blockstate.Variant;
3939
import de.bluecolored.bluemap.core.resources.pack.resourcepack.texture.Texture;
4040
import de.bluecolored.bluemap.core.util.Direction;
4141
import de.bluecolored.bluemap.core.util.math.Color;
4242
import de.bluecolored.bluemap.core.util.math.MatrixM3f;
4343
import de.bluecolored.bluemap.core.util.math.VectorM2f;
4444
import de.bluecolored.bluemap.core.util.math.VectorM3f;
45-
import de.bluecolored.bluemap.core.world.block.BlockNeighborhood;
4645
import de.bluecolored.bluemap.core.world.BlockState;
46+
import de.bluecolored.bluemap.core.world.block.BlockNeighborhood;
4747
import de.bluecolored.bluemap.core.world.block.ExtendedBlock;
4848

4949
/**
@@ -66,10 +66,10 @@ public class LiquidModelRenderer implements BlockRenderer {
6666
private final VectorM3f[] corners;
6767
private final VectorM2f[] uvs = new VectorM2f[4];
6868

69-
private BlockNeighborhood<?> block;
69+
private BlockNeighborhood block;
7070
private BlockState blockState;
7171
private boolean isWaterlogged, isWaterLike;
72-
private BlockModel modelResource;
72+
private Model modelResource;
7373
private TileModelView blockModel;
7474
private Color blockColor;
7575

@@ -93,15 +93,17 @@ public LiquidModelRenderer(ResourcePack resourcePack, TextureGallery textureGall
9393
for (int i = 0; i < uvs.length; i++) uvs[i] = new VectorM2f(0, 0);
9494
}
9595

96-
public void render(BlockNeighborhood<?> block, Variant variant, TileModelView blockModel, Color color) {
96+
public void render(BlockNeighborhood block, Variant variant, TileModelView blockModel, Color color) {
9797
this.block = block;
9898
this.blockState = block.getBlockState();
9999
this.isWaterlogged = blockState.isWaterlogged() || block.getProperties().isAlwaysWaterlogged();
100100
this.isWaterLike = blockState.isWater() || isWaterlogged;
101-
this.modelResource = variant.getModel().getResource();
101+
this.modelResource = variant.getModel().getResource(resourcePack::getModel);
102102
this.blockModel = blockModel;
103103
this.blockColor = color;
104104

105+
if (this.modelResource == null) return;
106+
105107
build();
106108
}
107109

@@ -191,7 +193,7 @@ private float getLiquidCornerHeight(int x, int z){
191193

192194
float sumHeight = 0f;
193195
int count = 0;
194-
ExtendedBlock<?> neighbor;
196+
ExtendedBlock neighbor;
195197
BlockState neighborBlockState;
196198

197199
for (ix = x; ix <= x+1; ix++){
@@ -223,7 +225,7 @@ private boolean isLiquidBlockingBlock(BlockState blockState){
223225
}
224226

225227
@SuppressWarnings("StringEquality")
226-
private boolean isSameLiquid(ExtendedBlock<?> block){
228+
private boolean isSameLiquid(ExtendedBlock block){
227229
BlockState blockState = block.getBlockState();
228230

229231
if (this.isWaterlogged)
@@ -245,7 +247,7 @@ private boolean createElementFace(Direction faceDir, VectorM3f c0, VectorM3f c1,
245247
Vector3i faceDirVector = faceDir.toVector();
246248

247249
//face culling
248-
ExtendedBlock<?> bl = block.getNeighborBlock(
250+
ExtendedBlock bl = block.getNeighborBlock(
249251
faceDirVector.getX(),
250252
faceDirVector.getY(),
251253
faceDirVector.getZ()
@@ -369,7 +371,7 @@ private int getFlowingAngle() {
369371
}
370372

371373
private float compareLiquidHeights(float ownHeight, int dx, int dz) {
372-
ExtendedBlock<?> neighbor = block.getNeighborBlock(dx, 0, dz);
374+
ExtendedBlock neighbor = block.getNeighborBlock(dx, 0, dz);
373375
if (neighbor.getBlockState().isAir()) return 0;
374376
if (!isSameLiquid(neighbor)) return 0;
375377

core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/MissingModelRenderer.java renamed to core/src/main/java/de/bluecolored/bluemap/core/map/hires/block/MissingModelRenderer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2323
* THE SOFTWARE.
2424
*/
25-
package de.bluecolored.bluemap.core.map.hires.blockmodel;
25+
package de.bluecolored.bluemap.core.map.hires.block;
2626

2727
import com.github.benmanes.caffeine.cache.Caffeine;
2828
import com.github.benmanes.caffeine.cache.LoadingCache;
@@ -56,7 +56,7 @@ public MissingModelRenderer(ResourcePack resourcePack, TextureGallery textureGal
5656
}
5757

5858
@Override
59-
public void render(BlockNeighborhood<?> block, Variant variant, TileModelView blockModel, Color blockColor) {
59+
public void render(BlockNeighborhood block, Variant variant, TileModelView blockModel, Color blockColor) {
6060
blockRenderers.get(BLOCK_RENDERER_TYPES.get(block.getBlockState()))
6161
.render(block, variant, blockModel, blockColor);
6262
}

0 commit comments

Comments
 (0)