diff options
Diffstat (limited to 'src/main/java')
4 files changed, 71 insertions, 3 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 6b2fd09e..6d4e0d02 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -7,6 +7,7 @@ import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.commands.Commands; import io.github.moulberry.notenoughupdates.core.BackgroundBlur; import io.github.moulberry.notenoughupdates.cosmetics.CapeManager; +import io.github.moulberry.notenoughupdates.cosmetics.ShaderManager; import io.github.moulberry.notenoughupdates.dungeons.DungeonMap; import io.github.moulberry.notenoughupdates.listener.ChatListener; import io.github.moulberry.notenoughupdates.listener.ItemTooltipListener; @@ -241,6 +242,7 @@ public class NotEnoughUpdates { IReloadableResourceManager manager = (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager(); manager.registerReloadListener(CustomSkulls.getInstance()); manager.registerReloadListener(NPCRetexturing.getInstance()); + manager.registerReloadListener(ShaderManager.getInstance()); manager.registerReloadListener(new ItemCustomizeManager.ReloadListener()); manager.registerReloadListener(new CustomBlockSounds.ReloaderListener()); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java index 3f7476bd..18e62706 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java @@ -67,6 +67,7 @@ public class CapeManager { new CapeData("lava", false, false), new CapeData("tunnel", false, false), new CapeData("planets", false, false), + new CapeData("screensaver", false, false), //Admins new CapeData("nullzee", true, false), diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java index da9d1f68..a58587a8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java @@ -18,13 +18,22 @@ import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import org.lwjgl.BufferUtils; import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.*; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL42; +import org.lwjgl.opengl.GL43; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; import java.nio.ByteBuffer; import java.nio.FloatBuffer; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.TreeMap; public class NEUCape { private int currentFrame = 0; @@ -43,6 +52,10 @@ public class NEUCape { private final Random random = new Random(); private long eventMillis; + private float dvdPositionX = 100; + private float dvdPositionY = 100; + private float dvdVelocityX = -10; + private float dvdVelocityY = 10; private float eventLength; private float eventRandom; @@ -101,6 +114,8 @@ public class NEUCape { shaderName = "tunnel"; } else if (capeName.equalsIgnoreCase("planets")) { shaderName = "planets"; + } else if (capeName.equalsIgnoreCase("screensaver")) { + shaderName = "screensaver"; } else { shaderName = "shiny_cape"; } @@ -322,6 +337,9 @@ public class NEUCape { Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight )); + } else if (shaderName.equalsIgnoreCase("screensaver")) { + shaderManager.loadData(shaderId, "something", (int) ((System.currentTimeMillis() / 4) % 256)); + shaderManager.loadData(shaderId, "dvdPosition", new Vector2f(dvdPositionX, dvdPositionY)); } } @@ -530,6 +548,19 @@ public class NEUCape { private int crouchTicks = 0; long startTime = 0; + public float deltaYComparedToLine(float x0, float y0, float x1, float y1) { + float m = (y1 - y0) / (x1 - x0); + float b = y0 - m * x0; + float lineAtX = dvdPositionX * m + b; + return dvdPositionY - lineAtX; + } + + public float projectOntoLine(float x0, float y0, float x1, float y1, float x) { + float m = (y1 - y0) / (x1 - x0); + float b = y0 - m * x0; + return x * m + b; + } + private void updateCape(EntityPlayer player) { Vector3f capeTranslation = updateFixedCapeNodes(player); @@ -546,6 +577,30 @@ public class NEUCape { eventMillis = currentTime; eventLength = random.nextFloat() * 3000 + 3000; } + } else if (shaderName.equals("screensaver")) { + dvdPositionX += dvdVelocityX; + dvdPositionY += dvdVelocityY; + float diskSizeX = 162 / 2F, diskSizeY = 78 / 2F; + // Left line + if (deltaYComparedToLine(0, 404, 47, 0) < 0) { + dvdVelocityX = 10; + dvdPositionX = projectOntoLine(404, 0, 0, 47, dvdPositionY); + } + // Bottom line + if (deltaYComparedToLine(0, 404 - diskSizeY, 292, 404 - diskSizeY) > 0) { + dvdVelocityY = -10; + dvdPositionY = 404 - diskSizeY; + } + // Top line + if (deltaYComparedToLine(47, 0, 246, 0) < 0) { + dvdVelocityY = 10; + dvdPositionY = 0; + } + // Right line + if (deltaYComparedToLine(246 - diskSizeX, 0, 293 - diskSizeX, 404) < 0) { + dvdVelocityX = -10; + dvdPositionX = projectOntoLine(0, 246 - diskSizeX, 404, 293 - diskSizeX, dvdPositionY); + } } double playerAngle = getPlayerRenderAngle(player, 0); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java index 4e934e10..02e8215c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java @@ -1,6 +1,8 @@ package io.github.moulberry.notenoughupdates.cosmetics; import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.IResourceManagerReloadListener; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL43; @@ -14,7 +16,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; -public class ShaderManager { +public class ShaderManager implements IResourceManagerReloadListener { private final ResourceLocation shaderLocation = new ResourceLocation("notenoughupdates:shaders"); private final HashMap<String, Shader> shaderMap = new HashMap<>(); @@ -24,6 +26,14 @@ public class ShaderManager { return INSTANCE; } + @Override + public void onResourceManagerReload(IResourceManager iResourceManager) { + shaderMap.values().forEach(it -> { + GL20.glDeleteProgram(it.program); + }); + shaderMap.clear(); + } + public static class Shader { public final int program; |