Fix Flywheel contraption lighting

- Fix some events being registered to the wrong event bus
- Organize some event registration
- Fully fix FluidRenderer
This commit is contained in:
PepperBell 2021-11-10 22:15:26 -08:00
parent 2078899ed9
commit 795ef07b38
13 changed files with 104 additions and 94 deletions

View file

@ -11,7 +11,6 @@ import com.simibubi.create.api.behaviour.BlockSpoutingBehaviour;
import com.simibubi.create.content.CreateItemGroup;
import com.simibubi.create.content.contraptions.TorquePropagator;
import com.simibubi.create.content.contraptions.components.flywheel.engine.FurnaceEngineModifiers;
import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController;
import com.simibubi.create.content.curiosities.weapons.BuiltinPotatoProjectileTypes;
import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler;
import com.simibubi.create.content.palettes.AllPaletteBlocks;
@ -45,8 +44,6 @@ import net.minecraft.world.level.levelgen.placement.FeatureDecorator;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.ForgeMod;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
import net.minecraftforge.event.world.BiomeLoadingEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.DistExecutor;
@ -112,16 +109,13 @@ public class Create {
IEventBus forgeEventBus = MinecraftForge.EVENT_BUS;
modEventBus.addListener(Create::init);
modEventBus.addListener(EventPriority.LOWEST, Create::gatherData);
modEventBus.addGenericListener(Feature.class, AllWorldFeatures::registerOreFeatures);
modEventBus.addGenericListener(FeatureDecorator.class, AllWorldFeatures::registerDecoratorFeatures);
modEventBus.addGenericListener(RecipeSerializer.class, AllRecipeTypes::register);
modEventBus.addGenericListener(ParticleType.class, AllParticleTypes::register);
modEventBus.addGenericListener(SoundEvent.class, AllSoundEvents::register);
modEventBus.addListener(AllConfigs::onLoad);
modEventBus.addListener(AllConfigs::onReload);
modEventBus.addListener(EventPriority.LOWEST, Create::gatherData);
forgeEventBus.addListener(EventPriority.HIGH, Create::onBiomeLoad);
forgeEventBus.register(CHUNK_UTIL);
DistExecutor.unsafeRunWhenOn(Dist.CLIENT,
@ -153,14 +147,6 @@ public class Create {
ProcessingRecipeGen.registerAll(gen);
}
public static void registerCapabilities(RegisterCapabilitiesEvent event) {
event.register(CapabilityMinecartController.class);
}
public static void onBiomeLoad(BiomeLoadingEvent event) {
AllWorldFeatures.reload(event);
}
public static CreateRegistrate registrate() {
return REGISTRATE.get();
}

View file

@ -10,9 +10,7 @@ import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler;
import com.simibubi.create.content.schematics.ClientSchematicLoader;
import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler;
import com.simibubi.create.content.schematics.client.SchematicHandler;
import com.simibubi.create.events.ClientEvents;
import com.simibubi.create.foundation.ClientResourceReloadListener;
import com.simibubi.create.foundation.block.render.SpriteShifter;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.ponder.content.PonderIndex;
@ -58,9 +56,6 @@ public class CreateClient {
public static void onCtorClient(IEventBus modEventBus, IEventBus forgeEventBus) {
modEventBus.addListener(CreateClient::clientInit);
modEventBus.addListener(ClientEvents::loadCompleted);
modEventBus.addListener(SpriteShifter::onTextureStitchPre);
modEventBus.addListener(SpriteShifter::onTextureStitchPost);
modEventBus.addListener(AllParticleTypes::registerFactories);
modEventBus.addListener(CreateContexts::flwInit);
modEventBus.addListener(AllMaterialSpecs::flwInit);

View file

@ -32,6 +32,7 @@ import net.minecraft.client.renderer.RenderType;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@ -110,7 +111,7 @@ public class ContraptionRenderDispatcher {
for (StructureTemplate.StructureBlockInfo info : c.getBlocks()
.values())
// Skip individual lighting updates to prevent lag with large contraptions
renderWorld.setBlock(info.pos, info.state, 128);
renderWorld.setBlock(info.pos, info.state, Block.UPDATE_SUPPRESS_LIGHT);
renderWorld.updateLightSources();
renderWorld.lighter.runUpdates(Integer.MAX_VALUE, false, false);

View file

@ -93,7 +93,7 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
import net.minecraftforge.fmlclient.ConfigGuiHandler;
@EventBusSubscriber(value = Dist.CLIENT)
@EventBusSubscriber(Dist.CLIENT)
public class ClientEvents {
private static final String ITEM_PREFIX = "item." + Create.ID;
@ -341,23 +341,29 @@ public class ClientEvents {
}
}
@SubscribeEvent
public static void registerClientReloadListeners(RegisterClientReloadListenersEvent event) {
event.registerReloadListener(CreateClient.RESOURCE_RELOAD_LISTENER);
}
@EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD)
public static class ModBusEvents {
@SubscribeEvent
public static void addEntityRendererLayers(EntityRenderersEvent.AddLayers event) {
EntityRenderDispatcher dispatcher = Minecraft.getInstance().getEntityRenderDispatcher();
CopperBacktankArmorLayer.registerOnAll(dispatcher);
}
@SubscribeEvent
public static void registerClientReloadListeners(RegisterClientReloadListenersEvent event) {
event.registerReloadListener(CreateClient.RESOURCE_RELOAD_LISTENER);
}
@SubscribeEvent
public static void addEntityRendererLayers(EntityRenderersEvent.AddLayers event) {
EntityRenderDispatcher dispatcher = Minecraft.getInstance().getEntityRenderDispatcher();
CopperBacktankArmorLayer.registerOnAll(dispatcher);
}
@SubscribeEvent
public static void loadCompleted(FMLLoadCompleteEvent event) {
ModContainer createContainer = ModList.get()
.getModContainerById(Create.ID)
.orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted"));
createContainer.registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class,
() -> new ConfigGuiHandler.ConfigGuiFactory((mc, previousScreen) -> BaseConfigScreen.forCreate(previousScreen)));
}
public static void loadCompleted(FMLLoadCompleteEvent event) {
ModContainer createContainer = ModList.get()
.getModContainerById(Create.ID)
.orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted"));
createContainer.registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class,
() -> new ConfigGuiHandler.ConfigGuiFactory((mc, previousScreen) -> BaseConfigScreen.forCreate(previousScreen)));
}
}

View file

@ -19,6 +19,7 @@ import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
import com.simibubi.create.foundation.utility.WorldAttached;
import com.simibubi.create.foundation.utility.recipe.RecipeFinder;
import com.simibubi.create.foundation.worldgen.AllWorldFeatures;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@ -32,6 +33,7 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.FluidState;
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
import net.minecraftforge.event.AddReloadListenerEvent;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.RegisterCommandsEvent;
@ -44,8 +46,10 @@ import net.minecraftforge.event.entity.player.AttackEntityEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.event.world.BlockEvent.FluidPlaceBlockEvent;
import net.minecraftforge.event.world.BiomeLoadingEvent;
import net.minecraftforge.event.world.ChunkEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fmlserverevents.FMLServerStoppingEvent;
@ -172,6 +176,11 @@ public class CommonEvents {
CapabilityMinecartController.startTracking(event);
}
@SubscribeEvent(priority = EventPriority.HIGH)
public static void onBiomeLoad(BiomeLoadingEvent event) {
AllWorldFeatures.reload(event);
}
public static void leftClickEmpty(ServerPlayer player) {
ItemStack stack = player.getMainHandItem();
if (stack.getItem() instanceof ZapperItem) {
@ -179,4 +188,14 @@ public class CommonEvents {
}
}
@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD)
public static class ModBusEvents {
@SubscribeEvent
public static void registerCapabilities(RegisterCapabilitiesEvent event) {
event.register(CapabilityMinecartController.class);
}
}
}

View file

@ -15,17 +15,17 @@ import net.minecraftforge.client.event.InputEvent.MouseScrollEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber(value = Dist.CLIENT)
@EventBusSubscriber(Dist.CLIENT)
public class InputEvents {
@SubscribeEvent
public static void onKeyInput(KeyInputEvent event) {
int key = event.getKey();
boolean pressed = !(event.getAction() == 0);
if (Minecraft.getInstance().screen != null)
return;
int key = event.getKey();
boolean pressed = !(event.getAction() == 0);
CreateClient.SCHEMATIC_HANDLER.onKeyInput(key, pressed);
ToolboxHandlerClient.onKeyInput(key, pressed);
}

View file

@ -10,8 +10,12 @@ import com.simibubi.create.Create;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.InventoryMenu;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD)
public class SpriteShifter {
protected static final Map<String, SpriteShiftEntry> ENTRY_CACHE = new HashMap<>();
@ -35,6 +39,7 @@ public class SpriteShifter {
return ENTRY_CACHE.values().stream().map(SpriteShiftEntry::getTargetResourceLocation).collect(Collectors.toList());
}
@SubscribeEvent
public static void onTextureStitchPre(TextureStitchEvent.Pre event) {
if (!event.getMap()
.location()
@ -45,6 +50,7 @@ public class SpriteShifter {
.forEach(event::addSprite);
}
@SubscribeEvent
public static void onTextureStitchPost(TextureStitchEvent.Post event) {
if (!event.getMap()
.location()

View file

@ -10,10 +10,13 @@ import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.foundation.block.BlockStressValues;
import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.config.ModConfigEvent;
@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD)
public class AllConfigs {
private static final Map<ModConfig.Type, ConfigBase> CONFIGS = new EnumMap<>(ModConfig.Type.class);
@ -50,6 +53,7 @@ public class AllConfigs {
BlockStressValues.registerProvider(context.getActiveNamespace(), SERVER.kinetics.stressValues);
}
@SubscribeEvent
public static void onLoad(ModConfigEvent.Loading event) {
for (ConfigBase config : CONFIGS.values())
if (config.specification == event.getConfig()
@ -57,6 +61,7 @@ public class AllConfigs {
config.onLoad();
}
@SubscribeEvent
public static void onReload(ModConfigEvent.Reloading event) {
for (ConfigBase config : CONFIGS.values())
if (config.specification == event.getConfig()

View file

@ -30,10 +30,10 @@ import net.minecraftforge.fml.config.ModConfig;
public class BaseConfigScreen extends ConfigScreen {
public static final DelegatedStencilElement.ElementRenderer DISABLED_RENDERER = (ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.p(Theme.Key.BUTTON_DISABLE));
private static final Map<String, UnaryOperator<BaseConfigScreen>> defaults = new HashMap<>();
private static final Map<String, UnaryOperator<BaseConfigScreen>> DEFAULTS = new HashMap<>();
static {
defaults.put("create", (base) -> base
DEFAULTS.put(Create.ID, (base) -> base
.withTitles("Client Settings", "World Generation Settings", "Gameplay Settings")
.withSpecs(AllConfigs.CLIENT.specification, AllConfigs.COMMON.specification, AllConfigs.SERVER.specification)
);
@ -52,7 +52,7 @@ public class BaseConfigScreen extends ConfigScreen {
if (modID.equals(Create.ID))
return;
defaults.put(modID, transform);
DEFAULTS.put(modID, transform);
}
public static BaseConfigScreen forCreate(Screen parent) {
@ -79,8 +79,8 @@ public class BaseConfigScreen extends ConfigScreen {
super(parent);
this.modID = modID;
if (defaults.containsKey(modID))
defaults.get(modID).apply(this);
if (DEFAULTS.containsKey(modID))
DEFAULTS.get(modID).apply(this);
else {
this.searchForSpecsInModContainer();
}

View file

@ -106,7 +106,6 @@ public class FluidRenderer {
light = (light & 0xF00000) | luminosity << 4;
Vec3 center = new Vec3(xMin + (xMax - xMin) / 2, yMin + (yMax - yMin) / 2, zMin + (zMax - zMin) / 2);
MatrixTransformStack msr = MatrixTransformStack.of(ms);
ms.pushPose();
if (fluidStack.getFluid()
.getAttributes()
@ -120,27 +119,16 @@ public class FluidRenderer {
if (side == Direction.DOWN && !renderBottom)
continue;
boolean positive = side.getAxisDirection() == AxisDirection.POSITIVE;
if (side.getAxis()
.isHorizontal()) {
ms.pushPose();
if (side.getAxisDirection() == AxisDirection.NEGATIVE) {
msr.translate(center)
.rotateY(180)
.translateBack(center);
side = Direction.get(AxisDirection.POSITIVE, side.getAxis());
}
boolean X = side.getAxis() == Axis.X;
renderTiledHorizontalFace(X ? xMax : zMax, side, X ? zMin : xMin, yMin, X ? zMax : xMax, yMax, builder,
boolean x = side.getAxis() == Axis.X;
renderTiledHorizontalFace(positive ? (x ? xMax : zMax) : (x ? xMin : zMin), side, x ? zMin : xMin, yMin, x ? zMax : xMax, yMax, builder,
ms, light, color, fluidTexture);
ms.popPose();
continue;
} else {
renderTiledVerticalFace(positive ? yMax : yMin, side, xMin, zMin, xMax, zMax, builder, ms,
light, color, fluidTexture);
}
renderTiledVerticalFace(side == Direction.UP ? yMax : yMin, side, xMin, zMin, xMax, zMax, builder, ms,
light, color, fluidTexture);
}
ms.popPose();
@ -149,6 +137,8 @@ public class FluidRenderer {
private static void renderTiledVerticalFace(float y, Direction face, float xMin, float zMin, float xMax, float zMax,
VertexConsumer builder, PoseStack ms, int light, int color, TextureAtlasSprite texture) {
boolean positive = face.getAxisDirection() == Direction.AxisDirection.POSITIVE;
float x2 = 0;
float z2 = 0;
for (float x1 = xMin; x1 < xMax; x1 = x2) {
@ -161,41 +151,40 @@ public class FluidRenderer {
float u2 = texture.getU(x2 == xMax ? local(x2) * 16 : 16);
float v2 = texture.getV(z2 == zMax ? local(z2) * 16 : 16);
putVertex(builder, ms, x1, y, z2, color, u1, v2, face, light);
putVertex(builder, ms, x2, y, z2, color, u2, v2, face, light);
putVertex(builder, ms, x2, y, z1, color, u2, v1, face, light);
putVertex(builder, ms, x1, y, z1, color, u1, v1, face, light);
putVertex(builder, ms, x1, y, positive ? z1 : z2, color, u1, v1, face, light);
putVertex(builder, ms, x1, y, positive ? z2 : z1, color, u1, v2, face, light);
putVertex(builder, ms, x2, y, positive ? z2 : z1, color, u2, v2, face, light);
putVertex(builder, ms, x2, y, positive ? z1 : z2, color, u2, v1, face, light);
}
}
}
private static void renderTiledHorizontalFace(float h, Direction face, float hMin, float yMin, float hMax,
float yMax, VertexConsumer builder, PoseStack ms, int light, int color, TextureAtlasSprite texture) {
boolean X = face.getAxis() == Axis.X;
boolean positive = face.getAxisDirection() == Direction.AxisDirection.POSITIVE;
boolean x = face.getAxis() == Axis.X;
float h2 = 0;
float y2 = 0;
for (float h1 = hMin; h1 < hMax; h1 = h2) {
h2 = Math.min((int) (h1 + 1), hMax);
for (float y1 = yMin; y1 < yMax; y1 = y2) {
y2 = Math.min((int) (y1 + 1), yMax);
int multiplier = texture.getWidth() == 32 ? 8 : 16;
float u1 = texture.getU(local(h1) * multiplier);
float v1 = texture.getV(local(y1) * multiplier);
float u2 = texture.getU(h2 == hMax ? local(h2) * multiplier : multiplier);
float v2 = texture.getV(y2 == yMax ? local(y2) * multiplier : multiplier);
float u1 = texture.getU(local(h1) * 16);
float v1 = texture.getV(local(y1) * 16);
float u2 = texture.getU(h2 == hMax ? local(h2) * 16 : 16);
float v2 = texture.getV(y2 == yMax ? local(y2) * 16 : 16);
float x1 = X ? h : h1;
float x2 = X ? h : h2;
float z1 = X ? h1 : h;
float z2 = X ? h2 : h;
float x1 = x ? h : (positive ? h1 : h2);
float x2 = x ? h : (positive ? h2 : h1);
float z1 = x ? (positive ? h1 : h2) : h;
float z2 = x ? (positive ? h2 : h1) : h;
putVertex(builder, ms, x2, y2, z1, color, u1, v2, face, light);
putVertex(builder, ms, x1, y2, z2, color, u2, v2, face, light);
putVertex(builder, ms, x1, y1, z2, color, u2, v1, face, light);
putVertex(builder, ms, x2, y1, z1, color, u1, v1, face, light);
putVertex(builder, ms, x1, y2, z2, color, u1, v1, face, light);
putVertex(builder, ms, x1, y1, z2, color, u1, v2, face, light);
putVertex(builder, ms, x2, y1, z1, color, u2, v2, face, light);
putVertex(builder, ms, x2, y2, z1, color, u2, v1, face, light);
}
}
}
@ -209,20 +198,19 @@ public class FluidRenderer {
private static void putVertex(VertexConsumer builder, PoseStack ms, float x, float y, float z, int color, float u,
float v, Direction face, int light) {
Vec3i n = face.getNormal();
Vec3i normal = face.getNormal();
Pose peek = ms.last();
int ff = 0xff;
int a = color >> 24 & ff;
int r = color >> 16 & ff;
int g = color >> 8 & ff;
int b = color & ff;
int a = color >> 24 & 0xff;
int r = color >> 16 & 0xff;
int g = color >> 8 & 0xff;
int b = color & 0xff;
builder.vertex(peek.pose(), x, y, z)
.color(r, g, b, a)
.uv(u, v)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(light)
.normal(peek.normal(), n.getX(), n.getY(), n.getZ())
.normal(peek.normal(), normal.getX(), normal.getY(), normal.getZ())
.endVertex();
}

View file

@ -13,6 +13,7 @@ import com.jozufozu.flywheel.backend.source.Resolver;
import com.jozufozu.flywheel.core.WorldContext;
import com.jozufozu.flywheel.event.GatherContextEvent;
import com.jozufozu.flywheel.util.ResourceUtil;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionProgram;
import net.minecraft.resources.ResourceLocation;
@ -21,7 +22,7 @@ import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class CreateContexts {
private static final ResourceLocation CONTRAPTION = new ResourceLocation("create", "context/contraption");
private static final ResourceLocation CONTRAPTION = Create.asResource("context/contraption");
public static WorldContext<ContraptionProgram> CWORLD;
public static WorldContext<ContraptionProgram> STRUCTURE;

View file

@ -12,6 +12,7 @@ import com.jozufozu.flywheel.backend.IFlywheelWorld;
import net.minecraft.core.BlockPos;
import net.minecraft.core.SectionPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
@ -73,7 +74,7 @@ public class PlacementSimulationWorld extends WrappedWorld implements IFlywheelW
lighter.updateSectionStatus(sectionPos, false);
}
if ((flags & 128) == 0) {
if ((flags & Block.UPDATE_SUPPRESS_LIGHT) == 0) {
lighter.checkBlock(pos);
}

View file

@ -1,7 +1,5 @@
#use "flywheel:context/fog.glsl"
out vec3 BoxCoord;
uniform sampler3D uLightVolume;
uniform sampler2D uBlockAtlas;
@ -25,6 +23,8 @@ void FLWFinalizeNormal(inout vec3 normal) {
#if defined(VERTEX_SHADER)
out vec3 BoxCoord;
void FLWFinalizeWorldPos(inout vec4 worldPos) {
worldPos = uModel * worldPos;
@ -40,6 +40,8 @@ void FLWFinalizeWorldPos(inout vec4 worldPos) {
#elif defined(FRAGMENT_SHADER)
#use "flywheel:core/lightutil.glsl"
in vec3 BoxCoord;
out vec4 FragColor;
vec4 FLWBlockTexture(vec2 texCoords) {