Skip to content

Commit d88a25a

Browse files
committed
Model-Rewrite: Complete, further performance improvements in progress
1 parent 4c23bd5 commit d88a25a

Some content is hidden

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

60 files changed

+3279
-1850
lines changed

BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import de.bluecolored.bluemap.core.MinecraftVersion;
3131
import de.bluecolored.bluemap.core.config.*;
3232
import de.bluecolored.bluemap.core.debug.DebugDump;
33+
import de.bluecolored.bluemap.core.debug.OneBlockWorld;
3334
import de.bluecolored.bluemap.core.logger.Logger;
3435
import de.bluecolored.bluemap.core.map.BmMap;
3536
import de.bluecolored.bluemap.core.map.hires.RenderSettings;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -529,14 +529,14 @@ public int debugBlockCommand(CommandContext<S> context) {
529529
new Thread(() -> {
530530
// collect and output debug info
531531
Vector3i blockPos = position.floor().toInt();
532-
Block block = world.getBlock(blockPos);
533-
Block blockBelow = world.getBlock(blockPos.add(0, -1, 0));
532+
Block block = new Block(world, blockPos.getX(), blockPos.getY(), blockPos.getZ());
533+
Block blockBelow = new Block(null, 0, 0, 0).copy(block).add(0, -1, 0);
534534

535535
String blockIdMeta = "";
536536
String blockBelowIdMeta = "";
537537

538538
if (world instanceof MCAWorld) {
539-
MCAChunk chunk = ((MCAWorld) world).getChunk(MCAWorld.blockToChunk(blockPos));
539+
MCAChunk chunk = ((MCAWorld) world).getChunkAtBlock(blockPos.getX(), blockPos.getY(), blockPos.getZ());
540540
if (chunk instanceof ChunkAnvil112) {
541541
blockIdMeta = " (" + ((ChunkAnvil112) chunk).getBlockIdMeta(blockPos) + ")";
542542
blockBelowIdMeta = " (" + ((ChunkAnvil112) chunk).getBlockIdMeta(blockPos.add(0, -1, 0)) + ")";

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/config/BlockIdConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525
package de.bluecolored.bluemap.core.config;
2626

27+
import de.bluecolored.bluemap.core.MinecraftVersion;
2728
import de.bluecolored.bluemap.core.logger.Logger;
2829
import de.bluecolored.bluemap.core.mca.mapping.BlockIdMapper;
2930
import de.bluecolored.bluemap.core.world.BlockState;
@@ -76,7 +77,7 @@ public BlockIdConfig(ConfigurationNode node, ConfigurationLoader<? extends Confi
7677
blockNumeralId = -1;
7778
}
7879
int blockMeta = Integer.parseInt(key.substring(splitIndex + 1));
79-
BlockState state = BlockState.fromString(value);
80+
BlockState state = BlockState.fromString(MinecraftVersion.EARLIEST_SUPPORTED, value);
8081

8182
if (blockNumeralId >= 0) {
8283
BlockNumeralIDMeta idmeta = new BlockNumeralIDMeta(blockNumeralId, blockMeta);
@@ -160,7 +161,7 @@ public BlockState get(String id, int numeralId, int meta) {
160161
state = idMappings.get(new BlockIDMeta(id, 0));
161162
if (state == null) {
162163
state = numeralMappings.get(new BlockNumeralIDMeta(numeralId, 0));
163-
if (state == null) state = new BlockState(id);
164+
if (state == null) state = new BlockState(MinecraftVersion.EARLIEST_SUPPORTED, id);
164165
}
165166

166167
idMappings.put(idmeta, state);

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/config/BlockPropertiesConfig.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.github.benmanes.caffeine.cache.Caffeine;
2828
import com.github.benmanes.caffeine.cache.LoadingCache;
2929
import de.bluecolored.bluemap.core.BlueMap;
30+
import de.bluecolored.bluemap.core.MinecraftVersion;
3031
import de.bluecolored.bluemap.core.logger.Logger;
3132
import de.bluecolored.bluemap.core.mca.mapping.BlockPropertiesMapper;
3233
import de.bluecolored.bluemap.core.resourcepack.NoSuchResourceException;
@@ -67,7 +68,7 @@ public BlockPropertiesConfig(ConfigurationNode node, ResourcePack resourcePack,
6768
for (Entry<Object, ? extends ConfigurationNode> e : node.childrenMap().entrySet()){
6869
String key = e.getKey().toString();
6970
try {
70-
BlockState bsKey = BlockState.fromString(key);
71+
BlockState bsKey = BlockState.fromString(resourcePack.getMinecraftVersion(), key);
7172
BlockProperties bsValue = new BlockProperties(
7273
e.getValue().node("culling").getBoolean(true),
7374
e.getValue().node("occluding").getBoolean(true),
@@ -99,23 +100,26 @@ private BlockProperties mapNoCache(BlockState bs){
99100
}
100101

101102
BlockProperties generated = BlockProperties.SOLID;
103+
MinecraftVersion version = MinecraftVersion.LATEST_SUPPORTED;
102104

103105
if (resourcePack != null) {
104106
try {
105107
boolean culling = false;
106108
boolean occluding = false;
107109

108-
for(TransformedBlockModelResource model : resourcePack.getBlockStateResource(bs).getModels(bs)) {
110+
for(TransformedBlockModelResource model : resourcePack.getBlockStateResource(bs).getModels(bs, new ArrayList<>(10))) {
109111
culling = culling || model.getModel().isCulling();
110112
occluding = occluding || model.getModel().isOccluding();
111113
if (culling && occluding) break;
112114
}
113115

114116
generated = new BlockProperties(culling, occluding, generated.isFlammable());
115117
} catch (NoSuchResourceException ignore) {} //ignoring this because it will be logged later again if we try to render that block
118+
119+
version = resourcePack.getMinecraftVersion();
116120
}
117121

118-
mappings.computeIfAbsent(bs.getFullId(), k -> new ArrayList<>()).add(new BlockStateMapping<>(new BlockState(bs.getFullId()), generated));
122+
mappings.computeIfAbsent(bs.getFullId(), k -> new ArrayList<>()).add(new BlockStateMapping<>(new BlockState(version, bs.getFullId()), generated));
119123
if (autopoulationConfigLoader != null) {
120124
synchronized (autopoulationConfigLoader) {
121125
try {

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/config/ConfigManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public void loadResourceConfigs(File configFolder, ResourcePack resourcePack) th
129129
false
130130
);
131131
blockColorsConfigNode = joinFromResourcePack(resourcePack, "blockColors.json", blockColorsConfigNode);
132-
resourcePack.getBlockColorCalculator().loadColorConfig(blockColorsConfigNode);
132+
resourcePack.getBlockColorCalculatorFactory().loadColorConfig(blockColorsConfigNode);
133133

134134
//load blockIds.json from resources, config-folder and resourcepack
135135
URL blockIdsConfigUrl = BlueMap.class.getResource("/de/bluecolored/bluemap/" + resourcePack.getMinecraftVersion().getResource().getResourcePrefix() + "/blockIds.json");
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package de.bluecolored.bluemap.core.debug;
2+
3+
import com.flowpowered.math.vector.Vector2i;
4+
import com.flowpowered.math.vector.Vector3i;
5+
import de.bluecolored.bluemap.core.mca.mapping.BlockPropertiesMapper;
6+
import de.bluecolored.bluemap.core.world.*;
7+
8+
import java.nio.file.Path;
9+
import java.util.Collection;
10+
import java.util.UUID;
11+
12+
public class OneBlockWorld implements World {
13+
14+
private final World delegate;
15+
16+
public OneBlockWorld(World delegate) {
17+
this.delegate = delegate;
18+
}
19+
20+
@Override
21+
public String getName() {
22+
return delegate.getName();
23+
}
24+
25+
@Override
26+
public UUID getUUID() {
27+
return delegate.getUUID();
28+
}
29+
30+
@Override
31+
public Path getSaveFolder() {
32+
return delegate.getSaveFolder();
33+
}
34+
35+
@Override
36+
public int getSeaLevel() {
37+
return 64;
38+
}
39+
40+
@Override
41+
public Vector3i getSpawnPoint() {
42+
return new Vector3i(0, 70, 0);
43+
}
44+
45+
@Override
46+
public int getMaxY(int x, int z) {
47+
return 255;
48+
}
49+
50+
@Override
51+
public int getMinY(int x, int z) {
52+
return 0;
53+
}
54+
55+
@Override
56+
public Grid getChunkGrid() {
57+
return delegate.getChunkGrid();
58+
}
59+
60+
@Override
61+
public Grid getRegionGrid() {
62+
return delegate.getRegionGrid();
63+
}
64+
65+
@Override
66+
public Biome getBiome(int x, int y, int z) {
67+
return Biome.DEFAULT;
68+
}
69+
70+
@Override
71+
public BlockState getBlockState(int x, int y, int z) {
72+
if (x == 0 && z == 0 && y == 70) return BlockState.MISSING;
73+
return BlockState.AIR;
74+
}
75+
76+
@Override
77+
public BlockProperties getBlockProperties(BlockState blockState) {
78+
return delegate.getBlockProperties(blockState);
79+
}
80+
81+
@Override
82+
public Chunk getChunkAtBlock(int x, int y, int z) {
83+
return delegate.getChunkAtBlock(x, y, z);
84+
}
85+
86+
@Override
87+
public Chunk getChunk(int x, int z) {
88+
return delegate.getChunk(x, z);
89+
}
90+
91+
@Override
92+
public Region getRegion(int x, int z) {
93+
return delegate.getRegion(x, z);
94+
}
95+
96+
@Override
97+
public Collection<Vector2i> listRegions() {
98+
return delegate.listRegions();
99+
}
100+
101+
@Override
102+
public void invalidateChunkCache() {
103+
delegate.invalidateChunkCache();
104+
}
105+
106+
@Override
107+
public void invalidateChunkCache(int x, int z) {
108+
delegate.invalidateChunkCache(x, z);
109+
}
110+
111+
@Override
112+
public void cleanUpChunkCache() {
113+
delegate.cleanUpChunkCache();
114+
}
115+
116+
@Override
117+
public BlockPropertiesMapper getBlockPropertiesMapper() {
118+
return delegate.getBlockPropertiesMapper();
119+
}
120+
121+
}

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
import com.flowpowered.math.vector.Vector2i;
2828
import de.bluecolored.bluemap.core.debug.DebugDump;
2929
import de.bluecolored.bluemap.core.logger.Logger;
30-
import de.bluecolored.bluemap.core.map.hires.HiresModel;
3130
import de.bluecolored.bluemap.core.map.hires.HiresModelManager;
3231
import de.bluecolored.bluemap.core.map.lowres.LowresModelManager;
32+
import de.bluecolored.bluemap.core.map.hires.HiresTileMeta;
3333
import de.bluecolored.bluemap.core.resourcepack.ResourcePack;
3434
import de.bluecolored.bluemap.core.world.Grid;
3535
import de.bluecolored.bluemap.core.world.World;
@@ -103,8 +103,8 @@ public void renderTile(Vector2i tile) {
103103

104104
long start = System.nanoTime();
105105

106-
HiresModel hiresModel = hiresModelManager.render(world, tile);
107-
lowresModelManager.render(hiresModel);
106+
HiresTileMeta tileMeta = hiresModelManager.render(world, tile);
107+
lowresModelManager.render(tileMeta);
108108

109109
long end = System.nanoTime();
110110
long delta = end - start;
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package de.bluecolored.bluemap.core.map.hires;
2+
3+
import de.bluecolored.bluemap.core.util.math.MatrixM3f;
4+
import de.bluecolored.bluemap.core.util.math.MatrixM4f;
5+
6+
public class BlockModelView {
7+
8+
private HiresTileModel hiresTile;
9+
private int start, size;
10+
11+
public BlockModelView(HiresTileModel hiresTile) {
12+
initialize(hiresTile);
13+
}
14+
15+
public BlockModelView initialize(HiresTileModel hiresTile, int start) {
16+
this.hiresTile = hiresTile;
17+
this.start = start;
18+
this.size = hiresTile.size() - start;
19+
20+
return this;
21+
}
22+
23+
public BlockModelView initialize(HiresTileModel hiresTile) {
24+
this.hiresTile = hiresTile;
25+
this.start = hiresTile.size();
26+
this.size = 0;
27+
28+
return this;
29+
}
30+
31+
public BlockModelView initialize(int start) {
32+
this.start = start;
33+
this.size = hiresTile.size() - start;
34+
35+
return this;
36+
}
37+
38+
public BlockModelView initialize() {
39+
this.start = hiresTile.size();
40+
this.size = 0;
41+
42+
return this;
43+
}
44+
45+
public BlockModelView reset() {
46+
hiresTile.reset(this.start);
47+
this.size = 0;
48+
49+
return this;
50+
}
51+
52+
public int add(int count) {
53+
int s = hiresTile.add(count);
54+
if (s != start + size) throw new IllegalStateException("Size of HiresTileModel had external changes since view-initialisation!");
55+
this.size += count;
56+
return s;
57+
}
58+
59+
public BlockModelView rotate(float angle, float axisX, float axisY, float axisZ) {
60+
hiresTile.rotate(start, size, angle, axisX, axisY, axisZ);
61+
return this;
62+
}
63+
64+
public BlockModelView rotate(float pitch, float yaw, float roll) {
65+
hiresTile.rotate(start, size, pitch, yaw, roll);
66+
return this;
67+
}
68+
69+
public BlockModelView scale(double sx, double sy, double sz) {
70+
hiresTile.scale(start, size, sx, sy, sz);
71+
return this;
72+
}
73+
74+
public BlockModelView translate(double dx, double dy, double dz) {
75+
hiresTile.translate(start, size, dx, dy, dz);
76+
return this;
77+
}
78+
79+
public BlockModelView transform(MatrixM3f t) {
80+
hiresTile.transform(start, size, t);
81+
return this;
82+
}
83+
84+
public BlockModelView transform(
85+
float m00, float m01, float m02,
86+
float m10, float m11, float m12,
87+
float m20, float m21, float m22
88+
) {
89+
hiresTile.transform(start, size,
90+
m00, m01, m02,
91+
m10, m11, m12,
92+
m20, m21, m22
93+
);
94+
return this;
95+
}
96+
97+
public BlockModelView transform(MatrixM4f t) {
98+
hiresTile.transform(start, size, t);
99+
return this;
100+
}
101+
102+
public BlockModelView transform(
103+
float m00, float m01, float m02, float m03,
104+
float m10, float m11, float m12, float m13,
105+
float m20, float m21, float m22, float m23,
106+
float m30, float m31, float m32, float m33
107+
) {
108+
hiresTile.transform(start, size,
109+
m00, m01, m02, m03,
110+
m10, m11, m12, m13,
111+
m20, m21, m22, m23,
112+
m30, m31, m32, m33
113+
);
114+
return this;
115+
}
116+
117+
public HiresTileModel getHiresTile() {
118+
return hiresTile;
119+
}
120+
121+
public int getStart() {
122+
return start;
123+
}
124+
125+
public int getSize() {
126+
return size;
127+
}
128+
129+
}

0 commit comments

Comments
 (0)