Skip to content

Commit 18638dc

Browse files
committed
Rendering v2, credits to Create for some mixins and buffering code
1 parent 66e8621 commit 18638dc

File tree

10 files changed

+316
-34
lines changed

10 files changed

+316
-34
lines changed

build.gradle

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
buildscript {
22
repositories {
33
maven { url = 'https://maven.minecraftforge.net' }
4+
maven { url = 'https://repo.spongepowered.org/repository/maven-public' }
45
mavenCentral()
56
mavenLocal()
67
}
78

89
dependencies {
910
classpath "net.minecraftforge.gradle:ForgeGradle:5.1.+"
11+
classpath "org.spongepowered:mixingradle:${mixingradle_version}"
1012
}
1113
}
1214

@@ -17,6 +19,7 @@ plugins {
1719
}
1820

1921
apply plugin: "net.minecraftforge.gradle"
22+
apply plugin: 'org.spongepowered.mixin'
2023

2124
def semver = { ->
2225
try {
@@ -130,6 +133,7 @@ minecraft {
130133
property 'mixin.env.remapRefMap', 'true'
131134
property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg"
132135

136+
arg '-mixin.config=compactmachines.mixin.json'
133137
args '--username', 'Dev'
134138
args '--width', 1920
135139
args '--height', 1080
@@ -157,6 +161,8 @@ minecraft {
157161
property 'mixin.env.remapRefMap', 'true'
158162
property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg"
159163

164+
arg '-mixin.config=compactmachines.mixin.json'
165+
160166
mods {
161167
compactmachines {
162168
source sourceSets.tunnels
@@ -268,19 +274,21 @@ dependencies {
268274
// The One Probe
269275
implementation(fg.deobf("curse.maven:theoneprobe-245211:3671753"))
270276

271-
if (System.getenv("TESTMODS") == "true") {
277+
if (include_test_mods) {
272278
// Nicephore - Screenshots and Stuff
273279
runtimeOnly(fg.deobf("curse.maven:nicephore-401014:3741832"))
274280

275281
// // Testing Mods - Trash Cans, Pipez, Create, Refined Pipes, Pretty Pipes, Refined Storage
276-
// runtimeOnly(fg.deobf("curse.maven:SuperMartijn642-454372:3649270"))
277-
// runtimeOnly(fg.deobf("curse.maven:trashcans-394535:3597654"))
278-
// runtimeOnly(fg.deobf("curse.maven:pipez-443900:3569514"))
279-
// runtimeOnly(fg.deobf("curse.maven:flywheel-486392:3687357"))
280-
// runtimeOnly(fg.deobf("curse.maven:create-328085:3687358"))
282+
runtimeOnly(fg.deobf("curse.maven:SuperMartijn642-454372:3649270"))
283+
runtimeOnly(fg.deobf("curse.maven:trashcans-394535:3597654"))
284+
runtimeOnly(fg.deobf("curse.maven:pipez-443900:3760255"))
285+
286+
runtimeOnly(fg.deobf("curse.maven:flywheel-486392:3737402"))
287+
runtimeOnly(fg.deobf("curse.maven:create-328085:3737418"))
288+
281289
// runtimeOnly(fg.deobf("curse.maven:refinedpipes-370696:3570151"))
282290
// runtimeOnly(fg.deobf("curse.maven:prettypipes-376737:3573145"))
283-
// runtimeOnly(fg.deobf("curse.maven:refinedstorage-243076:3623324"))
291+
// runtimeOnly(fg.deobf("curse.maven:refinedstorage-243076:3623324"))
284292
//
285293
// // Scalable Cat's Force, BdLib, Advanced Generators
286294
// runtimeOnly(fg.deobf("curse.maven:scalable-320926:3634756"))
@@ -302,6 +310,10 @@ dependencies {
302310
}
303311
}
304312

313+
mixin {
314+
add sourceSets.main, "${mod_id}.refmap.json"
315+
}
316+
305317
processResources {
306318
duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
307319
}
@@ -330,7 +342,8 @@ jar {
330342
"Implementation-Title" : project.name,
331343
"Implementation-Version" : archiveVersion,
332344
"Implementation-Vendor" : "",
333-
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
345+
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
346+
'MixinConfigs': "${mod_id}.mixin.json"
334347
])
335348
}
336349
}

gradle.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,9 @@ jei_version=9.7.0.194
1616
# Curseforge
1717
cf_project=224218
1818
cf_release_type=release
19+
20+
# Plugins that shall not be named
21+
mixin_version = 0.8.5
22+
mixingradle_version = 0.7-SNAPSHOT
23+
24+
include_test_mods = false

src/main/java/dev/compactmods/machines/client/level/RenderingLevel.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import net.minecraft.world.level.biome.Biome;
1414
import net.minecraft.world.level.biome.Biomes;
1515
import net.minecraft.world.level.block.Block;
16+
import net.minecraft.world.level.block.entity.BlockEntity;
17+
import net.minecraft.world.level.block.entity.TickingBlockEntity;
1618
import net.minecraft.world.level.block.state.BlockState;
1719
import net.minecraft.world.level.chunk.ChunkSource;
1820
import net.minecraft.world.level.dimension.DimensionType;
@@ -37,9 +39,18 @@ public RenderingLevel(StructureTemplate blocks) {
3739
super(new FakeSpawnInfo(), Level.OVERWORLD, Holder.direct(DimensionType.DEFAULT_OVERWORLD),
3840
() -> InactiveProfiler.INSTANCE, true, false, 0);
3941

40-
StructurePlaceSettings s = new StructurePlaceSettings();
41-
var p = s.getRandomPalette(blocks.palettes, null);
42-
this.chunkProvider = new TemplateChunkProvider(p.blocks(), this, (po) -> true);
42+
if(!blocks.palettes.isEmpty()) {
43+
StructurePlaceSettings s = new StructurePlaceSettings();
44+
var p = s.getRandomPalette(blocks.palettes, null);
45+
this.chunkProvider = new TemplateChunkProvider(p.blocks(), this, (po) -> true);
46+
} else {
47+
this.chunkProvider = new TemplateChunkProvider(Collections.emptyList(), this, p -> true);
48+
}
49+
}
50+
51+
@Override
52+
public boolean isClientSide() {
53+
return true;
4354
}
4455

4556
@Override
@@ -153,4 +164,22 @@ public Holder<Biome> getUncachedNoiseBiome(int p_204159_, int p_204160_, int p_2
153164
public int getBrightness(LightLayer p_45518_, BlockPos p_45519_) {
154165
return Level.MAX_BRIGHTNESS;
155166
}
167+
168+
@Override
169+
public long getGameTime() {
170+
return Minecraft.getInstance().level.getGameTime();
171+
}
172+
173+
public void tbe() {
174+
tickBlockEntities();
175+
}
176+
177+
@Override
178+
protected void tickBlockEntities() {
179+
super.tickBlockEntities();
180+
chunkProvider.chunks()
181+
.filter(ca -> ca instanceof TemplateChunk)
182+
.map(TemplateChunk.class::cast)
183+
.forEach(TemplateChunk::tick);
184+
}
156185
}

src/main/java/dev/compactmods/machines/client/level/TemplateChunk.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
package dev.compactmods.machines.client.level;
22

3+
import dev.compactmods.machines.CompactMachines;
4+
import dev.compactmods.machines.advancement.GenericAdvancementTriggerListener;
35
import net.minecraft.core.BlockPos;
46
import net.minecraft.world.level.ChunkPos;
57
import net.minecraft.world.level.Level;
8+
import net.minecraft.world.level.block.Block;
69
import net.minecraft.world.level.block.Blocks;
10+
import net.minecraft.world.level.block.EntityBlock;
711
import net.minecraft.world.level.block.entity.BlockEntity;
12+
import net.minecraft.world.level.block.entity.BlockEntityTicker;
13+
import net.minecraft.world.level.block.entity.TickingBlockEntity;
814
import net.minecraft.world.level.block.state.BlockState;
915
import net.minecraft.world.level.chunk.EmptyLevelChunk;
16+
import net.minecraft.world.level.chunk.LevelChunk;
1017
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
1118
import net.minecraft.world.level.material.FluidState;
19+
import net.minecraft.world.ticks.TickContainerAccess;
1220

1321
import javax.annotation.Nonnull;
1422
import javax.annotation.Nullable;
23+
import java.util.ArrayList;
1524
import java.util.HashMap;
25+
import java.util.List;
1626
import java.util.Map;
1727
import java.util.function.Predicate;
1828

@@ -24,13 +34,16 @@ public class TemplateChunk extends EmptyLevelChunk {
2434
private final Map<BlockPos, BlockState> blocksInChunk;
2535
private final Map<BlockPos, BlockEntity> tiles;
2636
private final Predicate<BlockPos> shouldShow;
37+
private final Map<BlockPos, BlockEntityTicker<BlockEntity>> tickers;
2738

28-
public TemplateChunk(Level worldIn, ChunkPos chunkPos, Map<BlockPos, StructureTemplate.StructureBlockInfo> blocksInChunk, Predicate<BlockPos> shouldShow) {
39+
public TemplateChunk(RenderingLevel worldIn, ChunkPos chunkPos, Map<BlockPos, StructureTemplate.StructureBlockInfo> blocksInChunk, Predicate<BlockPos> shouldShow) {
2940
super(worldIn, chunkPos, worldIn.getUncachedNoiseBiome(0, 0, 0));
3041
this.shouldShow = shouldShow;
3142
this.blocksInChunk = new HashMap<>();
3243

3344
tiles = new HashMap<>();
45+
tickers = new HashMap<>();
46+
3447
for (var pos : blocksInChunk.keySet()) {
3548
final var blockInfo = blocksInChunk.get(pos);
3649
this.blocksInChunk.put(pos, blockInfo.state);
@@ -39,12 +52,29 @@ public TemplateChunk(Level worldIn, ChunkPos chunkPos, Map<BlockPos, StructureTe
3952
BlockEntity tile = BlockEntity.loadStatic(blockInfo.pos, blockInfo.state, blockInfo.nbt);
4053
if (tile != null) {
4154
tile.setLevel(worldIn);
55+
tile.setBlockState(blockInfo.state);
4256
tiles.put(blockInfo.pos, tile);
57+
tile.onLoad();
58+
59+
if(blockInfo.state.getBlock() instanceof EntityBlock eb) {
60+
final BlockEntityTicker<?> ticker = eb.getTicker(worldIn, blockInfo.state, tile.getType());
61+
if(ticker != null)
62+
this.tickers.put(pos, (BlockEntityTicker<BlockEntity>) ticker);
63+
}
4364
}
4465
}
4566
}
4667
}
4768

69+
@Override
70+
public int getHeight() {
71+
return super.getHeight();
72+
}
73+
74+
public void tick() {
75+
this.tickers.forEach((pos, ticker) -> ticker.tick(this.getLevel(), pos, getBlockState(pos), tiles.get(pos)));
76+
}
77+
4878
@Nonnull
4979
@Override
5080
public BlockState getBlockState(@Nonnull BlockPos pos) {
@@ -69,7 +99,7 @@ public FluidState getFluidState(@Nonnull BlockPos pos) {
6999
public BlockEntity getBlockEntity(@Nonnull BlockPos pos, @Nonnull EntityCreationType creationMode) {
70100
if (!shouldShow.test(pos))
71101
return null;
72-
73102
return tiles.get(pos);
74103
}
104+
75105
}

src/main/java/dev/compactmods/machines/client/level/TemplateChunkProvider.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@
2121
import java.util.function.BooleanSupplier;
2222
import java.util.function.Predicate;
2323
import java.util.stream.Collectors;
24+
import java.util.stream.Stream;
2425

2526
/**
2627
* Taken from Immersive Engineering's manual code.
2728
* Source: https://github.com/BluSunrize/ImmersiveEngineering/blob/1.18.2/src/main/java/blusunrize/immersiveengineering/common/util/fakeworld/TemplateChunkProvider.java
2829
*/
2930
public class TemplateChunkProvider extends ChunkSource {
3031
private final Map<ChunkPos, ChunkAccess> chunks;
31-
private final Level world;
32+
private final RenderingLevel world;
3233
private final LevelLightEngine lightManager;
3334

3435
public TemplateChunkProvider(List<StructureTemplate.StructureBlockInfo> blocks, RenderingLevel world, Predicate<BlockPos> shouldShow) {
@@ -44,7 +45,7 @@ public TemplateChunkProvider(List<StructureTemplate.StructureBlockInfo> blocks,
4445
}
4546

4647
@NotNull
47-
private Map<ChunkPos, ChunkAccess> loadChunkData(Map<BlockPos, StructureTemplate.StructureBlockInfo> blocks, Level world, Predicate<BlockPos> shouldShow) {
48+
private Map<ChunkPos, ChunkAccess> loadChunkData(Map<BlockPos, StructureTemplate.StructureBlockInfo> blocks, RenderingLevel world, Predicate<BlockPos> shouldShow) {
4849
Map<ChunkPos, Map<BlockPos, StructureTemplate.StructureBlockInfo>> byChunk = new HashMap<>();
4950
for(var info : blocks.entrySet())
5051
{
@@ -57,13 +58,18 @@ private Map<ChunkPos, ChunkAccess> loadChunkData(Map<BlockPos, StructureTemplate
5758
.collect(Collectors.toMap(Pair::getFirst, Pair::getSecond));
5859
}
5960

61+
public Stream<ChunkAccess> chunks() {
62+
return this.chunks.values().stream();
63+
}
6064

6165

6266
@Nullable
6367
@Override
6468
public ChunkAccess getChunk(int chunkX, int chunkZ, @Nonnull ChunkStatus requiredStatus, boolean load)
6569
{
66-
return chunks.computeIfAbsent(new ChunkPos(chunkX, chunkZ), p -> new EmptyLevelChunk(world, p, world.getUncachedNoiseBiome(0, 0, 0)));
70+
return chunks.computeIfAbsent(new ChunkPos(chunkX, chunkZ), p -> {
71+
return new EmptyLevelChunk(world, p, world.getUncachedNoiseBiome(0, 0, 0));
72+
});
6773
}
6874

6975
@Override
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package dev.compactmods.machines.client.render;
2+
3+
import java.util.SortedMap;
4+
5+
import com.mojang.blaze3d.vertex.BufferBuilder;
6+
import com.mojang.blaze3d.vertex.VertexConsumer;
7+
8+
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
9+
import net.minecraft.Util;
10+
import net.minecraft.client.renderer.ChunkBufferBuilderPack;
11+
import net.minecraft.client.renderer.MultiBufferSource;
12+
import net.minecraft.client.renderer.RenderType;
13+
import net.minecraft.client.renderer.Sheets;
14+
import net.minecraft.client.resources.model.ModelBakery;
15+
16+
/**
17+
* Copied from Create's ponder rendering code. Stripping this down for now, WIP
18+
*/
19+
public class SuperRenderTypeBuffer implements MultiBufferSource {
20+
21+
private static final SuperRenderTypeBuffer INSTANCE = new SuperRenderTypeBuffer();
22+
23+
public static SuperRenderTypeBuffer getInstance() {
24+
return INSTANCE;
25+
}
26+
27+
private SuperRenderTypeBufferPhase earlyBuffer;
28+
private SuperRenderTypeBufferPhase defaultBuffer;
29+
private SuperRenderTypeBufferPhase lateBuffer;
30+
31+
public SuperRenderTypeBuffer() {
32+
earlyBuffer = new SuperRenderTypeBufferPhase();
33+
defaultBuffer = new SuperRenderTypeBufferPhase();
34+
lateBuffer = new SuperRenderTypeBufferPhase();
35+
}
36+
37+
public VertexConsumer getEarlyBuffer(RenderType type) {
38+
return earlyBuffer.bufferSource.getBuffer(type);
39+
}
40+
41+
@Override
42+
public VertexConsumer getBuffer(RenderType type) {
43+
return defaultBuffer.bufferSource.getBuffer(type);
44+
}
45+
46+
public VertexConsumer getLateBuffer(RenderType type) {
47+
return lateBuffer.bufferSource.getBuffer(type);
48+
}
49+
50+
public void draw() {
51+
earlyBuffer.bufferSource.endBatch();
52+
defaultBuffer.bufferSource.endBatch();
53+
lateBuffer.bufferSource.endBatch();
54+
}
55+
56+
public void draw(RenderType type) {
57+
earlyBuffer.bufferSource.endBatch(type);
58+
defaultBuffer.bufferSource.endBatch(type);
59+
lateBuffer.bufferSource.endBatch(type);
60+
}
61+
62+
private static class SuperRenderTypeBufferPhase {
63+
64+
// Visible clones from RenderBuffers
65+
private final ChunkBufferBuilderPack fixedBufferPack = new ChunkBufferBuilderPack();
66+
private final SortedMap<RenderType, BufferBuilder> fixedBuffers = Util.make(new Object2ObjectLinkedOpenHashMap<>(), map -> {
67+
map.put(Sheets.solidBlockSheet(), fixedBufferPack.builder(RenderType.solid()));
68+
map.put(Sheets.cutoutBlockSheet(), fixedBufferPack.builder(RenderType.cutout()));
69+
map.put(Sheets.bannerSheet(), fixedBufferPack.builder(RenderType.cutoutMipped()));
70+
map.put(Sheets.translucentCullBlockSheet(), fixedBufferPack.builder(RenderType.translucent()));
71+
put(map, Sheets.shieldSheet());
72+
put(map, Sheets.bedSheet());
73+
put(map, Sheets.shulkerBoxSheet());
74+
put(map, Sheets.signSheet());
75+
put(map, Sheets.chestSheet());
76+
put(map, RenderType.translucentNoCrumbling());
77+
put(map, RenderType.armorGlint());
78+
put(map, RenderType.armorEntityGlint());
79+
put(map, RenderType.glint());
80+
put(map, RenderType.glintDirect());
81+
put(map, RenderType.glintTranslucent());
82+
put(map, RenderType.entityGlint());
83+
put(map, RenderType.entityGlintDirect());
84+
put(map, RenderType.waterMask());
85+
ModelBakery.DESTROY_TYPES.forEach((p_173062_) -> {
86+
put(map, p_173062_);
87+
});
88+
});
89+
private final MultiBufferSource.BufferSource bufferSource = MultiBufferSource.immediateWithBuffers(fixedBuffers, new BufferBuilder(256));
90+
91+
private static void put(Object2ObjectLinkedOpenHashMap<RenderType, BufferBuilder> map, RenderType type) {
92+
map.put(type, new BufferBuilder(type.bufferSize()));
93+
}
94+
95+
}
96+
97+
}
98+

0 commit comments

Comments
 (0)