refactor: oriented code towards objects

This commit is contained in:
ZtereoHYPE 2022-09-30 22:11:39 +02:00
parent 5f77c6d483
commit ceb1eea855
10 changed files with 145 additions and 124 deletions

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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")

View file

@ -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;

View file

@ -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;

View file

@ -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<Star> 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());
}
}

View file

@ -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<Star> 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());
}
}