Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 2 additions & 33 deletions src/main/java/twilightforest/client/TwilightForestRenderInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,17 @@
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.DimensionSpecialEffects;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.state.level.LevelRenderState;
import net.minecraft.client.renderer.state.level.SkyRenderState;
import net.minecraft.client.renderer.state.level.WeatherRenderState;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.phys.Vec3;
import net.neoforged.neoforge.client.CustomSkyboxRenderer;
import net.neoforged.neoforge.client.CustomWeatherEffectRenderer;
import org.jetbrains.annotations.Nullable;
import org.joml.Matrix4f;
import org.joml.Matrix4fc;
import twilightforest.client.renderer.TFSkyRenderer;
import twilightforest.client.renderer.TFWeatherRenderer;
import twilightforest.init.TFBiomes;

import java.util.Optional;

public class TwilightForestRenderInfo implements CustomSkyboxRenderer, CustomWeatherEffectRenderer {

Expand All @@ -42,28 +33,6 @@ public class TwilightForestRenderInfo implements CustomSkyboxRenderer, CustomWea
// return biomeFogColor.multiply(daylight * 0.94F + 0.06F, (daylight * 0.94F + 0.06F), (daylight * 0.91F + 0.09F));
// }

@Override
public boolean isFoggyAt(int x, int y) { // true = nearFog

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming this is getting moved to the new effect system

Player player = Minecraft.getInstance().player;

if (player != null) {
Optional<ResourceKey<Biome>> biome = player.level().getBiome(player.blockPosition()).unwrapKey();
if (biome.isPresent()) {
boolean spooky = biome.get() == TFBiomes.SPOOKY_FOREST;

if (player.position().y > 20 && !spooky) {
return false; // If player is above the dark forest then no need to make it so spooky. The darkwood leaves cover everything as low as y42.
}

return spooky || biome.get() == TFBiomes.DARK_FOREST || biome.get() == TFBiomes.DARK_FOREST_CENTER;
}
}

return false;

//Make the fog on these biomes much much darker, maybe pitch black even. Do we keep this harsher fog underground too?
}

@Override
public boolean renderSky(LevelRenderState levelRenderState, SkyRenderState skyRenderState, Matrix4fc modelViewMatrix, Runnable setupFog) {
if (this.skyRenderer == null) {
Expand All @@ -74,11 +43,11 @@ public boolean renderSky(LevelRenderState levelRenderState, SkyRenderState skyRe

@Override
public boolean renderSnowAndRain(LevelRenderState levelRenderState, WeatherRenderState weatherRenderState, MultiBufferSource bufferSource, Vec3 camPos) {
return TFWeatherRenderer.renderSnowAndRain(level, ticks, partialTick, lightTexture, new Vec3(camX, camY, camZ));
return TFWeatherRenderer.renderSnowAndRain(Minecraft.getInstance().level, Minecraft.getInstance().levelRenderer.getTicks(), Minecraft.getInstance().getDeltaTracker().getGameTimeDeltaTicks(), camPos, bufferSource);
}

@Override
public boolean tickRain(ClientLevel level, int ticks, Camera camera) {
return TFWeatherRenderer.tickRain(level, ticks, camera.getBlockPosition());
return TFWeatherRenderer.tickRain(level, ticks, camera.blockPosition());
}
}
92 changes: 35 additions & 57 deletions src/main/java/twilightforest/client/event/CloudEvents.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package twilightforest.client.event;


import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.*;
import net.minecraft.client.Minecraft;
import net.minecraft.client.ParticleStatus;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.rendertype.RenderType;
import net.minecraft.client.renderer.rendertype.RenderTypes;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.server.level.ParticleStatus;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.tags.FluidTags;
Expand All @@ -31,6 +31,7 @@
import twilightforest.block.CloudBlock;
import twilightforest.client.renderer.TFWeatherRenderer;
import twilightforest.config.TFConfig;
import twilightforest.util.MinecraftUtil;
import twilightforest.util.Vec2i;

import java.util.ArrayList;
Expand All @@ -48,7 +49,7 @@ protected static void tickWeatherEffects(ClientTickEvent.Post event) {

if (!mc.isPaused()) {
if (mc.level != null && TFConfig.getClientCloudBlockPrecipitationDistance() > 0) { // Semi vanilla copy of the weather tick, but made to work with cloud blocks instead
Vec3 vec3 = mc.gameRenderer.getMainCamera().getPosition();
Vec3 vec3 = mc.gameRenderer.getMainCamera().position();
if (mc.level.getGameTime() % 10L == 0L) {
RENDER_HELPER.clear();

Expand All @@ -60,7 +61,7 @@ protected static void tickWeatherEffects(ClientTickEvent.Post event) {
int floorY = Mth.floor(camY);
int floorZ = Mth.floor(camZ);

int renderDistance = Minecraft.useFancyGraphics() ? 10 : 5;
int renderDistance = MinecraftUtil.useFancyGraphics() ? 10 : 5;
int precipitationDistance = TFConfig.getClientCloudBlockPrecipitationDistance();
BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos();

Expand Down Expand Up @@ -115,8 +116,8 @@ protected static void tickWeatherEffects(ClientTickEvent.Post event) {
if (!Heightmap.Types.MOTION_BLOCKING.isOpaque().test(mc.level.getBlockState(highestRainyPos.below())))
continue;

if (yetToMakeASound && particlePos != null && randomsource.nextInt(3) < mc.levelRenderer.rainSoundTime++) {
mc.levelRenderer.rainSoundTime = 0;
if (yetToMakeASound && particlePos != null && randomsource.nextInt(3) < mc.levelRenderer.weatherEffectRenderer.rainSoundTime++) {
mc.levelRenderer.weatherEffectRenderer.rainSoundTime = 0;
if (particlePos.getY() > camPos.getY() + 1 && mc.level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, camPos).getY() > Mth.floor((float) camPos.getY())) {
mc.level.playLocalSound(particlePos, SoundEvents.WEATHER_RAIN_ABOVE, SoundSource.WEATHER, 0.1F, 0.5F, false);
} else {
Expand Down Expand Up @@ -149,16 +150,14 @@ protected static void tickWeatherEffects(ClientTickEvent.Post event) {
}
}

protected static void renderPrecipitation(RenderLevelStageEvent event) {
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_WEATHER && TFConfig.getClientCloudBlockPrecipitationDistance() > 0 && !RENDER_HELPER.isEmpty()) {
protected static void renderPrecipitation(RenderLevelStageEvent.AfterWeather event) {
if (TFConfig.getClientCloudBlockPrecipitationDistance() > 0 && !RENDER_HELPER.isEmpty()) {
Minecraft minecraft = Minecraft.getInstance();
if (minecraft.level == null) return;
float partialTick = minecraft.getTimer().getGameTimeDeltaPartialTick(false);
LightTexture lightTexture = minecraft.gameRenderer.lightTexture();
float partialTick = minecraft.getDeltaTracker().getGameTimeDeltaPartialTick(false);
int ticks = minecraft.levelRenderer.getTicks();
lightTexture.turnOnLightLayer();

Vec3 vec3 = event.getCamera().getPosition();
Vec3 vec3 = event.getLevelRenderState().cameraRenderState.pos;
double camX = vec3.x();
double camY = vec3.y();
double camZ = vec3.z();
Expand All @@ -167,18 +166,9 @@ protected static void renderPrecipitation(RenderLevelStageEvent event) {
int floorY = Mth.floor(camY);
int floorZ = Mth.floor(camZ);

Tesselator tesselator = Tesselator.getInstance();
BufferBuilder bufferbuilder = null;
RenderSystem.disableCull();
RenderSystem.enableBlend();
RenderSystem.enableDepthTest();
RenderSystem.depthMask(Minecraft.useShaderTransparency());
int renderDistance = MinecraftUtil.useFancyGraphics() ? 10 : 5;

int renderDistance = Minecraft.useFancyGraphics() ? 10 : 5;

int tesselatorCheck = -1;
float fullTick = (float) ticks + partialTick;
RenderSystem.setShader(GameRenderer::getParticleShader);
BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();

for (PrecipitationRenderHelper helper : RENDER_HELPER) {
Expand All @@ -198,13 +188,7 @@ protected static void renderPrecipitation(RenderLevelStageEvent event) {

RandomSource random = RandomSource.create((long) roofX * roofX * 3121 + roofX * 45238971L ^ (long) roofZ * roofZ * 418711 + roofZ * 13761L);
if (helper.precipitation() == Biome.Precipitation.RAIN) {
if (tesselatorCheck != 0) {
if (tesselatorCheck >= 0) BufferUploader.drawWithShader(bufferbuilder.buildOrThrow());

tesselatorCheck = 0;
RenderSystem.setShaderTexture(0, TFWeatherRenderer.RAIN_TEXTURES);
bufferbuilder = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE);
}
RenderType renderType = RenderTypes.entityTranslucent(TFWeatherRenderer.RAIN_TEXTURES);

int offset = ticks + roofX * roofX * 3121 + roofX * 45238971 + roofZ * roofZ * 418711 + roofZ * 13761 & 31;
float uvOffset = -((float) offset + partialTick) / 32.0F * (3.0F + random.nextFloat());
Expand All @@ -213,20 +197,17 @@ protected static void renderPrecipitation(RenderLevelStageEvent event) {
float distance = (float) Math.sqrt(xDiff * xDiff + zDiff * zDiff) / (float) renderDistance;
float alpha = ((1.0F - distance * distance) * 0.5F + 0.5F) * helper.precipitationLevel();
mutableBlockPos.set(roofX, Math.max(helper.rainOnY(), floorY), roofZ);
int lightColor = LevelRenderer.getLightColor(minecraft.level, mutableBlockPos);
int lightCoords = LevelRenderer.getLightCoords(minecraft.level, mutableBlockPos);

bufferbuilder.addVertex((float) (roofX - camX - rainX + 0.5D), (float) (topY - camY), (float) (roofZ - camZ - rainZ + 0.5D)).setUv(0.0F, (float) botY * 0.25F + uvOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setLight(lightColor);
bufferbuilder.addVertex((float) (roofX - camX + rainX + 0.5D), (float) (topY - camY), (float) (roofZ - camZ + rainZ + 0.5D)).setUv(1.0F, (float) botY * 0.25F + uvOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setLight(lightColor);
bufferbuilder.addVertex((float) (roofX - camX + rainX + 0.5D), (float) (botY - camY), (float) (roofZ - camZ + rainZ + 0.5D)).setUv(1.0F, (float) topY * 0.25F + uvOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setLight(lightColor);
bufferbuilder.addVertex((float) (roofX - camX - rainX + 0.5D), (float) (botY - camY), (float) (roofZ - camZ - rainZ + 0.5D)).setUv(0.0F, (float) topY * 0.25F + uvOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setLight(lightColor);
} else if (helper.precipitation() == Biome.Precipitation.SNOW) {
if (tesselatorCheck != 1) {
if (tesselatorCheck == 0) BufferUploader.drawWithShader(bufferbuilder.buildOrThrow());
MultiBufferSource.BufferSource bufferSource = minecraft.renderBuffers().bufferSource();
VertexConsumer vC = bufferSource.getBuffer(renderType);

tesselatorCheck = 1;
RenderSystem.setShaderTexture(0, TFWeatherRenderer.SNOW_TEXTURES);
bufferbuilder = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE);
}
vC.addVertex(event.getPoseStack().last(), (float) (roofX - camX - rainX + 0.5D), (float) (topY - camY), (float) (roofZ - camZ - rainZ + 0.5D)).setUv(0.0F, (float) botY * 0.25F + uvOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setLight(lightCoords);
vC.addVertex(event.getPoseStack().last(), (float) (roofX - camX + rainX + 0.5D), (float) (topY - camY), (float) (roofZ - camZ + rainZ + 0.5D)).setUv(1.0F, (float) botY * 0.25F + uvOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setLight(lightCoords);
vC.addVertex(event.getPoseStack().last(), (float) (roofX - camX + rainX + 0.5D), (float) (botY - camY), (float) (roofZ - camZ + rainZ + 0.5D)).setUv(1.0F, (float) topY * 0.25F + uvOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setLight(lightCoords);
vC.addVertex(event.getPoseStack().last(), (float) (roofX - camX - rainX + 0.5D), (float) (botY - camY), (float) (roofZ - camZ - rainZ + 0.5D)).setUv(0.0F, (float) topY * 0.25F + uvOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setLight(lightCoords);
} else if (helper.precipitation() == Biome.Precipitation.SNOW) {
RenderType renderType = RenderTypes.entityTranslucent(TFWeatherRenderer.SNOW_TEXTURES);

float offset = -((float) (ticks & 511) + partialTick) / 512.0F;
float uOffset = (float) (random.nextDouble() + (double) fullTick * 0.01D * (double) ((float) random.nextGaussian()));
Expand All @@ -237,24 +218,21 @@ protected static void renderPrecipitation(RenderLevelStageEvent event) {
float alpha = ((1.0F - distance * distance) * 0.3F + 0.5F) * helper.precipitationLevel();
mutableBlockPos.set(roofX, Math.max(helper.rainOnY(), floorY), roofZ);

int lightColor = LevelRenderer.getLightColor(minecraft.level, mutableBlockPos);
int v = lightColor >> 16 & '\uffff';
int u = lightColor & '\uffff';
v = (v * 3 + 240) / 4;
int lightCoords = LevelRenderer.getLightCoords(minecraft.level, mutableBlockPos);
int u = lightCoords & '\uffff';
int v = lightCoords >> 16 & '\uffff';
u = (u * 3 + 240) / 4;
v = (v * 3 + 240) / 4;

MultiBufferSource.BufferSource bufferSource = minecraft.renderBuffers().bufferSource();
VertexConsumer vC = bufferSource.getBuffer(renderType);

bufferbuilder.addVertex((float) (roofX - camX - rainX + 0.5D), (float) (topY - camY), (float) (roofZ - camZ - rainZ + 0.5D)).setUv(0.0F + uOffset, (float) botY * 0.25F + offset + vOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setUv2(u, v);
bufferbuilder.addVertex((float) (roofX - camX + rainX + 0.5D), (float) (topY - camY), (float) (roofZ - camZ + rainZ + 0.5D)).setUv(1.0F + uOffset, (float) botY * 0.25F + offset + vOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setUv2(u, v);
bufferbuilder.addVertex((float) (roofX - camX + rainX + 0.5D), (float) (botY - camY), (float) (roofZ - camZ + rainZ + 0.5D)).setUv(1.0F + uOffset, (float) topY * 0.25F + offset + vOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setUv2(u, v);
bufferbuilder.addVertex((float) (roofX - camX - rainX + 0.5D), (float) (botY - camY), (float) (roofZ - camZ - rainZ + 0.5D)).setUv(0.0F + uOffset, (float) topY * 0.25F + offset + vOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setUv2(u, v);
vC.addVertex(event.getPoseStack().last(), (float) (roofX - camX - rainX + 0.5D), (float) (topY - camY), (float) (roofZ - camZ - rainZ + 0.5D)).setUv(0.0F + uOffset, (float) botY * 0.25F + offset + vOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setUv2(u, v);
vC.addVertex(event.getPoseStack().last(), (float) (roofX - camX + rainX + 0.5D), (float) (topY - camY), (float) (roofZ - camZ + rainZ + 0.5D)).setUv(1.0F + uOffset, (float) botY * 0.25F + offset + vOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setUv2(u, v);
vC.addVertex(event.getPoseStack().last(), (float) (roofX - camX + rainX + 0.5D), (float) (botY - camY), (float) (roofZ - camZ + rainZ + 0.5D)).setUv(1.0F + uOffset, (float) topY * 0.25F + offset + vOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setUv2(u, v);
vC.addVertex(event.getPoseStack().last(), (float) (roofX - camX - rainX + 0.5D), (float) (botY - camY), (float) (roofZ - camZ - rainZ + 0.5D)).setUv(0.0F + uOffset, (float) topY * 0.25F + offset + vOffset).setColor(1.0F, 1.0F, 1.0F, alpha).setUv2(u, v);
}
}

if (tesselatorCheck >= 0) BufferUploader.drawWithShader(bufferbuilder.buildOrThrow());;

RenderSystem.enableCull();
RenderSystem.disableBlend();
lightTexture.turnOffLightLayer();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,20 @@
import net.minecraft.client.renderer.RenderPipelines;
import twilightforest.TwilightForestMod;

import java.util.Optional;

public class TFRenderPipelines {

private static final BlendFunction SHADOW = new BlendFunction(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA);

public static final RenderPipeline RED_THREAD = RenderPipeline.builder(RenderPipelines.MATRICES_FOG_SNIPPET)
.withLocation(TwilightForestMod.prefix("pipeline/red_thread"))
.withLocation(TwilightForestMod.prefix("core/red_thread/red_thread"))
.withSampler("Sampler0")
.withVertexShader(TwilightForestMod.prefix("core/red_thread/red_thread"))
.withFragmentShader(TwilightForestMod.prefix("core/red_thread/red_thread"))
.withVertexFormat(DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS)
.withCull(true)
.withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false))
.withDepthStencilState(Optional.of(new DepthStencilState(CompareOp.ALWAYS_PASS, false)))
.build();

public static final RenderPipeline PROTECTION_BOX = RenderPipeline.builder(RenderPipelines.MATRICES_FOG_SNIPPET)
Expand Down
Loading
Loading