mirror of
https://github.com/XevianLight/Aphelion.git
synced 2026-05-11 01:50:56 +01:00
Basic development
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
package net.xevianlight.aphelion.client.dimension;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.serialization.JsonOps;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.packs.resources.ResourceManager;
|
||||
import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener;
|
||||
import net.minecraft.util.GsonHelper;
|
||||
import net.minecraft.util.profiling.ProfilerFiller;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.xevianlight.aphelion.Aphelion;
|
||||
import net.xevianlight.aphelion.util.Constants;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class AphelionDimensionRenderers extends SimpleJsonResourceReloadListener {
|
||||
|
||||
public AphelionDimensionRenderers() {
|
||||
super(Constants.GSON, "dimension_renderers");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void apply(Map<ResourceLocation, JsonElement> object,
|
||||
ResourceManager resourceManager,
|
||||
ProfilerFiller profiler) {
|
||||
|
||||
Map<ResourceLocation, DimensionRenderer> renderers = new HashMap<>();
|
||||
object.forEach((key, value) -> {
|
||||
JsonObject json = GsonHelper.convertToJsonObject(value, "dimension_renderer");
|
||||
DimensionRenderer renderer = DimensionRenderer.CODEC.parse(JsonOps.INSTANCE, json).getOrThrow();
|
||||
|
||||
// IMPORTANT: use the *resource id* of the json as the lookup key
|
||||
// so "effects": "aphelion:space" maps to space.json automatically.
|
||||
renderers.put(key, renderer);
|
||||
});
|
||||
|
||||
DimensionRendererCache.registerPlanetRenderers(renderers);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package net.xevianlight.aphelion.client.dimension;
|
||||
|
||||
import com.mojang.serialization.Codec;
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.world.level.Level;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public record DimensionRenderer(
|
||||
ResourceKey<Level> dimension,
|
||||
boolean customClouds,
|
||||
boolean customSky,
|
||||
boolean customWeather,
|
||||
boolean hasThickFog,
|
||||
boolean hasFog,
|
||||
int sunriseColor,
|
||||
int sunriseAngle,
|
||||
boolean renderInRain,
|
||||
boolean renderVoidFog,
|
||||
double horizonHeight,
|
||||
float clearColorScale
|
||||
) {
|
||||
public static final Codec<DimensionRenderer> CODEC = RecordCodecBuilder.create(inst -> inst.group(
|
||||
ResourceKey.codec(Registries.DIMENSION).fieldOf("dimension").forGetter(DimensionRenderer::dimension),
|
||||
Codec.BOOL.fieldOf("custom_clouds").forGetter(DimensionRenderer::customClouds),
|
||||
Codec.BOOL.fieldOf("custom_sky").forGetter(DimensionRenderer::customSky),
|
||||
Codec.BOOL.fieldOf("custom_weather").forGetter(DimensionRenderer::customWeather),
|
||||
Codec.BOOL.fieldOf("has_thick_fog").forGetter(DimensionRenderer::hasThickFog),
|
||||
Codec.BOOL.fieldOf("has_fog").forGetter(DimensionRenderer::hasFog),
|
||||
Codec.INT.fieldOf("sunrise_color").forGetter(DimensionRenderer::sunriseColor),
|
||||
Codec.INT.fieldOf("sunrise_angle").forGetter(DimensionRenderer::sunriseAngle),
|
||||
Codec.BOOL.fieldOf("render_in_rain").forGetter(DimensionRenderer::renderInRain),
|
||||
Codec.BOOL.fieldOf("render_void_fog").forGetter(DimensionRenderer::renderVoidFog),
|
||||
Codec.DOUBLE.fieldOf("horizon_height").forGetter(DimensionRenderer::horizonHeight),
|
||||
Codec.FLOAT.fieldOf("clear_color_scale").forGetter(DimensionRenderer::clearColorScale)
|
||||
).apply(inst, DimensionRenderer::new));
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package net.xevianlight.aphelion.client.dimension;
|
||||
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.level.Level;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public final class DimensionRendererCache {
|
||||
|
||||
public static final Map<ResourceLocation, DimensionRenderer> RENDERERS = new HashMap<>();
|
||||
|
||||
public static void registerPlanetRenderers(Map<ResourceLocation, DimensionRenderer> renderers) {
|
||||
RENDERERS.clear();
|
||||
RENDERERS.putAll(renderers);
|
||||
|
||||
}
|
||||
|
||||
public static DimensionRenderer getOrDefault(ResourceLocation id) {
|
||||
return RENDERERS.getOrDefault(id, null);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package net.xevianlight.aphelion.client.dimension;
|
||||
|
||||
import net.minecraft.client.Camera;
|
||||
import net.minecraft.client.multiplayer.ClientLevel;
|
||||
import net.minecraft.client.renderer.DimensionSpecialEffects;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.xevianlight.aphelion.Aphelion;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.joml.Matrix4f;
|
||||
|
||||
public class DimensionSkyEffects extends DimensionSpecialEffects {
|
||||
|
||||
private final ResourceLocation effectsId;
|
||||
|
||||
boolean customSky;
|
||||
|
||||
public DimensionSkyEffects(ResourceLocation effectsId) {
|
||||
super(192, false, SkyType.NORMAL, false, false);
|
||||
this.effectsId = effectsId;
|
||||
}
|
||||
|
||||
private DimensionRenderer renderer() {
|
||||
return DimensionRendererCache.getOrDefault(effectsId);
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public boolean renderVoidFog() {
|
||||
// return true;
|
||||
// }
|
||||
|
||||
|
||||
@Override
|
||||
public boolean renderSky(ClientLevel level, int ticks, float partialTick, Matrix4f modelViewMatrix, Camera camera, Matrix4f projectionMatrix, boolean isFoggy, Runnable setupFog) {
|
||||
return super.renderSky(level, ticks, partialTick, modelViewMatrix, camera, projectionMatrix, isFoggy, setupFog);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vec3 getBrightnessDependentFogColor(Vec3 fogColor, float brightness) {
|
||||
if (renderer().hasFog()) {
|
||||
return fogColor.multiply(
|
||||
brightness * 0.94 + 0.06,
|
||||
brightness * 0.94 + 0.06,
|
||||
brightness * 0.91 + 0.09);
|
||||
}
|
||||
return Vec3.ZERO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFoggyAt(int x, int z) {
|
||||
return renderer().hasThickFog();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable float[] getSunriseColor(float timeOfDay, float partialTicks) {
|
||||
return new float[]{0,0,0,0};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package net.xevianlight.aphelion.client.dimension;
|
||||
|
||||
public class DimensionSkyRenderer {
|
||||
|
||||
DimensionRenderer renderer;
|
||||
|
||||
DimensionSkyRenderer(DimensionRenderer renderer) { this.renderer = renderer; }
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package net.xevianlight.aphelion.client.dimension;
|
||||
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
|
||||
public record OrbitSkyDefinition(
|
||||
ResourceLocation id,
|
||||
Vec3 skyColor
|
||||
|
||||
) {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package net.xevianlight.aphelion.client.dimension;
|
||||
|
||||
import net.minecraft.client.Camera;
|
||||
import net.minecraft.client.multiplayer.ClientLevel;
|
||||
import net.minecraft.client.renderer.DimensionSpecialEffects;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.xevianlight.aphelion.Aphelion;
|
||||
import org.joml.Matrix4f;
|
||||
|
||||
public class SpaceSkyEffects extends DimensionSpecialEffects {
|
||||
|
||||
public SpaceSkyEffects() {
|
||||
super(192, false, SkyType.NORMAL, false, false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public boolean renderSky(ClientLevel level, int ticks, float partialTick, Matrix4f modelViewMatrix, Camera camera, Matrix4f projectionMatrix, boolean isFoggy, Runnable setupFog) {
|
||||
ResourceLocation id = orbitForPos(net.minecraft.client.Minecraft.getInstance()
|
||||
.gameRenderer.getMainCamera().getPosition());
|
||||
// Aphelion.LOGGER.info("Loaded dimension_renderers: {}", DimensionRendererCache.getOrDefault(id).toString());
|
||||
// Return true, meaning we are rendering the sky ourselves. Vanilla will not draw its sky.
|
||||
if (DimensionRendererCache.getOrDefault(id).customSky())
|
||||
return true;
|
||||
return super.renderSky(level, ticks, partialTick, modelViewMatrix, camera, projectionMatrix, isFoggy, setupFog);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vec3 getBrightnessDependentFogColor(Vec3 fogColor, float brightness) {
|
||||
ResourceLocation id = orbitForPos(net.minecraft.client.Minecraft.getInstance()
|
||||
.gameRenderer.getMainCamera().getPosition());
|
||||
if (DimensionRendererCache.getOrDefault(id).hasFog()) {
|
||||
return fogColor.multiply(
|
||||
brightness * 0.94 + 0.06,
|
||||
brightness * 0.94 + 0.06,
|
||||
brightness * 0.91 + 0.09);
|
||||
}
|
||||
return Vec3.ZERO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFoggyAt(int i, int i1) {
|
||||
ResourceLocation id = orbitForPos(net.minecraft.client.Minecraft.getInstance()
|
||||
.gameRenderer.getMainCamera().getPosition());
|
||||
|
||||
return DimensionRendererCache.getOrDefault(id).hasThickFog();
|
||||
}
|
||||
|
||||
public static ResourceLocation orbitForPos(Vec3 pos) {
|
||||
double r = Math.sqrt(pos.x * pos.x + pos.z * pos.z);
|
||||
|
||||
if (r < 100) return ResourceLocation.fromNamespaceAndPath(Aphelion.MOD_ID, "orbit/earth");
|
||||
if (r < 200) return ResourceLocation.fromNamespaceAndPath(Aphelion.MOD_ID, "orbit/mars");
|
||||
if (r < 300) return ResourceLocation.fromNamespaceAndPath(Aphelion.MOD_ID, "orbit/venus");
|
||||
|
||||
return ResourceLocation.fromNamespaceAndPath(Aphelion.MOD_ID, "orbit/default");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user