Port to 1.19 (mostly)

- BufferBuilder manipulation code has not been ported
This commit is contained in:
PepperCode1 2022-07-12 14:44:31 -07:00
parent 0a671b8f43
commit b5ea5f561e
18 changed files with 144 additions and 135 deletions

View file

@ -34,8 +34,8 @@ java.toolchain.languageVersion = JavaLanguageVersion.of(17)
println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
minecraft { minecraft {
mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}" // mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}"
mappings channel: 'official', version: "${minecraft_version}"
runs { runs {
client { client {
@ -199,6 +199,6 @@ curseforge {
changelog = file('changelog.txt') changelog = file('changelog.txt')
releaseType = project.curse_type releaseType = project.curse_type
mainArtifact jar mainArtifact jar
addGameVersion '1.18.2' addGameVersion '1.19'
} }
} }

View file

@ -3,9 +3,9 @@ org.gradle.daemon = false
# mod version info # mod version info
mod_version = 0.6.4 mod_version = 0.6.4
mc_update_version = 1.18 mc_update_version = 1.19
minecraft_version = 1.18.2 minecraft_version = 1.19
forge_version = 40.1.60 forge_version = 41.0.94
# build dependency versions # build dependency versions
forgegradle_version = 5.1.+ forgegradle_version = 5.1.+

View file

@ -17,8 +17,9 @@ import com.jozufozu.flywheel.mixin.PausedPartialTickAccessor;
import com.jozufozu.flywheel.vanilla.VanillaInstances; import com.jozufozu.flywheel.vanilla.VanillaInstances;
import com.mojang.logging.LogUtils; import com.mojang.logging.LogUtils;
import net.minecraft.commands.synchronization.ArgumentTypes; import net.minecraft.commands.synchronization.ArgumentTypeInfos;
import net.minecraft.commands.synchronization.EmptyArgumentSerializer; import net.minecraft.commands.synchronization.SingletonArgumentInfo;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
@ -28,9 +29,9 @@ import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.IExtensionPoint; import net.minecraftforge.fml.IExtensionPoint;
import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.network.NetworkConstants; import net.minecraftforge.network.NetworkConstants;
import net.minecraftforge.registries.RegisterEvent;
@Mod(Flywheel.ID) @Mod(Flywheel.ID)
public class Flywheel { public class Flywheel {
@ -50,7 +51,7 @@ public class Flywheel {
IEventBus forgeEventBus = MinecraftForge.EVENT_BUS; IEventBus forgeEventBus = MinecraftForge.EVENT_BUS;
IEventBus modEventBus = FMLJavaModLoadingContext.get() IEventBus modEventBus = FMLJavaModLoadingContext.get()
.getModEventBus(); .getModEventBus();
modEventBus.addListener(Flywheel::setup); modEventBus.addListener(Flywheel::registerArgumentTypes);
FlwConfig.init(); FlwConfig.init();
@ -87,8 +88,10 @@ public class Flywheel {
LOGGER.debug("Successfully loaded {}", PausedPartialTickAccessor.class.getName()); LOGGER.debug("Successfully loaded {}", PausedPartialTickAccessor.class.getName());
} }
private static void setup(final FMLCommonSetupEvent event) { private static void registerArgumentTypes(RegisterEvent event) {
ArgumentTypes.register(rl("engine").toString(), BackendTypeArgument.class, new EmptyArgumentSerializer<>(BackendTypeArgument::getInstance)); event.register(Registry.COMMAND_ARGUMENT_TYPE_REGISTRY, rl("engine"), () -> {
return ArgumentTypeInfos.registerByClass(BackendTypeArgument.class, SingletonArgumentInfo.contextFree(BackendTypeArgument::getInstance));
});
} }
public static ArtifactVersion getVersion() { public static ArtifactVersion getVersion() {

View file

@ -1,6 +1,6 @@
package com.jozufozu.flywheel.backend; package com.jozufozu.flywheel.backend;
import java.util.Collection; import java.io.InputStream;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -93,13 +93,11 @@ public class Loader implements ResourceManagerReloadListener {
private void loadProgramSpecs(ResourceManager manager) { private void loadProgramSpecs(ResourceManager manager) {
programs.clear(); programs.clear();
Collection<ResourceLocation> programSpecs = manager.listResources(PROGRAM_DIR, s -> s.endsWith(".json")); Map<ResourceLocation, Resource> programSpecs = manager.listResources(PROGRAM_DIR, loc -> loc.getPath().endsWith(".json"));
for (ResourceLocation location : programSpecs) { programSpecs.forEach((location, resource) -> {
try { try (InputStream inputStream = resource.open()) {
Resource file = manager.getResource(location); String s = StringUtil.readToString(inputStream);
String s = StringUtil.readToString(file.getInputStream());
ResourceLocation specName = ResourceUtil.trim(location, PROGRAM_DIR, ".json"); ResourceLocation specName = ResourceUtil.trim(location, PROGRAM_DIR, ".json");
@ -119,7 +117,7 @@ public class Loader implements ResourceManagerReloadListener {
} catch (Exception e) { } catch (Exception e) {
Backend.LOGGER.error("Could not load program " + location, e); Backend.LOGGER.error("Could not load program " + location, e);
} }
} });
} }
} }

View file

@ -12,14 +12,14 @@ import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder; import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.commands.SharedSuggestionProvider;
import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.network.chat.Component;
public enum BackendTypeArgument implements ArgumentType<BackendType> { public enum BackendTypeArgument implements ArgumentType<BackendType> {
INSTANCE; INSTANCE;
private static final Dynamic2CommandExceptionType INVALID = new Dynamic2CommandExceptionType((found, constants) -> { private static final Dynamic2CommandExceptionType INVALID = new Dynamic2CommandExceptionType((found, constants) -> {
// TODO: don't steal lang // TODO: don't steal lang
return new TranslatableComponent("commands.forge.arguments.enum.invalid", constants, found); return Component.translatable("commands.forge.arguments.enum.invalid", constants, found);
}); });
@Override @Override

View file

@ -16,10 +16,8 @@ import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands; import net.minecraft.commands.Commands;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.TextComponent;
import net.minecraftforge.client.event.RegisterClientCommandsEvent; import net.minecraftforge.client.event.RegisterClientCommandsEvent;
import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; import net.minecraftforge.common.ForgeConfigSpec.ConfigValue;
import net.minecraftforge.fml.ModList;
public class FlwCommands { public class FlwCommands {
public static void registerClientCommands(RegisterClientCommandsEvent event) { public static void registerClientCommands(RegisterClientCommandsEvent event) {
@ -56,14 +54,14 @@ public class FlwCommands {
LocalPlayer player = Minecraft.getInstance().player; LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return; if (player == null) return;
Component text = new TextComponent("Normal debug mode is currently: ").append(boolToText(bool)); Component text = Component.literal("Normal debug mode is currently: ").append(boolToText(bool));
player.displayClientMessage(text, false); player.displayClientMessage(text, false);
}, },
(source, bool) -> { (source, bool) -> {
LocalPlayer player = Minecraft.getInstance().player; LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return; if (player == null) return;
Component text = boolToText(bool).append(new TextComponent(" normal debug mode").withStyle(ChatFormatting.WHITE)); Component text = boolToText(bool).append(Component.literal(" normal debug mode").withStyle(ChatFormatting.WHITE));
player.displayClientMessage(text, false); player.displayClientMessage(text, false);
} }
)); ));
@ -73,14 +71,14 @@ public class FlwCommands {
LocalPlayer player = Minecraft.getInstance().player; LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return; if (player == null) return;
Component text = new TextComponent("Update limiting is currently: ").append(boolToText(bool)); Component text = Component.literal("Update limiting is currently: ").append(boolToText(bool));
player.displayClientMessage(text, false); player.displayClientMessage(text, false);
}, },
(source, bool) -> { (source, bool) -> {
LocalPlayer player = Minecraft.getInstance().player; LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return; if (player == null) return;
Component text = boolToText(bool).append(new TextComponent(" update limiting.").withStyle(ChatFormatting.WHITE)); Component text = boolToText(bool).append(Component.literal(" update limiting.").withStyle(ChatFormatting.WHITE));
player.displayClientMessage(text, false); player.displayClientMessage(text, false);
Backend.reloadWorldRenderers(); Backend.reloadWorldRenderers();
@ -111,14 +109,14 @@ public class FlwCommands {
} }
public static MutableComponent boolToText(boolean b) { public static MutableComponent boolToText(boolean b) {
return b ? new TextComponent("enabled").withStyle(ChatFormatting.DARK_GREEN) : new TextComponent("disabled").withStyle(ChatFormatting.RED); return b ? Component.literal("enabled").withStyle(ChatFormatting.DARK_GREEN) : Component.literal("disabled").withStyle(ChatFormatting.RED);
} }
public static Component getEngineMessage(@NotNull BackendType type) { public static Component getEngineMessage(@NotNull BackendType type) {
return switch (type) { return switch (type) {
case OFF -> new TextComponent("Disabled Flywheel").withStyle(ChatFormatting.RED); case OFF -> Component.literal("Disabled Flywheel").withStyle(ChatFormatting.RED);
case INSTANCING -> new TextComponent("Using Instancing Engine").withStyle(ChatFormatting.GREEN); case INSTANCING -> Component.literal("Using Instancing Engine").withStyle(ChatFormatting.GREEN);
case BATCHING -> new TextComponent("Using Batching Engine").withStyle(ChatFormatting.GREEN); case BATCHING -> Component.literal("Using Batching Engine").withStyle(ChatFormatting.GREEN);
}; };
} }

View file

@ -6,9 +6,7 @@ import java.util.Map;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.ModelEvent;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ForgeModelBakery;
/** /**
* A helper class for loading and accessing json models. * A helper class for loading and accessing json models.
@ -30,23 +28,23 @@ public class PartialModel {
protected BakedModel bakedModel; protected BakedModel bakedModel;
public PartialModel(ResourceLocation modelLocation) { public PartialModel(ResourceLocation modelLocation) {
if (tooLate) throw new RuntimeException("PartialModel '" + modelLocation + "' loaded after ModelRegistryEvent"); if (tooLate) throw new RuntimeException("PartialModel '" + modelLocation + "' loaded after ModelEvent.RegisterAdditional");
this.modelLocation = modelLocation; this.modelLocation = modelLocation;
ALL.add(this); ALL.add(this);
} }
public static void onModelRegistry(ModelRegistryEvent event) { public static void onModelRegistry(ModelEvent.RegisterAdditional event) {
for (PartialModel partial : ALL) for (PartialModel partial : ALL)
ForgeModelBakery.addSpecialModel(partial.getLocation()); event.register(partial.getLocation());
tooLate = true; tooLate = true;
} }
public static void onModelBake(ModelBakeEvent event) { public static void onModelBake(ModelEvent.BakingCompleted event) {
Map<ResourceLocation, BakedModel> modelRegistry = event.getModelRegistry(); Map<ResourceLocation, BakedModel> models = event.getModels();
for (PartialModel partial : ALL) for (PartialModel partial : ALL)
partial.set(modelRegistry.get(partial.getLocation())); partial.set(models.get(partial.getLocation()));
} }
protected void set(BakedModel bakedModel) { protected void set(BakedModel bakedModel) {

View file

@ -1,10 +1,7 @@
package com.jozufozu.flywheel.core.model; package com.jozufozu.flywheel.core.model;
import java.util.Random;
import com.jozufozu.flywheel.core.virtual.VirtualEmptyBlockGetter; import com.jozufozu.flywheel.core.virtual.VirtualEmptyBlockGetter;
import com.jozufozu.flywheel.core.virtual.VirtualEmptyModelData;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
@ -12,6 +9,7 @@ import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -42,7 +40,7 @@ public final class BakedModelBuilder implements Bufferable {
} }
@Override @Override
public void bufferInto(ModelBlockRenderer blockRenderer, VertexConsumer consumer, Random random) { public void bufferInto(ModelBlockRenderer blockRenderer, VertexConsumer consumer, RandomSource random) {
blockRenderer.tesselateBlock(renderWorld, model, referenceState, BlockPos.ZERO, poseStack, consumer, false, random, 42, OverlayTexture.NO_OVERLAY, VirtualEmptyModelData.INSTANCE); blockRenderer.tesselateBlock(renderWorld, model, referenceState, BlockPos.ZERO, poseStack, consumer, false, random, 42, OverlayTexture.NO_OVERLAY, ModelUtil.VIRTUAL_DATA, null);
} }
} }

View file

@ -1,17 +1,16 @@
package com.jozufozu.flywheel.core.model; package com.jozufozu.flywheel.core.model;
import java.util.Random;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.util.RandomSource;
/** /**
* An interface for objects that can "rendered" into a BufferBuilder. * An interface for objects that can "rendered" into a BufferBuilder.
*/ */
public interface Bufferable { public interface Bufferable {
void bufferInto(ModelBlockRenderer renderer, VertexConsumer consumer, Random random); void bufferInto(ModelBlockRenderer renderer, VertexConsumer consumer, RandomSource random);
default ShadeSeparatedBufferBuilder build() { default ShadeSeparatedBufferBuilder build() {
return ModelUtil.getBufferBuilder(this); return ModelUtil.getBufferBuilder(this);

View file

@ -2,7 +2,6 @@ package com.jozufozu.flywheel.core.model;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Collection; import java.util.Collection;
import java.util.Random;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.jozufozu.flywheel.Flywheel; import com.jozufozu.flywheel.Flywheel;
@ -18,9 +17,12 @@ import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
import net.minecraftforge.client.model.data.ModelData;
import net.minecraftforge.client.model.data.ModelProperty;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
public class ModelUtil { public class ModelUtil {
@ -30,6 +32,9 @@ public class ModelUtil {
*/ */
public static final BlockRenderDispatcher VANILLA_RENDERER = createVanillaRenderer(); public static final BlockRenderDispatcher VANILLA_RENDERER = createVanillaRenderer();
public static final ModelProperty<Boolean> VIRTUAL_PROPERTY = new ModelProperty<>();
public static final ModelData VIRTUAL_DATA = ModelData.builder().with(VIRTUAL_PROPERTY, true).build();
private static final ThreadLocal<ThreadLocalObjects> THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); private static final ThreadLocal<ThreadLocalObjects> THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new);
private static BlockRenderDispatcher createVanillaRenderer() { private static BlockRenderDispatcher createVanillaRenderer() {
@ -99,7 +104,7 @@ public class ModelUtil {
} }
private static class ThreadLocalObjects { private static class ThreadLocalObjects {
public final Random random = new Random(); public final RandomSource random = RandomSource.create();
public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer(); public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer();
public final ShadeSeparatedBufferBuilder separatedBufferBuilder = new ShadeSeparatedBufferBuilder(512); public final ShadeSeparatedBufferBuilder separatedBufferBuilder = new ShadeSeparatedBufferBuilder(512);
public final BufferBuilder unshadedBuilder = new BufferBuilder(512); public final BufferBuilder unshadedBuilder = new BufferBuilder(512);

View file

@ -3,30 +3,28 @@ package com.jozufozu.flywheel.core.model;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.Random;
import com.jozufozu.flywheel.core.virtual.VirtualEmptyBlockGetter; import com.jozufozu.flywheel.core.virtual.VirtualEmptyBlockGetter;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.ModelData;
import net.minecraftforge.client.model.data.EmptyModelData;
import net.minecraftforge.client.model.data.IModelData;
public final class WorldModelBuilder implements Bufferable { public final class WorldModelBuilder implements Bufferable {
private final RenderType layer; private final RenderType layer;
private PoseStack poseStack = new PoseStack(); private PoseStack poseStack = new PoseStack();
private Map<BlockPos, IModelData> modelData = Collections.emptyMap(); private Map<BlockPos, ModelData> modelData = Collections.emptyMap();
private BlockAndTintGetter renderWorld = VirtualEmptyBlockGetter.INSTANCE; private BlockAndTintGetter renderWorld = VirtualEmptyBlockGetter.INSTANCE;
private Collection<StructureTemplate.StructureBlockInfo> blocks = Collections.emptyList(); private Collection<StructureTemplate.StructureBlockInfo> blocks = Collections.emptyList();
@ -35,26 +33,25 @@ public final class WorldModelBuilder implements Bufferable {
} }
@Override @Override
public void bufferInto(ModelBlockRenderer modelRenderer, VertexConsumer consumer, Random random) { public void bufferInto(ModelBlockRenderer modelRenderer, VertexConsumer consumer, RandomSource random) {
ForgeHooksClient.setRenderType(this.layer);
ModelBlockRenderer.enableCaching(); ModelBlockRenderer.enableCaching();
for (StructureTemplate.StructureBlockInfo info : this.blocks) { for (StructureTemplate.StructureBlockInfo info : this.blocks) {
BlockState state = info.state; BlockState state = info.state;
if (state.getRenderShape() != RenderShape.MODEL) continue; if (state.getRenderShape() != RenderShape.MODEL) continue;
if (!ItemBlockRenderTypes.canRenderInLayer(state, this.layer)) continue;
BlockPos pos = info.pos; BlockPos pos = info.pos;
long randomSeed = state.getSeed(pos);
IModelData data = this.modelData.getOrDefault(pos, EmptyModelData.INSTANCE); BakedModel model = ModelUtil.VANILLA_RENDERER.getBlockModel(state);
ModelData data = this.modelData.getOrDefault(pos, ModelData.EMPTY);
random.setSeed(randomSeed);
if (!model.getRenderTypes(state, random, data).contains(this.layer)) continue;
poseStack.pushPose(); poseStack.pushPose();
poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); poseStack.translate(pos.getX(), pos.getY(), pos.getZ());
modelRenderer.tesselateBlock(this.renderWorld, ModelUtil.VANILLA_RENDERER.getBlockModel(state), state, pos, poseStack, consumer, true, random, 42, OverlayTexture.NO_OVERLAY, data); modelRenderer.tesselateBlock(this.renderWorld, model, state, pos, poseStack, consumer, true, random, randomSeed, OverlayTexture.NO_OVERLAY, data, this.layer);
poseStack.popPose(); poseStack.popPose();
} }
ModelBlockRenderer.clearCache(); ModelBlockRenderer.clearCache();
ForgeHooksClient.setRenderType(null);
} }
/** /**
@ -70,7 +67,7 @@ public final class WorldModelBuilder implements Bufferable {
return this; return this;
} }
public WorldModelBuilder withModelData(Map<BlockPos, IModelData> modelData) { public WorldModelBuilder withModelData(Map<BlockPos, ModelData> modelData) {
this.modelData = modelData; this.modelData = modelData;
return this; return this;
} }

View file

@ -1,8 +1,8 @@
package com.jozufozu.flywheel.core.source; package com.jozufozu.flywheel.core.source;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -28,18 +28,17 @@ public class ShaderSources implements SourceFinder {
public final Index index; public final Index index;
public ShaderSources(ResourceManager manager) { public ShaderSources(ResourceManager manager) {
Collection<ResourceLocation> allShaders = manager.listResources(SHADER_DIR, s -> { Map<ResourceLocation, Resource> allShaders = manager.listResources(SHADER_DIR, loc -> {
String path = loc.getPath();
for (String ext : EXTENSIONS) { for (String ext : EXTENSIONS) {
if (s.endsWith(ext)) return true; if (path.endsWith(ext)) return true;
} }
return false; return false;
}); });
for (ResourceLocation location : allShaders) { allShaders.forEach((location, resource) -> {
try { try (InputStream inputStream = resource.open()) {
Resource resource = manager.getResource(location); String source = StringUtil.readToString(inputStream);
String source = StringUtil.readToString(resource.getInputStream());
ResourceLocation name = ResourceUtil.removePrefixUnchecked(location, SHADER_DIR); ResourceLocation name = ResourceUtil.removePrefixUnchecked(location, SHADER_DIR);
@ -47,7 +46,7 @@ public class ShaderSources implements SourceFinder {
} catch (IOException e) { } catch (IOException e) {
} }
} });
index = new Index(shaderSources); index = new Index(shaderSources);
} }

View file

@ -28,7 +28,7 @@ import net.minecraft.world.level.chunk.ChunkStatus;
import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.LevelChunkSection;
import net.minecraft.world.level.chunk.UpgradeData; import net.minecraft.world.level.chunk.UpgradeData;
import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.StructureStart; import net.minecraft.world.level.levelgen.structure.StructureStart;
import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.FluidState;
@ -192,41 +192,78 @@ public class VirtualChunk extends ChunkAccess {
return null; return null;
} }
// @Override
// @Nullable
// public StructureStart getStartForFeature(ConfiguredStructureFeature<?, ?> pStructure) {
// return null;
// }
//
// @Override
// public void setStartForFeature(ConfiguredStructureFeature<?, ?> pStructure, StructureStart pStart) {
// }
//
// @Override
// public Map<ConfiguredStructureFeature<?, ?>, StructureStart> getAllStarts() {
// return Collections.emptyMap();
// }
//
// @Override
// public void setAllStarts(Map<ConfiguredStructureFeature<?, ?>, StructureStart> pStructureStarts) {
// }
//
// @Override
// public LongSet getReferencesForFeature(ConfiguredStructureFeature<?, ?> pStructure) {
// return LongSets.emptySet();
// }
//
// @Override
// public void addReferenceForFeature(ConfiguredStructureFeature<?, ?> pStructure, long pReference) {
// }
//
// @Override
// public Map<ConfiguredStructureFeature<?, ?>, LongSet> getAllReferences() {
// return Collections.emptyMap();
// }
//
// @Override
// public void setAllReferences(Map<ConfiguredStructureFeature<?, ?>, LongSet> pStructureReferences) {
// }
@Override @Override
@Nullable @Nullable
public StructureStart getStartForFeature(ConfiguredStructureFeature<?, ?> pStructure) { public StructureStart getStartForStructure(Structure structure) {
return null; return null;
} }
@Override @Override
public void setStartForFeature(ConfiguredStructureFeature<?, ?> pStructure, StructureStart pStart) { public void setStartForStructure(Structure structure, StructureStart start) {
} }
@Override @Override
public Map<ConfiguredStructureFeature<?, ?>, StructureStart> getAllStarts() { public Map<Structure, StructureStart> getAllStarts() {
return Collections.emptyMap(); return Collections.emptyMap();
} }
@Override @Override
public void setAllStarts(Map<ConfiguredStructureFeature<?, ?>, StructureStart> pStructureStarts) { public void setAllStarts(Map<Structure, StructureStart> structureStarts) {
} }
@Override @Override
public LongSet getReferencesForFeature(ConfiguredStructureFeature<?, ?> pStructure) { public LongSet getReferencesForStructure(Structure structure) {
return LongSets.emptySet(); return LongSets.emptySet();
} }
@Override @Override
public void addReferenceForFeature(ConfiguredStructureFeature<?, ?> pStructure, long pReference) { public void addReferenceForStructure(Structure structure, long reference) {
} }
@Override @Override
public Map<ConfiguredStructureFeature<?, ?>, LongSet> getAllReferences() { public Map<Structure, LongSet> getAllReferences() {
return Collections.emptyMap(); return Collections.emptyMap();
} }
@Override @Override
public void setAllReferences(Map<ConfiguredStructureFeature<?, ?>, LongSet> pStructureReferences) { public void setAllReferences(Map<Structure, LongSet> structureReferences) {
} }
@Override @Override

View file

@ -1,34 +0,0 @@
package com.jozufozu.flywheel.core.virtual;
import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.data.ModelProperty;
/**
* This model data instance is passed whenever a model is rendered without
* available in-world context. IBakedModel#getModelData can react accordingly
* and avoid looking for model data itself
**/
public enum VirtualEmptyModelData implements IModelData {
INSTANCE;
public static boolean is(IModelData data) {
return data == INSTANCE;
}
@Override
public boolean hasProperty(ModelProperty<?> prop) {
return false;
}
@Override
public <T> T getData(ModelProperty<T> prop) {
return null;
}
@Override
public <T> T setData(ModelProperty<T> prop, T data) {
return null;
}
}

View file

@ -36,10 +36,12 @@ import net.minecraft.world.level.chunk.ChunkSource;
import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.entity.LevelEntityGetter; import net.minecraft.world.level.entity.LevelEntityGetter;
import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.gameevent.GameEvent.Context;
import net.minecraft.world.level.lighting.LevelLightEngine; import net.minecraft.world.level.lighting.LevelLightEngine;
import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import net.minecraft.world.level.storage.WritableLevelData; import net.minecraft.world.level.storage.WritableLevelData;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.scores.Scoreboard; import net.minecraft.world.scores.Scoreboard;
import net.minecraft.world.ticks.LevelTickAccess; import net.minecraft.world.ticks.LevelTickAccess;
@ -68,7 +70,7 @@ public class VirtualRenderWorld extends Level implements FlywheelWorld {
public VirtualRenderWorld(Level level, Vec3i biomeOffset, int height, int minBuildHeight) { public VirtualRenderWorld(Level level, Vec3i biomeOffset, int height, int minBuildHeight) {
super((WritableLevelData) level.getLevelData(), level.dimension(), level.dimensionTypeRegistration(), level::getProfiler, super((WritableLevelData) level.getLevelData(), level.dimension(), level.dimensionTypeRegistration(), level::getProfiler,
true, false, 0); true, false, 0, 0);
this.biomeOffset = biomeOffset; this.biomeOffset = biomeOffset;
this.level = level; this.level = level;
this.height = nextMultipleOf16(height); this.height = nextMultipleOf16(height);
@ -294,6 +296,17 @@ public class VirtualRenderWorld extends Level implements FlywheelWorld {
@Override @Override
public void levelEvent(@Nullable Player player, int type, BlockPos pos, int data) {} public void levelEvent(@Nullable Player player, int type, BlockPos pos, int data) {}
@Override
public void gameEvent(GameEvent p_220404_, Vec3 p_220405_, Context p_220406_) {}
@Override
public void playSeededSound(Player p_220363_, double p_220364_, double p_220365_, double p_220366_,
SoundEvent p_220367_, SoundSource p_220368_, float p_220369_, float p_220370_, long p_220371_) {}
@Override
public void playSeededSound(Player p_220372_, Entity p_220373_, SoundEvent p_220374_, SoundSource p_220375_,
float p_220376_, float p_220377_, long p_220378_) {}
@Override @Override
public void playSound(@Nullable Player player, double x, double y, double z, SoundEvent soundIn, public void playSound(@Nullable Player player, double x, double y, double z, SoundEvent soundIn,
SoundSource category, float volume, float pitch) {} SoundSource category, float volume, float pitch) {}

View file

@ -4,8 +4,8 @@ import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher; import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.EntityJoinLevelEvent;
import net.minecraftforge.event.entity.EntityLeaveWorldEvent; import net.minecraftforge.event.entity.EntityLeaveLevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@ -13,14 +13,14 @@ import net.minecraftforge.fml.common.Mod;
public class EntityWorldHandler { public class EntityWorldHandler {
@SubscribeEvent @SubscribeEvent
public static void onEntityJoinWorld(EntityJoinWorldEvent event) { public static void onEntityJoinWorld(EntityJoinLevelEvent event) {
if (event.getWorld().isClientSide && Backend.isOn()) InstancedRenderDispatcher.getEntities(event.getWorld()) if (event.getLevel().isClientSide && Backend.isOn()) InstancedRenderDispatcher.getEntities(event.getLevel())
.queueAdd(event.getEntity()); .queueAdd(event.getEntity());
} }
@SubscribeEvent @SubscribeEvent
public static void onEntityLeaveWorld(EntityLeaveWorldEvent event) { public static void onEntityLeaveWorld(EntityLeaveLevelEvent event) {
if (event.getWorld().isClientSide && Backend.isOn()) InstancedRenderDispatcher.getEntities(event.getWorld()) if (event.getLevel().isClientSide && Backend.isOn()) InstancedRenderDispatcher.getEntities(event.getLevel())
.remove(event.getEntity()); .remove(event.getEntity());
} }
} }

View file

@ -7,9 +7,9 @@ import com.jozufozu.flywheel.util.WorldAttached;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.CustomizeGuiOverlayEvent;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@ -17,17 +17,15 @@ import net.minecraftforge.fml.common.Mod;
public class ForgeEvents { public class ForgeEvents {
@SubscribeEvent @SubscribeEvent
public static void addToDebugScreen(RenderGameOverlayEvent.Text event) { public static void addToDebugScreen(CustomizeGuiOverlayEvent.DebugText event) {
if (Minecraft.getInstance().options.renderDebug) { if (Minecraft.getInstance().options.renderDebug) {
InstancedRenderDispatcher.getDebugString(event.getRight()); InstancedRenderDispatcher.getDebugString(event.getRight());
} }
} }
@SubscribeEvent @SubscribeEvent
public static void unloadWorld(WorldEvent.Unload event) { public static void unloadWorld(LevelEvent.Unload event) {
WorldAttached.invalidateWorld(event.getWorld()); WorldAttached.invalidateWorld(event.getLevel());
} }
@SubscribeEvent @SubscribeEvent

View file

@ -1,6 +1,6 @@
package com.jozufozu.flywheel.util; package com.jozufozu.flywheel.util;
import net.minecraftforge.client.model.pipeline.LightUtil; import net.minecraftforge.client.model.lighting.QuadLighter;
public class RenderMath { public class RenderMath {
@ -74,13 +74,13 @@ public class RenderMath {
if (!shaded) { if (!shaded) {
return 1f; return 1f;
} }
return LightUtil.diffuseLight(x, y, z); return QuadLighter.calculateShade(x, y, z, false);
} }
public static float diffuseLightNether(float x, float y, float z, boolean shaded) { public static float diffuseLightNether(float x, float y, float z, boolean shaded) {
if (!shaded) { if (!shaded) {
return 0.9f; return 0.9f;
} }
return Math.min(x * x * 0.6f + y * y * 0.9f + z * z * 0.8f, 1f); return QuadLighter.calculateShade(x, y, z, true);
} }
} }