From d12988e9143e80270f713f80bc39dbc5e7e4a047 Mon Sep 17 00:00:00 2001 From: ZtereoHYPE <57519662+ZtereoHYPE@users.noreply.github.com> Date: Sun, 11 Sep 2022 13:38:02 +0200 Subject: [PATCH] new: lil refactor --- .../example/StarUpdateBenchmark.java | 194 +++++++-------- .../codes/ztereohype/example/ExampleMod.java | 2 + .../codes/ztereohype/example/Gradient.java | 60 +++++ .../example/mixin/MixinLightTexutre.java | 28 +-- .../example/mixin/MixinStarRendering.java | 65 +---- .../mixin/debug/MixinKeyboardHandler.java | 14 +- .../ztereohype/example/nebula/Skybox.java | 80 +++++++ .../ztereohype/example/sky/StarManager.java | 182 -------------- .../ztereohype/example/star/SkyManager.java | 226 ++++++++++++++++++ .../example/{sky => star}/Star.java | 112 +++++---- .../assets/modid/textures/monkey.png | Bin 0 -> 106845 bytes 11 files changed, 546 insertions(+), 417 deletions(-) create mode 100644 src/main/java/codes/ztereohype/example/Gradient.java create mode 100644 src/main/java/codes/ztereohype/example/nebula/Skybox.java delete mode 100644 src/main/java/codes/ztereohype/example/sky/StarManager.java create mode 100644 src/main/java/codes/ztereohype/example/star/SkyManager.java rename src/main/java/codes/ztereohype/example/{sky => star}/Star.java (73%) create mode 100644 src/main/resources/assets/modid/textures/monkey.png diff --git a/src/jmh/java/codes/ztereohype/example/StarUpdateBenchmark.java b/src/jmh/java/codes/ztereohype/example/StarUpdateBenchmark.java index bdfc960..b7dfca7 100644 --- a/src/jmh/java/codes/ztereohype/example/StarUpdateBenchmark.java +++ b/src/jmh/java/codes/ztereohype/example/StarUpdateBenchmark.java @@ -1,97 +1,97 @@ -package codes.ztereohype.example; - -import codes.ztereohype.example.sky.Star; -import com.mojang.blaze3d.vertex.*; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.levelgen.synth.ImprovedNoise; -import org.openjdk.jmh.annotations.*; - -import java.util.ArrayList; -import java.util.concurrent.TimeUnit; - -@State(Scope.Benchmark) -public class StarUpdateBenchmark { - public ArrayList starList = new ArrayList<>(); - public BufferBuilder starBufferBuilder = Tesselator.getInstance().getBuilder(); - - @Setup(Level.Trial) - public void setUp() { - starBufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - RandomSource randomSource = RandomSource.create(123L); - ImprovedNoise noise = new ImprovedNoise(randomSource); - starList.clear(); - - for (int i = 0; i < 1700; ++i) { - // -1..1 - 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 twinkleSpeed = 0.03f + randomSource.nextFloat() * 0.04f; - - double[] starDerivatives = new double[] {0,0,0}; - float starValue = (float) noise.noiseWithDerivative(randX*3, randY*3, randZ*3, starDerivatives) * 0.5f + 0.5f; - - float maxDerivative = (float) Math.max(Math.abs(starDerivatives[0]), Math.max(Math.abs(starDerivatives[1]), Math.abs(starDerivatives[2]))); //kinda normal distr around 1? - float temperature = maxDerivative * 8000; - - // 0.15..0.25 ??? - float starRadius = 0.15F + randomSource.nextFloat() * 0.15F; - starRadius *= starValue; - - float squaredDistance = randX * randX + randY * randY + randZ * randZ; - - if (squaredDistance < 1.0 && squaredDistance > 0.01 && starRadius > 0.13) { - starList.add(new Star(randX, randY, randZ, starRadius, temperature, twinkleSpeed)); - } else --i; - } - } - - @Warmup(iterations = 1) - @Measurement(iterations = 15, time = 2000, timeUnit = TimeUnit.MILLISECONDS) - @OutputTimeUnit(TimeUnit.MILLISECONDS) - @Benchmark - public void updateStars1() { - starBufferBuilder.clear(); - for (Star star : starList) { - star.tick(134); - star.setVertices(starBufferBuilder); - } - } - - @Warmup(iterations = 1) - @Measurement(iterations = 15, time = 2000, timeUnit = TimeUnit.MILLISECONDS) - @OutputTimeUnit(TimeUnit.MILLISECONDS) - @Benchmark - public void updateStars2() { - starBufferBuilder.clear(); - starList.stream().parallel().forEach(star -> star.tick(134)); - for (Star star : starList) { - star.setVertices(starBufferBuilder); - } - } - - @Warmup(iterations = 1) - @Measurement(iterations = 15, time = 2000, timeUnit = TimeUnit.MILLISECONDS) - @OutputTimeUnit(TimeUnit.MILLISECONDS) - @Benchmark - public void updateStars3() { - starBufferBuilder.clear(); - for (Star star : starList) { - star.tick(134); -// star.setVerticesTwo(starBufferBuilder); - } - } - - @Warmup(iterations = 1) - @Measurement(iterations = 15, time = 2000, timeUnit = TimeUnit.MILLISECONDS) - @OutputTimeUnit(TimeUnit.MILLISECONDS) - @Benchmark - public void updateStars4() { - starBufferBuilder.clear(); - starList.stream().parallel().forEach(star -> star.tick(134)); - for (Star star : starList) { -// star.setVerticesTwo(starBufferBuilder); - } - } -} +//package codes.ztereohype.example; +// +//import codes.ztereohype.example.sky.Star; +//import com.mojang.blaze3d.vertex.*; +//import net.minecraft.util.RandomSource; +//import net.minecraft.world.level.levelgen.synth.ImprovedNoise; +//import org.openjdk.jmh.annotations.*; +// +//import java.util.ArrayList; +//import java.util.concurrent.TimeUnit; +// +//@State(Scope.Benchmark) +//public class StarUpdateBenchmark {, +// public ArrayList starList = new ArrayList<>(); +// public BufferBuilder starBufferBuilder = Tesselator.getInstance().getBuilder(); +// +// @Setup(Level.Trial) +// public void setUp() { +// starBufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); +// RandomSource randomSource = RandomSource.create(123L); +// ImprovedNoise noise = new ImprovedNoise(randomSource); +// starList.clear(); +// +// for (int i = 0; i < 1700; ++i) { +// // -1..1 +// 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 twinkleSpeed = 0.03f + randomSource.nextFloat() * 0.04f; +// +// double[] starDerivatives = new double[] {0,0,0}; +// float starValue = (float) noise.noiseWithDerivative(randX*3, randY*3, randZ*3, starDerivatives) * 0.5f + 0.5f; +// +// float maxDerivative = (float) Math.max(Math.abs(starDerivatives[0]), Math.max(Math.abs(starDerivatives[1]), Math.abs(starDerivatives[2]))); //kinda normal distr around 1? +// float temperature = maxDerivative * 8000; +// +// // 0.15..0.25 ??? +// float starRadius = 0.15F + randomSource.nextFloat() * 0.15F; +// starRadius *= starValue; +// +// float squaredDistance = randX * randX + randY * randY + randZ * randZ; +// +// if (squaredDistance < 1.0 && squaredDistance > 0.01 && starRadius > 0.13) { +// starList.add(new Star(randX, randY, randZ, starRadius, temperature, twinkleSpeed)); +// } else --i; +// } +// } +// +// @Warmup(iterations = 1) +// @Measurement(iterations = 15, time = 2000, timeUnit = TimeUnit.MILLISECONDS) +// @OutputTimeUnit(TimeUnit.MILLISECONDS) +// @Benchmark +// public void updateStars1() { +// starBufferBuilder.clear(); +// for (Star star : starList) { +// star.tick(134); +// star.setVertices(starBufferBuilder); +// } +// } +// +// @Warmup(iterations = 1) +// @Measurement(iterations = 15, time = 2000, timeUnit = TimeUnit.MILLISECONDS) +// @OutputTimeUnit(TimeUnit.MILLISECONDS) +// @Benchmark +// public void updateStars2() { +// starBufferBuilder.clear(); +// starList.stream().parallel().forEach(star -> star.tick(134)); +// for (Star star : starList) { +// star.setVertices(starBufferBuilder); +// } +// } +// +// @Warmup(iterations = 1) +// @Measurement(iterations = 15, time = 2000, timeUnit = TimeUnit.MILLISECONDS) +// @OutputTimeUnit(TimeUnit.MILLISECONDS) +// @Benchmark +// public void updateStars3() { +// starBufferBuilder.clear(); +// for (Star star : starList) { +// star.tick(134); +//// star.setVerticesTwo(starBufferBuilder); +// } +// } +// +// @Warmup(iterations = 1) +// @Measurement(iterations = 15, time = 2000, timeUnit = TimeUnit.MILLISECONDS) +// @OutputTimeUnit(TimeUnit.MILLISECONDS) +// @Benchmark +// public void updateStars4() { +// starBufferBuilder.clear(); +// starList.stream().parallel().forEach(star -> star.tick(134)); +// for (Star star : starList) { +//// star.setVerticesTwo(starBufferBuilder); +// } +// } +//} diff --git a/src/main/java/codes/ztereohype/example/ExampleMod.java b/src/main/java/codes/ztereohype/example/ExampleMod.java index fb45bc8..de8cf15 100644 --- a/src/main/java/codes/ztereohype/example/ExampleMod.java +++ b/src/main/java/codes/ztereohype/example/ExampleMod.java @@ -1,8 +1,10 @@ package codes.ztereohype.example; +import codes.ztereohype.example.nebula.Skybox; import net.fabricmc.api.ModInitializer; public class ExampleMod implements ModInitializer { + public static Skybox nebulaSkybox; public static boolean toggle = true; @Override diff --git a/src/main/java/codes/ztereohype/example/Gradient.java b/src/main/java/codes/ztereohype/example/Gradient.java new file mode 100644 index 0000000..23d87f0 --- /dev/null +++ b/src/main/java/codes/ztereohype/example/Gradient.java @@ -0,0 +1,60 @@ +package codes.ztereohype.example; + +import java.awt.*; +import java.util.Map; +import java.util.TreeMap; + +public class Gradient { + private final TreeMap gradient; + + public Gradient() { + this.gradient = new TreeMap<>(); + } + + public void add(double index, int red, int green, int blue) { + if (index < 0 || index > 1) { + throw new IllegalArgumentException("Index must be between 0 and 1"); + } + + Color color = new Color(red,green,blue); + gradient.put(index, color); + } + + public void remove(double index) { + gradient.remove(index); + } + + public void clear() { + gradient.clear(); + } + + public Color getAt(double value) { + if (value < 0D || value > 1D) { + throw new IllegalArgumentException("Value must be between 0 and 1"); + } + + Map.Entry floorEntry, ceilingEntry; + + floorEntry = gradient.floorEntry(value); + if (floorEntry == null) { // we're under the lowest, return the lowest + return gradient.firstEntry().getValue(); + } + + ceilingEntry = gradient.ceilingEntry(value); + if (ceilingEntry == null) { // we're over the highest, return the highest + return gradient.lastEntry().getValue(); + } + + double ratio = (value - floorEntry.getKey()) / (ceilingEntry.getKey() - floorEntry.getKey()); + double invRatio = 1 - ratio; + + Color firstColor = floorEntry.getValue(); + Color secondColor = ceilingEntry.getValue(); + + long red = Math.round(secondColor.getRed() * ratio + firstColor.getRed() * invRatio); + long green = Math.round(secondColor.getGreen() * ratio + firstColor.getGreen() * invRatio); + long blue = Math.round(secondColor.getBlue() * ratio + firstColor.getBlue() * invRatio); + + return new Color((int)red, (int)green, (int)blue); + } +} \ No newline at end of file diff --git a/src/main/java/codes/ztereohype/example/mixin/MixinLightTexutre.java b/src/main/java/codes/ztereohype/example/mixin/MixinLightTexutre.java index 92b4ae0..fd5c027 100644 --- a/src/main/java/codes/ztereohype/example/mixin/MixinLightTexutre.java +++ b/src/main/java/codes/ztereohype/example/mixin/MixinLightTexutre.java @@ -1,6 +1,5 @@ package codes.ztereohype.example.mixin; -import codes.ztereohype.example.ExampleMod; import com.mojang.math.Vector3f; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LightTexture; @@ -18,25 +17,20 @@ public abstract class MixinLightTexutre { locals = LocalCapture.CAPTURE_FAILHARD ) private void injectWarmLight(float partialTicks, CallbackInfo ci, ClientLevel clientLevel, float f, float g, float h, float i, float j, float l, float k, Vector3f vector3f, float m, Vector3f vector3f2, int n, int o, float p, float q, float r, float s, float t, boolean bl, float v, Vector3f vector3f5) { - //todo: find a way to make a touch more saturated and brighter(?) - if (ExampleMod.toggle) { - Vector3f warmTint = new Vector3f(0.36F, 0.13F, -0.15F); + Vector3f warmTint = new Vector3f(0.36F, 0.13F, -0.15F); - float warmness = o / 15f * // increase w/ blocklight - (1f - vector3f.x() * (1 - n / 15f)) * // decrease in skylight w/ dayness - Math.min((15 - o) / 9f, 1f); // decrease for the 3 highest block light levels + float warmness = o / 15f * // increase w/ blocklight + (1f - vector3f.x() * (1 - n / 15f)) * // decrease in skylight w/ dayness + Math.min((15 - o) / 9f, 1f); // decrease for the 3 highest block light levels - warmTint.mul(warmness); - warmTint.add(1f, 1f, 1f); + warmTint.mul(warmness); + warmTint.add(1f, 1f, 1f); - Vector3f dramaticFactor = vector3f2.copy(); - dramaticFactor.mul(0.20f); - dramaticFactor.add(0.80f, 0.80f, 0.81f); + Vector3f dramaticFactor = vector3f2.copy(); + dramaticFactor.mul(0.20f); + dramaticFactor.add(0.80f, 0.80f, 0.81f); - vector3f2.mul(dramaticFactor.x(), dramaticFactor.y(), dramaticFactor.z()); - vector3f2.mul(warmTint.x(), warmTint.y(), warmTint.z()); - -// if (o == 0 && vector3f.x() < 0.1f) vector3f2.mul(0.96f, 0.96f, 1.05f); //todo: smoothly make night bluer no ifs - } + vector3f2.mul(dramaticFactor.x(), dramaticFactor.y(), dramaticFactor.z()); + vector3f2.mul(warmTint.x(), warmTint.y(), warmTint.z()); } } diff --git a/src/main/java/codes/ztereohype/example/mixin/MixinStarRendering.java b/src/main/java/codes/ztereohype/example/mixin/MixinStarRendering.java index 9bf99ec..9d807a2 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.sky.StarManager; -import com.mojang.blaze3d.systems.RenderSystem; +import codes.ztereohype.example.ExampleMod; +import codes.ztereohype.example.star.SkyManager; import com.mojang.blaze3d.vertex.*; import com.mojang.math.Matrix4f; import net.minecraft.client.Camera; @@ -27,16 +27,16 @@ public abstract class MixinStarRendering { @Inject(at = @At("HEAD"), method = "createStars", cancellable = true) private void generateStars(CallbackInfo ci) { - StarManager.generateSky(); + SkyManager.generateSky(); starBuffer = new VertexBuffer(); - StarManager.updateStars(ticks, starBuffer); + SkyManager.updateStars(ticks, starBuffer); ci.cancel(); } @Inject(at = @At("HEAD"), method = "tick") private void tickStars(CallbackInfo ci) { if (this.level.getStarBrightness(0) < 0.0F) return; - StarManager.updateStars(ticks, starBuffer); + SkyManager.updateStars(ticks, starBuffer); } @ModifyArg( @@ -53,58 +53,7 @@ public abstract class MixinStarRendering { at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;disableTexture()V", ordinal = 2, shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD ) - private void drawNebulas(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) { - Matrix4f matrix = matrix4f2; -// matrix.multiply(projectionMatrix); - - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.setShaderTexture(0, StarManager.skyTexture.getId()); - - BufferBuilder leBufferBuilder = Tesselator.getInstance().getBuilder(); - leBufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - - // +z face - leBufferBuilder.vertex(matrix, -1F, -1F, 1F).uv(0.25f, 0.25f).endVertex(); - leBufferBuilder.vertex(matrix, -1F, 1F, 1F).uv(0.25f, 0.5f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, 1F, 1F).uv(0.5f, 0.5f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, -1F, 1F).uv(0.5f, 0.25f).endVertex(); - - // -z face - leBufferBuilder.vertex(matrix, -1F, -1F, -1F).uv(0.75f, 0.25f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, -1F, -1F).uv(1f, 0.25f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, 1F, -1F).uv(1f, 0.5f).endVertex(); - leBufferBuilder.vertex(matrix, -1F, 1F, -1F).uv(0.75f, 0.5f).endVertex(); - - // bottom face - leBufferBuilder.vertex(matrix, -1F, -1F, -1F).uv(0.5f, 0.5f).endVertex(); - leBufferBuilder.vertex(matrix, -1F, -1F, 1F).uv(0.5f, 0.75f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, -1F, 1F).uv(0.75f, 0.75f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, -1F, -1F).uv(0.75f, 0.5f).endVertex(); - -// leBufferBuilder.vertex(matrix, -1F, -1F, -1F).uv(0f, 0f).endVertex(); -// leBufferBuilder.vertex(matrix, -1F, -1F, 1F).uv(0f, 1f).endVertex(); -// leBufferBuilder.vertex(matrix, 1F, -1F, 1F).uv(1f, 1f).endVertex(); -// leBufferBuilder.vertex(matrix, 1F, -1F, -1F).uv(1f, 0f).endVertex(); - - // top face - leBufferBuilder.vertex(matrix, -1F, 1F, -1F).uv(0.5f, 0f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, 1F, -1F).uv(0.75f, 0f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, 1F, 1F).uv(0.75f, 0.25f).endVertex(); - leBufferBuilder.vertex(matrix, -1F, 1F, 1F).uv(0.5f, 0.25f).endVertex(); - - // +x face - leBufferBuilder.vertex(matrix, 1F, -1F, -1F).uv(0.5f, 0.25f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, -1F, 1F).uv(0.75f, 0.25f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, 1F, 1F).uv(0.75f, 0.5f).endVertex(); - leBufferBuilder.vertex(matrix, 1F, 1F, -1F).uv(0.5f, 0.5f).endVertex(); - - // -x face - leBufferBuilder.vertex(matrix, -1F, -1F, -1F).uv(0f, 0.25f).endVertex(); - leBufferBuilder.vertex(matrix, -1F, 1F, -1F).uv(0f, 0.5f).endVertex(); - leBufferBuilder.vertex(matrix, -1F, 1F, 1F).uv(0.25f, 0.5f).endVertex(); - leBufferBuilder.vertex(matrix, -1F, -1F, 1F).uv(0.25f, 0.25f).endVertex(); - - BufferUploader.drawWithShader(leBufferBuilder.end()); + 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) { + ExampleMod.nebulaSkybox.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 17bcedd..fb47afd 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.sky.StarManager; +import codes.ztereohype.example.star.SkyManager; import net.minecraft.client.KeyboardHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -10,17 +10,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(KeyboardHandler.class) public class MixinKeyboardHandler { - private long cooldown = 0; - @Inject(at = @At("HEAD"), method = "keyPress") private void printKey(long windowPointer, int key, int scanCode, int action, int modifiers, CallbackInfo ci) { - if (key == 92) { - long time = System.currentTimeMillis(); - if (time - cooldown > 200) { - StarManager.generateSky(); - ExampleMod.toggle = !ExampleMod.toggle; - cooldown = time; - } + if (key == 92 && action == 1) { + SkyManager.generateSky(); + ExampleMod.toggle = !ExampleMod.toggle; } } } diff --git a/src/main/java/codes/ztereohype/example/nebula/Skybox.java b/src/main/java/codes/ztereohype/example/nebula/Skybox.java new file mode 100644 index 0000000..047940c --- /dev/null +++ b/src/main/java/codes/ztereohype/example/nebula/Skybox.java @@ -0,0 +1,80 @@ +package codes.ztereohype.example.nebula; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import com.mojang.math.Matrix4f; +import lombok.Getter; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.texture.DynamicTexture; + +public class Skybox { + public static final int RESOLUTION = 256; + + public final DynamicTexture skyTexture = new DynamicTexture(RESOLUTION * 4, RESOLUTION * 4, false); + + private final @Getter VertexBuffer skyboxBuffer = new VertexBuffer(); + + public Skybox() { + generateVertices(); + } + + public void render(PoseStack poseStack, Matrix4f projectionMatrix) { + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderTexture(0, skyTexture.getId()); + + this.skyboxBuffer.bind(); + this.skyboxBuffer.drawWithShader(poseStack.last() + .pose(), projectionMatrix, GameRenderer.getPositionTexShader()); + VertexBuffer.unbind(); + } + + private void generateVertices() { + BufferBuilder skyboxBuilder = Tesselator.getInstance().getBuilder(); + skyboxBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + + // +z face + skyboxBuilder.vertex(-1F, -1F, 1F).uv(0.25f, 0.25f).endVertex(); + skyboxBuilder.vertex(-1F, 1F, 1F).uv(0.25f, 0.5f).endVertex(); + skyboxBuilder.vertex(1F, 1F, 1F).uv(0.5f, 0.5f).endVertex(); + skyboxBuilder.vertex(1F, -1F, 1F).uv(0.5f, 0.25f).endVertex(); + + // -z face + skyboxBuilder.vertex(-1F, -1F, -1F).uv(0.75f, 0.25f).endVertex(); + skyboxBuilder.vertex(1F, -1F, -1F).uv(1f, 0.25f).endVertex(); + skyboxBuilder.vertex(1F, 1F, -1F).uv(1f, 0.5f).endVertex(); + skyboxBuilder.vertex(-1F, 1F, -1F).uv(0.75f, 0.5f).endVertex(); + + // bottom face + skyboxBuilder.vertex(-1F, -1F, -1F).uv(0.5f, 0.5f).endVertex(); + skyboxBuilder.vertex(-1F, -1F, 1F).uv(0.5f, 0.75f).endVertex(); + skyboxBuilder.vertex(1F, -1F, 1F).uv(0.75f, 0.75f).endVertex(); + skyboxBuilder.vertex(1F, -1F, -1F).uv(0.75f, 0.5f).endVertex(); + +// skyboxBuilder.vertex(-1F, -1F, -1F).uv(0f, 0f).endVertex(); +// skyboxBuilder.vertex(-1F, -1F, 1F).uv(0f, 1f).endVertex(); +// skyboxBuilder.vertex(1F, -1F, 1F).uv(1f, 1f).endVertex(); +// skyboxBuilder.vertex(1F, -1F, -1F).uv(1f, 0f).endVertex(); + + // top face + skyboxBuilder.vertex(-1F, 1F, -1F).uv(0.5f, 0f).endVertex(); + skyboxBuilder.vertex(1F, 1F, -1F).uv(0.75f, 0f).endVertex(); + skyboxBuilder.vertex(1F, 1F, 1F).uv(0.75f, 0.25f).endVertex(); + skyboxBuilder.vertex(-1F, 1F, 1F).uv(0.5f, 0.25f).endVertex(); + + // +x face + skyboxBuilder.vertex(1F, -1F, -1F).uv(0.5f, 0.25f).endVertex(); + skyboxBuilder.vertex(1F, -1F, 1F).uv(0.75f, 0.25f).endVertex(); + skyboxBuilder.vertex(1F, 1F, 1F).uv(0.75f, 0.5f).endVertex(); + skyboxBuilder.vertex(1F, 1F, -1F).uv(0.5f, 0.5f).endVertex(); + + // -x face + skyboxBuilder.vertex(-1F, -1F, -1F).uv(0f, 0.25f).endVertex(); + skyboxBuilder.vertex(-1F, 1F, -1F).uv(0f, 0.5f).endVertex(); + skyboxBuilder.vertex(-1F, 1F, 1F).uv(0.25f, 0.5f).endVertex(); + skyboxBuilder.vertex(-1F, -1F, 1F).uv(0.25f, 0.25f).endVertex(); + + skyboxBuffer.bind(); + skyboxBuffer.upload(skyboxBuilder.end()); +// VertexBuffer.unbind(); + } +} diff --git a/src/main/java/codes/ztereohype/example/sky/StarManager.java b/src/main/java/codes/ztereohype/example/sky/StarManager.java deleted file mode 100644 index badab7d..0000000 --- a/src/main/java/codes/ztereohype/example/sky/StarManager.java +++ /dev/null @@ -1,182 +0,0 @@ -package codes.ztereohype.example.sky; - -import codes.ztereohype.example.ExampleMod; -import com.mojang.blaze3d.platform.NativeImage; -import com.mojang.blaze3d.vertex.*; -import net.minecraft.client.renderer.texture.DynamicTexture; -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.util.ArrayList; -import java.util.stream.IntStream; - -public class StarManager { - private static final BufferBuilder starBufferBuilder = Tesselator.getInstance().getBuilder(); - - private static final int STARS = 1500; - private static final int NEBULAS_RESOLUTION = 256; - private static final float SCALING_FACTOR = 1f; - public static ArrayList starList = new ArrayList<>(); - - // ez optimisation: use less vram by using only height 3 (requires pain uv mapping) - public static final DynamicTexture skyTexture = new DynamicTexture(NEBULAS_RESOLUTION * 4, NEBULAS_RESOLUTION * 4, false); - - public static void generateNebulaTextures(RandomSource randomSource) { - PerlinNoise perlinNoise = PerlinNoise.create(randomSource, IntStream.of(1, 2, 3, 4, 5)); - ImprovedNoise distortionNoise = new ImprovedNoise(randomSource); - - // top face - NativeImage skyNativeTex = skyTexture.getPixels(); - for (int texY = 0; texY < NEBULAS_RESOLUTION; texY++) { - for (int texX = 0; texX < NEBULAS_RESOLUTION; texX++) { - float x = (texX / (float) NEBULAS_RESOLUTION) * 2 - 1; - float y = 1; - float z = (texY / (float) NEBULAS_RESOLUTION) * 2 - 1; - - skyNativeTex.setPixelRGBA(texX + 2 * NEBULAS_RESOLUTION, texY, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); - } - } - - // bottom face - for (int texY = 0; texY < NEBULAS_RESOLUTION; texY++) { - for (int texX = 0; texX < NEBULAS_RESOLUTION; texX++) { - float x = (texX / (float) NEBULAS_RESOLUTION) * 2 - 1; - float y = -1; - float z = (texY / (float) NEBULAS_RESOLUTION) * 2 - 1; - - skyNativeTex.setPixelRGBA(texX + 2 * NEBULAS_RESOLUTION, texY + 2 * NEBULAS_RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); - } - } - - // -x face - for (int texY = 0; texY < NEBULAS_RESOLUTION; texY++) { - for (int texX = 0; texX < NEBULAS_RESOLUTION; texX++) { - float x = -1; - float y = (texY / (float) NEBULAS_RESOLUTION) * 2 - 1; - float z = (texX / (float) NEBULAS_RESOLUTION) * 2 - 1; - - skyNativeTex.setPixelRGBA(texX, texY + NEBULAS_RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); - } - } - - // +x face - for (int texY = 0; texY < NEBULAS_RESOLUTION; texY++) { - for (int texX = 0; texX < NEBULAS_RESOLUTION; texX++) { - float x = 1; - float y = (texY / (float) NEBULAS_RESOLUTION) * 2 - 1; - float z = (texX / (float) NEBULAS_RESOLUTION) * 2 - 1; - - skyNativeTex.setPixelRGBA(texX + 2 * NEBULAS_RESOLUTION, texY + NEBULAS_RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); - } - } - - // +z face - for (int texY = 0; texY < NEBULAS_RESOLUTION; texY++) { - for (int texX = 0; texX < NEBULAS_RESOLUTION; texX++) { - float x = (texX / (float) NEBULAS_RESOLUTION) * 2 - 1; - float y = (texY / (float) NEBULAS_RESOLUTION) * 2 - 1; - float z = 1; - - skyNativeTex.setPixelRGBA(texX + NEBULAS_RESOLUTION, texY + NEBULAS_RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); - } - } - - // -z face - for (int texY = 0; texY < NEBULAS_RESOLUTION; texY++) { - for (int texX = 0; texX < NEBULAS_RESOLUTION; texX++) { - float x = (texX / (float) NEBULAS_RESOLUTION) * 2 - 1; - float y = (texY / (float) NEBULAS_RESOLUTION) * 2 - 1; - float z = -1; - - skyNativeTex.setPixelRGBA(texX + 3 * NEBULAS_RESOLUTION, texY + NEBULAS_RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); - } - } - - skyTexture.upload(); - } - - public static int getFunnyColour(float x, float y, float z, PerlinNoise noise, ImprovedNoise distortionNoise) { - float invDistance = Mth.fastInvSqrt(x * x + y * y + z * z); - - //divide by distance to get projection on sphere (shorten the vector) - x *= invDistance; - y *= invDistance; - z *= invDistance; - - float offset = (float) noise.getValue(x * SCALING_FACTOR * 3, y * SCALING_FACTOR * 3, z * SCALING_FACTOR * 3); - - x += offset/6f; - y += offset/6f; - z += offset/6f; - - // 0..1 - double noiseValue = noise.getValue(x * SCALING_FACTOR, y * SCALING_FACTOR, z * SCALING_FACTOR) * 0.5 + 0.5; -// float temperature = (float) (Math.max(Math.max(derivates[0], derivates[1]), derivates[2]) * 2500 + 3500); - - - - int alpha = Mth.clamp((int) (noiseValue * 255) - 128, 0, 128); - - // 0..1 - double colourLerp = (alpha/128.0)*2; - - int red = (int) (Mth.lerp(colourLerp, 1.0, 0.2) * 255); - int green = (int) (Mth.lerp(colourLerp, 0.7, 0.7) * 255); - int blue = (int) (Mth.lerp(colourLerp, 0.2, 0.9) * 255); - - return FastColor.ARGB32.color(alpha, red, green, blue); -// Star.getBlueFromKelvin(noiseLerp*7000), -// Star.getGreenFromKelvin(noiseLerp*7000), -// Star.getRedFromKelvin(noiseLerp*7000)); -// blue, green, red); - } - - public static void generateSky() { - RandomSource randomSource = RandomSource.create(123L); - - generateNebulaTextures(randomSource); - - ImprovedNoise noise = new ImprovedNoise(randomSource); - - starList.clear(); - - 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 twinkleSpeed = 0.03f + randomSource.nextFloat() * 0.04f; - - float temperature = (randomSource.nextFloat() * 10f + 10f) * 600; - - float starRadius = 0.20F + randomSource.nextFloat() * 0.15F; - float starValue = (float) noise.noise(randX*2.5f, randY*2.5f, randZ*2.5f) * 0.55f + 0.45f; - starRadius *= starValue; - - float squaredDistance = randX * randX + randY * randY + randZ * randZ; - - if (squaredDistance < 1.0 && squaredDistance > 0.01 && starRadius > 0.13) { - starList.add(new Star(randX, randY, randZ, starRadius, temperature, twinkleSpeed)); - } else --i; - } - } - - public static void updateStars(int ticks, VertexBuffer starBuffer) { - if (!ExampleMod.toggle) return; - - starBufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - - for (Star star : starList) { - star.tick(ticks); - star.setVertices(starBufferBuilder); - } - - starBuffer.bind(); - starBuffer.upload(starBufferBuilder.end()); - VertexBuffer.unbind(); - } -} - diff --git a/src/main/java/codes/ztereohype/example/star/SkyManager.java b/src/main/java/codes/ztereohype/example/star/SkyManager.java new file mode 100644 index 0000000..b4ccf2e --- /dev/null +++ b/src/main/java/codes/ztereohype/example/star/SkyManager.java @@ -0,0 +1,226 @@ +package codes.ztereohype.example.star; + +import codes.ztereohype.example.ExampleMod; +import codes.ztereohype.example.Gradient; +import codes.ztereohype.example.nebula.Skybox; +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; + private static final float SCALING_FACTOR = 1f; + 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(); + + generateNebulaTextures(randomSource); + + 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; // wtf is this? + + 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()); +// VertexBuffer.unbind(); + } + + public static void generateNebulaTextures(RandomSource randomSource) { + PerlinNoise perlinNoise = PerlinNoise.create(randomSource, IntStream.of(1, 2, 3, 4, 5)); + ImprovedNoise distortionNoise = new ImprovedNoise(randomSource); + NativeImage skyNativeTex = ExampleMod.nebulaSkybox.skyTexture.getPixels(); + +// for (int face = 0; face < 6; ++face) { +// for (int texY = 0; texY < NEBULAS_RESOLUTION; texY++) { +// for (int texX = 0; texX < NEBULAS_RESOLUTION; texX++) { +// float x = (texX / (float) NEBULAS_RESOLUTION) * 2 - 1; +// float y = 1; +// float z = (texY / (float) NEBULAS_RESOLUTION) * 2 - 1; +// +// +// +// skyNativeTex.setPixelRGBA(texX + 2 * NEBULAS_RESOLUTION, texY, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); +// } +// } +// } + + // top face + for (int texY = 0; texY < RESOLUTION; texY++) { + for (int texX = 0; texX < RESOLUTION; texX++) { + float x = (texX / (float) RESOLUTION) * 2 - 1; + float y = 1; + float z = (texY / (float) RESOLUTION) * 2 - 1; + + skyNativeTex.setPixelRGBA(texX + 2 * RESOLUTION, texY, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); + } + } + + // bottom face + for (int texY = 0; texY < RESOLUTION; texY++) { + for (int texX = 0; texX < RESOLUTION; texX++) { + float x = (texX / (float) RESOLUTION) * 2 - 1; + float y = -1; + float z = (texY / (float) RESOLUTION) * 2 - 1; + + skyNativeTex.setPixelRGBA(texX + 2 * RESOLUTION, texY + 2 * RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); + } + } + + // -x face + for (int texY = 0; texY < RESOLUTION; texY++) { + for (int texX = 0; texX < RESOLUTION; texX++) { + float x = -1; + float y = (texY / (float) RESOLUTION) * 2 - 1; + float z = (texX / (float) RESOLUTION) * 2 - 1; + + skyNativeTex.setPixelRGBA(texX, texY + RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); + } + } + + // +x face + for (int texY = 0; texY < RESOLUTION; texY++) { + for (int texX = 0; texX < RESOLUTION; texX++) { + float x = 1; + float y = (texY / (float) RESOLUTION) * 2 - 1; + float z = (texX / (float) RESOLUTION) * 2 - 1; + + skyNativeTex.setPixelRGBA(texX + 2 * RESOLUTION, texY + RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); + } + } + + // +z face + for (int texY = 0; texY < RESOLUTION; texY++) { + for (int texX = 0; texX < RESOLUTION; texX++) { + float x = (texX / (float) RESOLUTION) * 2 - 1; + float y = (texY / (float) RESOLUTION) * 2 - 1; + float z = 1; + + skyNativeTex.setPixelRGBA(texX + RESOLUTION, texY + RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); + } + } + + // -z face + for (int texY = 0; texY < RESOLUTION; texY++) { + for (int texX = 0; texX < RESOLUTION; texX++) { + float x = (texX / (float) RESOLUTION) * 2 - 1; + float y = (texY / (float) RESOLUTION) * 2 - 1; + float z = -1; + + skyNativeTex.setPixelRGBA(texX + 3 * RESOLUTION, texY + RESOLUTION, getFunnyColour(x, y, z, perlinNoise, distortionNoise)); + } + } + + ExampleMod.nebulaSkybox.skyTexture.upload(); + } + + public static int getFunnyColour(float x, float y, float z, PerlinNoise noise, ImprovedNoise subtractionNoise) { + double baseNoiseAmount = 0.7f; // the amount of base noise to keep + + float invDistance = Mth.fastInvSqrt(x * x + y * y + z * z); + + //divide by distance to get projection on sphere (shorten the vector) + x *= invDistance; + y *= invDistance; + z *= invDistance; + + float offset = (float) noise.getValue(x * SCALING_FACTOR * 3, y * SCALING_FACTOR * 3, z * SCALING_FACTOR * 3); + + x += offset/5f; + y += offset/5f; + z += offset/5f; + + // 0..1 + double noiseValue = Mth.clamp(noise.getValue(x * SCALING_FACTOR, y * SCALING_FACTOR, z * SCALING_FACTOR) + 0.5, 0D, 1D); + double subtractionValue = Mth.clamp(subtractionNoise.noise(x * SCALING_FACTOR, y * SCALING_FACTOR, z * SCALING_FACTOR) + 0.5, 0D, 1D); + +// double[] derivates = new double[3]; +// noise.getOctaveNoise(0).noiseWithDerivative(x * SCALING_FACTOR, y * SCALING_FACTOR, z * SCALING_FACTOR, derivates); +// double maxDerivative = Mth.clamp(Math.max(Math.max(derivates[0], derivates[1]), derivates[2]) * 0.5 + 0.5, 0, 0); + + int alpha = (int)(Mth.clamp((noiseValue * (1D / baseNoiseAmount) - (1D / baseNoiseAmount - 1)) * 255D, 1D, 254.99D)); // otherwise death occurs + + alpha = (int) Mth.clamp(alpha - subtractionValue * 255, 0, 255); //todo subtract colour channels separately + + double colourValue = Mth.clamp((alpha / 255D), 0D, 1D); + + Color color = NEBULA_GRADIENT.getAt(colourValue); + + return FastColor.ARGB32.color(alpha, color.getBlue(), color.getGreen(), color.getRed()); +// return FastColor.ARGB32.color(255, 255, 255, 255); + } +} + diff --git a/src/main/java/codes/ztereohype/example/sky/Star.java b/src/main/java/codes/ztereohype/example/star/Star.java similarity index 73% rename from src/main/java/codes/ztereohype/example/sky/Star.java rename to src/main/java/codes/ztereohype/example/star/Star.java index 0bf147a..79a4638 100644 --- a/src/main/java/codes/ztereohype/example/sky/Star.java +++ b/src/main/java/codes/ztereohype/example/star/Star.java @@ -1,8 +1,10 @@ -package codes.ztereohype.example.sky; +package codes.ztereohype.example.star; import com.mojang.blaze3d.vertex.BufferBuilder; import net.minecraft.util.Mth; +import java.awt.*; + public class Star { private final float xCoord; private final float yCoord; @@ -14,7 +16,9 @@ public class Star { private final float latitudeSin; private final float latitudeCos; - private final float twinkleSpeed; + private final float resizeSpeed; + private final float spinSpeed; + private final float minRadius; private final float maxRadius; @@ -25,10 +29,10 @@ public class Star { private float currentAngle; private float currentRadius; - public Star(float randX, float randY, float randZ, float size, float temperature, float twinkleSpeed) { - this.r = getRedFromKelvin(temperature); - this.g = getGreenFromKelvin(temperature); - this.b = getBlueFromKelvin(temperature); + public Star(float randX, float randY, float randZ, float size, Color color, float resizeSpeed, float spinSpeed) { + this.r = color.getRed(); + this.g = color.getGreen(); + this.b = color.getBlue(); float invsqrtDistance = Mth.fastInvSqrt(randX * randX + randY * randY + randZ * randZ); this.xCoord = randX * invsqrtDistance * 100.0F; @@ -43,16 +47,18 @@ public class Star { this.latitudeSin = (float) Math.sin(proj); this.latitudeCos = (float) Math.cos(proj); - this.twinkleSpeed = twinkleSpeed; - this.minRadius = size - 0.13f; - this.maxRadius = size + 0.13f; + this.spinSpeed = spinSpeed; + this.resizeSpeed = resizeSpeed; + + this.minRadius = size - 0.15f; + this.maxRadius = size + 0.15f; this.currentRadius = size; - this.currentAngle = (float) ((twinkleSpeed - 0.03) * 157); // random angle from 0 to 2π + this.currentAngle = (spinSpeed + 0.01f) * 628.3f; // random angle from 0 to 2π } public void tick(int ticks) { - currentAngle += 0.07f * twinkleSpeed; - currentRadius = Mth.lerp(Mth.sin(ticks * twinkleSpeed), minRadius, maxRadius); + currentAngle += spinSpeed; + currentRadius = Mth.lerp(Mth.sin(ticks * resizeSpeed), minRadius, maxRadius); } //return 4*3 coords for 4 vertices @@ -110,45 +116,45 @@ public class Star { } // source: https://tannerhelland.com/2012/09/18/convert-temperature-rgb-algorithm-code.html - public static int getRedFromKelvin(double kelvins) { - kelvins /= 100; - - if (kelvins <= 66) { - return 255; - - } else { - double red = 329.698727446D * Math.pow(kelvins - 60, -0.1332047592D); - return Mth.clamp((int)red, 0, 255); - } - } - - public static int getGreenFromKelvin(double kelvins) { - kelvins /= 100; - - double green; - if (kelvins <= 66) { - green = 99.4708025861D * Math.log(kelvins) - 161.1195681661D; - - } else { - green = 288.1221695283D * Math.pow(kelvins - 60, -0.0755148492D); - } - - return Mth.clamp((int)green, 0, 255); - } - - public static int getBlueFromKelvin(double kelvins) { - kelvins /= 100; - - if (kelvins >= 66) { - return 255; - - } else if (kelvins <= 19){ - return 0; - - } else { - double blue = 138.5177312231D * Math.log(kelvins - 60) - 305.0447927307D; -// double blue = 138.5177312231D * Math.log(kelvins - 60) - 205.0447927307D; - return Mth.clamp((int)blue, 0, 255); - } - } +// public static int getRedFromKelvin(double kelvins) { +// kelvins /= 100; +// +// if (kelvins <= 66) { +// return 255; +// +// } else { +// double red = 329.698727446D * Math.pow(kelvins - 60, -0.1332047592D); +// return Mth.clamp((int)red, 0, 255); +// } +// } +// +// public static int getGreenFromKelvin(double kelvins) { +// kelvins /= 100; +// +// double green; +// if (kelvins <= 66) { +// green = 99.4708025861D * Math.log(kelvins) - 161.1195681661D; +// +// } else { +// green = 288.1221695283D * Math.pow(kelvins - 60, -0.0755148492D); +// } +// +// return Mth.clamp((int)green, 0, 255); +// } +// +// public static int getBlueFromKelvin(double kelvins) { +// kelvins /= 100; +// +// if (kelvins >= 66) { +// return 255; +// +// } else if (kelvins <= 19){ +// return 0; +// +// } else { +// double blue = 138.5177312231D * Math.log(kelvins - 60) - 305.0447927307D; +//// double blue = 138.5177312231D * Math.log(kelvins - 60) - 205.0447927307D; +// return Mth.clamp((int)blue, 0, 255); +// } +// } } diff --git a/src/main/resources/assets/modid/textures/monkey.png b/src/main/resources/assets/modid/textures/monkey.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca5df4173522752d1933a6675c3fd05cfdb7d3c GIT binary patch literal 106845 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 j*;JSF+yGVdu_i%5 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 literal 0 HcmV?d00001