diff --git a/src/main/java/codes/ztereohype/example/ExampleMod.java b/src/main/java/codes/ztereohype/example/ExampleMod.java index de8cf15..09426f9 100644 --- a/src/main/java/codes/ztereohype/example/ExampleMod.java +++ b/src/main/java/codes/ztereohype/example/ExampleMod.java @@ -1,13 +1,21 @@ package codes.ztereohype.example; -import codes.ztereohype.example.nebula.Skybox; +import codes.ztereohype.example.sky.SkyManager; +import codes.ztereohype.example.sky.nebula.NebulaSkyboxPainter; +import codes.ztereohype.example.sky.nebula.Skybox; +import com.mojang.realmsclient.util.JsonUtils; import net.fabricmc.api.ModInitializer; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.synth.PerlinNoise; + +import java.util.stream.IntStream; public class ExampleMod implements ModInitializer { - public static Skybox nebulaSkybox; public static boolean toggle = true; + public static SkyManager skyManager = new SkyManager(); @Override public void onInitialize() { + skyManager.generateSky(123L); } } diff --git a/src/main/java/codes/ztereohype/example/mixin/MixinStarRendering.java b/src/main/java/codes/ztereohype/example/mixin/MixinStarRendering.java index ce6c368..a6573e6 100644 --- a/src/main/java/codes/ztereohype/example/mixin/MixinStarRendering.java +++ b/src/main/java/codes/ztereohype/example/mixin/MixinStarRendering.java @@ -1,7 +1,7 @@ package codes.ztereohype.example.mixin; import codes.ztereohype.example.ExampleMod; -import codes.ztereohype.example.star.SkyManager; +import codes.ztereohype.example.sky.star.Starbox; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import com.mojang.math.Matrix4f; @@ -28,16 +28,16 @@ public abstract class MixinStarRendering { @Inject(at = @At("HEAD"), method = "createStars", cancellable = true) private void generateStars(CallbackInfo ci) { - SkyManager.generateSky(); + ExampleMod.skyManager.generateSky(123L); starBuffer = new VertexBuffer(); - SkyManager.updateStars(ticks, starBuffer); + ExampleMod.skyManager.tick(ticks, starBuffer); ci.cancel(); } @Inject(at = @At("HEAD"), method = "tick") private void tickStars(CallbackInfo ci) { if (this.level.getStarBrightness(0) < 0.0F) return; - SkyManager.updateStars(ticks, starBuffer); + ExampleMod.skyManager.tick(ticks, starBuffer); } @ModifyArg( @@ -56,6 +56,6 @@ public abstract class MixinStarRendering { ) private void drawSkybox(PoseStack poseStack, Matrix4f projectionMatrix, float partialTick, Camera camera, boolean bl, Runnable skyFogSetup, CallbackInfo ci, FogType fogType, Vec3 vec3, float f, float g, float h, BufferBuilder bufferBuilder, ShaderInstance shaderInstance, float[] fs, float i, Matrix4f matrix4f2, float k, int r, int s, int m, float t, float o, float p, float q) { RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, level.getStarBrightness(0)); - ExampleMod.nebulaSkybox.render(poseStack, projectionMatrix); + ExampleMod.skyManager.getSkybox().render(poseStack, projectionMatrix); } } diff --git a/src/main/java/codes/ztereohype/example/mixin/debug/MixinKeyboardHandler.java b/src/main/java/codes/ztereohype/example/mixin/debug/MixinKeyboardHandler.java index fb47afd..4be905e 100644 --- a/src/main/java/codes/ztereohype/example/mixin/debug/MixinKeyboardHandler.java +++ b/src/main/java/codes/ztereohype/example/mixin/debug/MixinKeyboardHandler.java @@ -1,7 +1,7 @@ package codes.ztereohype.example.mixin.debug; import codes.ztereohype.example.ExampleMod; -import codes.ztereohype.example.star.SkyManager; +import codes.ztereohype.example.sky.star.Starbox; import net.minecraft.client.KeyboardHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -12,8 +12,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public class MixinKeyboardHandler { @Inject(at = @At("HEAD"), method = "keyPress") private void printKey(long windowPointer, int key, int scanCode, int action, int modifiers, CallbackInfo ci) { + // \ key, keydown action if (key == 92 && action == 1) { - SkyManager.generateSky(); + ExampleMod.skyManager.generateSky(123L); ExampleMod.toggle = !ExampleMod.toggle; } } diff --git a/src/main/java/codes/ztereohype/example/sky/SkyManager.java b/src/main/java/codes/ztereohype/example/sky/SkyManager.java new file mode 100644 index 0000000..2a3c859 --- /dev/null +++ b/src/main/java/codes/ztereohype/example/sky/SkyManager.java @@ -0,0 +1,57 @@ +package codes.ztereohype.example.sky; + +import codes.ztereohype.example.Gradient; +import codes.ztereohype.example.sky.nebula.NebulaSkyboxPainter; +import codes.ztereohype.example.sky.nebula.Skybox; +import codes.ztereohype.example.sky.star.Starbox; +import com.mojang.blaze3d.vertex.VertexBuffer; +import lombok.Getter; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.synth.PerlinNoise; + +import java.util.stream.IntStream; + +public class SkyManager { + private @Getter Starbox starbox; + private @Getter Skybox skybox; + + private final Gradient starGradient = new Gradient(); + private final Gradient nebulaGradient = new Gradient(); + + public void generateSky(long seed) { + nebulaGradient.clear(); + starGradient.clear(); + + buildGradients(); + + RandomSource randomSource = RandomSource.create(seed); //todo: world seed/hash server ip + + PerlinNoise perlinNoise = PerlinNoise.create(randomSource, IntStream.of(1, 2, 3, 4, 5)); + NebulaSkyboxPainter painter = new NebulaSkyboxPainter(perlinNoise, nebulaGradient); + + this.starbox = new Starbox(randomSource, starGradient); + this.skybox = new Skybox(painter); + } + + public void tick(int ticks, VertexBuffer starBuffer) { + this.starbox.updateStars(ticks, starBuffer); + } + + public void buildGradients() { + starGradient.add(0.0f, 255, 179, 97); + starGradient.add(0.2f, 255, 249, 253); + starGradient.add(1.0f, 175, 199, 255); + + nebulaGradient.add(0.2f, 41, 98, 146); + nebulaGradient.add(0.5f, 120, 59, 93); + nebulaGradient.add(0.7f, 209, 72, 103); + nebulaGradient.add(0.8f, 255, 200, 123); + nebulaGradient.add(1.0f, 253, 243, 220); + +// nebula_gradient.add(0.0f, 128, 0, 0); +// nebula_gradient.add(0.4f, 128, 0, 0); +// nebula_gradient.add(0.5f, 128, 0, 0); +// nebula_gradient.add(0.7f, 128, 0, 0); +// nebula_gradient.add(1.0f, 128, 128, 128); + } +} diff --git a/src/main/java/codes/ztereohype/example/nebula/NebulaSkyboxPainter.java b/src/main/java/codes/ztereohype/example/sky/nebula/NebulaSkyboxPainter.java similarity index 97% rename from src/main/java/codes/ztereohype/example/nebula/NebulaSkyboxPainter.java rename to src/main/java/codes/ztereohype/example/sky/nebula/NebulaSkyboxPainter.java index 86c66d2..d3ca0b4 100644 --- a/src/main/java/codes/ztereohype/example/nebula/NebulaSkyboxPainter.java +++ b/src/main/java/codes/ztereohype/example/sky/nebula/NebulaSkyboxPainter.java @@ -1,4 +1,4 @@ -package codes.ztereohype.example.nebula; +package codes.ztereohype.example.sky.nebula; import codes.ztereohype.example.Gradient; import net.minecraft.util.FastColor; diff --git a/src/main/java/codes/ztereohype/example/nebula/Skybox.java b/src/main/java/codes/ztereohype/example/sky/nebula/Skybox.java similarity index 95% rename from src/main/java/codes/ztereohype/example/nebula/Skybox.java rename to src/main/java/codes/ztereohype/example/sky/nebula/Skybox.java index 5648e1d..fbb3314 100644 --- a/src/main/java/codes/ztereohype/example/nebula/Skybox.java +++ b/src/main/java/codes/ztereohype/example/sky/nebula/Skybox.java @@ -1,6 +1,5 @@ -package codes.ztereohype.example.nebula; +package codes.ztereohype.example.sky.nebula; -import codes.ztereohype.example.ExampleMod; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; @@ -8,10 +7,6 @@ import com.mojang.math.Matrix4f; import lombok.Getter; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.texture.DynamicTexture; -import net.minecraft.world.level.levelgen.synth.ImprovedNoise; -import net.minecraft.world.level.levelgen.synth.PerlinNoise; - -import java.util.stream.IntStream; public class Skybox { public static final int RESOLUTION = 256; @@ -20,8 +15,9 @@ public class Skybox { private final @Getter VertexBuffer skyboxBuffer = new VertexBuffer(); - public Skybox() { + public Skybox(SkyboxPainter painter) { generateVertices(); + paint(painter); } @SuppressWarnings("ConstantConditions") diff --git a/src/main/java/codes/ztereohype/example/nebula/SkyboxPainter.java b/src/main/java/codes/ztereohype/example/sky/nebula/SkyboxPainter.java similarity index 93% rename from src/main/java/codes/ztereohype/example/nebula/SkyboxPainter.java rename to src/main/java/codes/ztereohype/example/sky/nebula/SkyboxPainter.java index dccb516..7809b8c 100644 --- a/src/main/java/codes/ztereohype/example/nebula/SkyboxPainter.java +++ b/src/main/java/codes/ztereohype/example/sky/nebula/SkyboxPainter.java @@ -1,4 +1,4 @@ -package codes.ztereohype.example.nebula; +package codes.ztereohype.example.sky.nebula; import net.minecraft.util.Mth; import net.minecraft.world.level.levelgen.synth.PerlinNoise; diff --git a/src/main/java/codes/ztereohype/example/star/Star.java b/src/main/java/codes/ztereohype/example/sky/star/Star.java similarity index 99% rename from src/main/java/codes/ztereohype/example/star/Star.java rename to src/main/java/codes/ztereohype/example/sky/star/Star.java index 5e90cdc..56951ac 100644 --- a/src/main/java/codes/ztereohype/example/star/Star.java +++ b/src/main/java/codes/ztereohype/example/sky/star/Star.java @@ -1,4 +1,4 @@ -package codes.ztereohype.example.star; +package codes.ztereohype.example.sky.star; import com.mojang.blaze3d.vertex.BufferBuilder; import net.minecraft.util.Mth; diff --git a/src/main/java/codes/ztereohype/example/sky/star/Starbox.java b/src/main/java/codes/ztereohype/example/sky/star/Starbox.java new file mode 100644 index 0000000..9a982e0 --- /dev/null +++ b/src/main/java/codes/ztereohype/example/sky/star/Starbox.java @@ -0,0 +1,64 @@ +package codes.ztereohype.example.sky.star; + +import codes.ztereohype.example.Gradient; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.synth.ImprovedNoise; + +import java.awt.*; +import java.util.ArrayList; + +public class Starbox { + private static final BufferBuilder STAR_BUFFER_BUILDER = Tesselator.getInstance().getBuilder(); + + private final int stars = 1500; + private Gradient starGradient; + + private ArrayList starList = new ArrayList<>(); + + public Starbox(RandomSource randomSource, Gradient starGradient) { + this.generate(randomSource, starGradient); + } + + public void generate(RandomSource randomSource, Gradient starGradient) { + starList.clear(); + this.starGradient = starGradient; + generateStars(randomSource); + } + + public void generateStars(RandomSource randomSource) { + ImprovedNoise noise = new ImprovedNoise(randomSource); + + for (int i = 0; i < this.stars; ++i) { + float randX = randomSource.nextFloat() * 2.0F - 1.0F; + float randY = randomSource.nextFloat() * 2.0F - 1.0F; + float randZ = randomSource.nextFloat() * 2.0F - 1.0F; + + float resizeSpeed = 0.03f + randomSource.nextFloat() * 0.04f; + float spinSpeed = randomSource.nextFloat() * 0.02f - 0.01f; + + Color starColor = starGradient.getAt(randomSource.nextFloat()); + + float starRadius = 0.15F + randomSource.nextFloat() * 0.15F; + double starValue = noise.noise(randX*2.5f, randY*2.5f, randZ*2.5f) + 0.5; + + float squaredDistance = randX * randX + randY * randY + randZ * randZ; + if (squaredDistance < 1.0 && squaredDistance > 0.01 && starValue > 0.2) { + starList.add(new Star(randX, randY, randZ, starRadius, starColor, resizeSpeed, spinSpeed)); + } else --i; + } + } + + public void updateStars(int ticks, VertexBuffer starBuffer) { + STAR_BUFFER_BUILDER.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + + for (Star star : starList) { + star.tick(ticks); + star.setVertices(STAR_BUFFER_BUILDER); + } + + starBuffer.bind(); + starBuffer.upload(STAR_BUFFER_BUILDER.end()); + } +} + diff --git a/src/main/java/codes/ztereohype/example/star/SkyManager.java b/src/main/java/codes/ztereohype/example/star/SkyManager.java deleted file mode 100644 index 762b753..0000000 --- a/src/main/java/codes/ztereohype/example/star/SkyManager.java +++ /dev/null @@ -1,105 +0,0 @@ -package codes.ztereohype.example.star; - -import codes.ztereohype.example.ExampleMod; -import codes.ztereohype.example.Gradient; -import codes.ztereohype.example.nebula.NebulaSkyboxPainter; -import codes.ztereohype.example.nebula.Skybox; -import codes.ztereohype.example.nebula.SkyboxPainter; -import com.mojang.blaze3d.platform.NativeImage; -import com.mojang.blaze3d.vertex.*; -import net.minecraft.util.FastColor; -import net.minecraft.util.Mth; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.levelgen.synth.ImprovedNoise; -import net.minecraft.world.level.levelgen.synth.PerlinNoise; - -import java.awt.*; -import java.util.ArrayList; -import java.util.stream.IntStream; - -import static codes.ztereohype.example.nebula.Skybox.RESOLUTION; - -public class SkyManager { - private static final Gradient STAR_GRADIENT = new Gradient(); - private static final Gradient NEBULA_GRADIENT = new Gradient(); - - private static final BufferBuilder starBufferBuilder = Tesselator.getInstance().getBuilder(); - - private static final int STARS = 1500; - public static ArrayList starList = new ArrayList<>(); - - public static void generateSky() { - NEBULA_GRADIENT.clear(); - STAR_GRADIENT.clear(); - - if (ExampleMod.nebulaSkybox == null) { - ExampleMod.nebulaSkybox = new Skybox(); - } - - RandomSource randomSource = RandomSource.create(1234L); //todo: world seed/hash server ip - - buildGradients(); - - PerlinNoise perlinNoise = PerlinNoise.create(randomSource, IntStream.of(1, 2, 3, 4, 5)); - NebulaSkyboxPainter painter = new NebulaSkyboxPainter(perlinNoise, NEBULA_GRADIENT); - - ExampleMod.nebulaSkybox.paint(painter); - - starList.clear(); - generateStars(randomSource); - } - - public static void buildGradients() { - STAR_GRADIENT.add(0.0f, 255, 179, 97); - STAR_GRADIENT.add(0.2f, 255, 249, 253); - STAR_GRADIENT.add(1.0f, 175, 199, 255); - - NEBULA_GRADIENT.add(0.2f, 41, 98, 146); - NEBULA_GRADIENT.add(0.5f, 120, 59, 93); - NEBULA_GRADIENT.add(0.7f, 209, 72, 103); - NEBULA_GRADIENT.add(0.8f, 255, 200, 123); - NEBULA_GRADIENT.add(1.0f, 253, 243, 220); - -// NEBULA_GRADIENT.add(0.0f, 128, 0, 0); -// NEBULA_GRADIENT.add(0.4f, 128, 0, 0); -// NEBULA_GRADIENT.add(0.5f, 128, 0, 0); -// NEBULA_GRADIENT.add(0.7f, 128, 0, 0); -// NEBULA_GRADIENT.add(1.0f, 128, 128, 128); - } - - public static void generateStars(RandomSource randomSource) { - ImprovedNoise noise = new ImprovedNoise(randomSource); - - for (int i = 0; i < STARS; ++i) { - float randX = randomSource.nextFloat() * 2.0F - 1.0F; - float randY = randomSource.nextFloat() * 2.0F - 1.0F; - float randZ = randomSource.nextFloat() * 2.0F - 1.0F; - - float resizeSpeed = 0.03f + randomSource.nextFloat() * 0.04f; - float spinSpeed = randomSource.nextFloat() * 0.02f - 0.01f; - - Color starColor = STAR_GRADIENT.getAt(randomSource.nextFloat()); - - float starRadius = 0.15F + randomSource.nextFloat() * 0.15F; - double starValue = noise.noise(randX*2.5f, randY*2.5f, randZ*2.5f) + 0.5; - - float squaredDistance = randX * randX + randY * randY + randZ * randZ; - if (squaredDistance < 1.0 && squaredDistance > 0.01 && starValue > 0.2) { - starList.add(new Star(randX, randY, randZ, starRadius, starColor, resizeSpeed, spinSpeed)); - } else --i; - } - } - - public static void updateStars(int ticks, VertexBuffer starBuffer) { - starBufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - - for (Star star : starList) { - star.tick(ticks); - star.setVertices(starBufferBuilder); - } - - starBuffer.bind(); - starBuffer.upload(starBufferBuilder.end()); - } -} -