mirror of
https://github.com/JonasunderscoreJones/nicer-skies.git
synced 2025-10-23 03:39:18 +02:00
refactor: static hell is now dynamic hell! fuck oop xdd
This commit is contained in:
parent
885d2b1059
commit
5f77c6d483
4 changed files with 166 additions and 130 deletions
|
@ -0,0 +1,54 @@
|
||||||
|
package codes.ztereohype.example.nebula;
|
||||||
|
|
||||||
|
import codes.ztereohype.example.Gradient;
|
||||||
|
import net.minecraft.util.FastColor;
|
||||||
|
import net.minecraft.util.Mth;
|
||||||
|
import net.minecraft.world.level.levelgen.synth.PerlinNoise;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
|
public class NebulaSkyboxPainter extends SkyboxPainter {
|
||||||
|
private static final float SCALING_FACTOR = 1f;
|
||||||
|
private static final float BASE_NOISE_AMOUNT = 0.7f; // the amount of base noise to keep
|
||||||
|
|
||||||
|
private final Gradient nebulaGradient;
|
||||||
|
|
||||||
|
public NebulaSkyboxPainter(PerlinNoise noise, Gradient nebula_gradient) {
|
||||||
|
super(noise);
|
||||||
|
nebulaGradient = nebula_gradient;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
int getColour(float x, float y, float z) {
|
||||||
|
float[] projCoords = this.projectOnSphere(x, y, z);
|
||||||
|
x = projCoords[0];
|
||||||
|
y = projCoords[1];
|
||||||
|
z = projCoords[2];
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
// 0..1
|
||||||
|
double subtractionValue = Mth.clamp(noise.getOctaveNoise(1).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 / BASE_NOISE_AMOUNT) - (1D / BASE_NOISE_AMOUNT - 1)) * 255D, 1D, 254.99D)); // otherwise death occurs
|
||||||
|
|
||||||
|
alpha = (int) Mth.clamp(alpha - subtractionValue * 128, 0, 255); //todo subtract colour channels separately
|
||||||
|
|
||||||
|
double colourValue = Mth.clamp((alpha / 255D), 0D, 1D);
|
||||||
|
|
||||||
|
Color color = nebulaGradient.getAt(colourValue);
|
||||||
|
|
||||||
|
return FastColor.ARGB32.color(alpha, color.getBlue(), color.getGreen(), color.getRed());
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,16 +1,22 @@
|
||||||
package codes.ztereohype.example.nebula;
|
package codes.ztereohype.example.nebula;
|
||||||
|
|
||||||
|
import codes.ztereohype.example.ExampleMod;
|
||||||
|
import com.mojang.blaze3d.platform.NativeImage;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import com.mojang.blaze3d.vertex.*;
|
import com.mojang.blaze3d.vertex.*;
|
||||||
import com.mojang.math.Matrix4f;
|
import com.mojang.math.Matrix4f;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.minecraft.client.renderer.GameRenderer;
|
import net.minecraft.client.renderer.GameRenderer;
|
||||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
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 class Skybox {
|
||||||
public static final int RESOLUTION = 256;
|
public static final int RESOLUTION = 256;
|
||||||
|
|
||||||
public final DynamicTexture skyTexture = new DynamicTexture(RESOLUTION * 4, RESOLUTION * 4, false);
|
private final DynamicTexture skyTexture = new DynamicTexture(RESOLUTION * 4, RESOLUTION * 4, false);
|
||||||
|
|
||||||
private final @Getter VertexBuffer skyboxBuffer = new VertexBuffer();
|
private final @Getter VertexBuffer skyboxBuffer = new VertexBuffer();
|
||||||
|
|
||||||
|
@ -18,6 +24,7 @@ public class Skybox {
|
||||||
generateVertices();
|
generateVertices();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
public void render(PoseStack poseStack, Matrix4f projectionMatrix) {
|
public void render(PoseStack poseStack, Matrix4f projectionMatrix) {
|
||||||
RenderSystem.setShader(GameRenderer::getPositionTexShader);
|
RenderSystem.setShader(GameRenderer::getPositionTexShader);
|
||||||
RenderSystem.setShaderTexture(0, skyTexture.getId());
|
RenderSystem.setShaderTexture(0, skyTexture.getId());
|
||||||
|
@ -25,7 +32,78 @@ public class Skybox {
|
||||||
this.skyboxBuffer.bind();
|
this.skyboxBuffer.bind();
|
||||||
this.skyboxBuffer.drawWithShader(poseStack.last()
|
this.skyboxBuffer.drawWithShader(poseStack.last()
|
||||||
.pose(), projectionMatrix, GameRenderer.getPositionTexShader());
|
.pose(), projectionMatrix, GameRenderer.getPositionTexShader());
|
||||||
VertexBuffer.unbind();
|
}
|
||||||
|
|
||||||
|
public void paint(SkyboxPainter painter) {
|
||||||
|
NativeImage skyNativeTex = this.skyTexture.getPixels();
|
||||||
|
|
||||||
|
// 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, painter.getColour(x, y, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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, painter.getColour(x, y, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -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, painter.getColour(x, y, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// +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, painter.getColour(x, y, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// +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, painter.getColour(x, y, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -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, painter.getColour(x, y, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.skyTexture.upload();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateVertices() {
|
private void generateVertices() {
|
||||||
|
@ -75,6 +153,5 @@ public class Skybox {
|
||||||
|
|
||||||
skyboxBuffer.bind();
|
skyboxBuffer.bind();
|
||||||
skyboxBuffer.upload(skyboxBuilder.end());
|
skyboxBuffer.upload(skyboxBuilder.end());
|
||||||
// VertexBuffer.unbind();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package codes.ztereohype.example.nebula;
|
||||||
|
|
||||||
|
import net.minecraft.util.Mth;
|
||||||
|
import net.minecraft.world.level.levelgen.synth.PerlinNoise;
|
||||||
|
|
||||||
|
public abstract class SkyboxPainter {
|
||||||
|
protected final PerlinNoise noise;
|
||||||
|
|
||||||
|
SkyboxPainter(PerlinNoise noise) {
|
||||||
|
this.noise = noise;
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract int getColour(float x, float y, float z);
|
||||||
|
|
||||||
|
public float[] projectOnSphere(float x, float y, float z) {
|
||||||
|
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;
|
||||||
|
|
||||||
|
return new float[] {x, y, z};
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,9 @@ package codes.ztereohype.example.star;
|
||||||
|
|
||||||
import codes.ztereohype.example.ExampleMod;
|
import codes.ztereohype.example.ExampleMod;
|
||||||
import codes.ztereohype.example.Gradient;
|
import codes.ztereohype.example.Gradient;
|
||||||
|
import codes.ztereohype.example.nebula.NebulaSkyboxPainter;
|
||||||
import codes.ztereohype.example.nebula.Skybox;
|
import codes.ztereohype.example.nebula.Skybox;
|
||||||
|
import codes.ztereohype.example.nebula.SkyboxPainter;
|
||||||
import com.mojang.blaze3d.platform.NativeImage;
|
import com.mojang.blaze3d.platform.NativeImage;
|
||||||
import com.mojang.blaze3d.vertex.*;
|
import com.mojang.blaze3d.vertex.*;
|
||||||
import net.minecraft.util.FastColor;
|
import net.minecraft.util.FastColor;
|
||||||
|
@ -24,7 +26,6 @@ public class SkyManager {
|
||||||
private static final BufferBuilder starBufferBuilder = Tesselator.getInstance().getBuilder();
|
private static final BufferBuilder starBufferBuilder = Tesselator.getInstance().getBuilder();
|
||||||
|
|
||||||
private static final int STARS = 1500;
|
private static final int STARS = 1500;
|
||||||
private static final float SCALING_FACTOR = 1f;
|
|
||||||
public static ArrayList<Star> starList = new ArrayList<>();
|
public static ArrayList<Star> starList = new ArrayList<>();
|
||||||
|
|
||||||
public static void generateSky() {
|
public static void generateSky() {
|
||||||
|
@ -39,7 +40,10 @@ public class SkyManager {
|
||||||
|
|
||||||
buildGradients();
|
buildGradients();
|
||||||
|
|
||||||
generateNebulaTextures(randomSource);
|
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();
|
starList.clear();
|
||||||
generateStars(randomSource);
|
generateStars(randomSource);
|
||||||
|
@ -72,7 +76,7 @@ public class SkyManager {
|
||||||
float randZ = randomSource.nextFloat() * 2.0F - 1.0F;
|
float randZ = randomSource.nextFloat() * 2.0F - 1.0F;
|
||||||
|
|
||||||
float resizeSpeed = 0.03f + randomSource.nextFloat() * 0.04f;
|
float resizeSpeed = 0.03f + randomSource.nextFloat() * 0.04f;
|
||||||
float spinSpeed = randomSource.nextFloat() * 0.02f - 0.01f; // wtf is this?
|
float spinSpeed = randomSource.nextFloat() * 0.02f - 0.01f;
|
||||||
|
|
||||||
Color starColor = STAR_GRADIENT.getAt(randomSource.nextFloat());
|
Color starColor = STAR_GRADIENT.getAt(randomSource.nextFloat());
|
||||||
|
|
||||||
|
@ -96,130 +100,6 @@ public class SkyManager {
|
||||||
|
|
||||||
starBuffer.bind();
|
starBuffer.bind();
|
||||||
starBuffer.upload(starBufferBuilder.end());
|
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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue