diff options
8 files changed, 131 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; diff --git a/src/main/resources/assets/notenoughupdates/capes/screensaver.png b/src/main/resources/assets/notenoughupdates/capes/screensaver.png Binary files differnew file mode 100644 index 00000000..c6ce9e8c --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/capes/screensaver.png diff --git a/src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png b/src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png Binary files differnew file mode 100644 index 00000000..a7d890f8 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png diff --git a/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.frag b/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.frag new file mode 100644 index 00000000..8985e717 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.frag @@ -0,0 +1,54 @@ +#version 130 + +uniform sampler2D textureIn; +uniform int something; +uniform vec2 dvdPosition; + +//Algorithm by sam hocevar +vec3 rgb2hsv(vec3 c) { + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +//Algorithm by hughsk +vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} +void main() { + vec2 diskUv = vec2(1, 634) / 1024; + vec2 diskSize = vec2(162, 78) / 1024; + float renderScale = 0.5; + vec2 renderSize = diskSize * renderScale; + vec2 positionTopLeft = dvdPosition / 1024; + vec2 positionBottomRight = positionTopLeft + renderSize; + vec4 texture = texture2D(textureIn, gl_TexCoord[0].st); + // vec4 texture = vec4(1.0, 0.0, 1.0, 1.0); + vec2 offset = gl_TexCoord[0].st - positionTopLeft; + + if (0 <= offset.x && offset.x < renderSize.x && 0 <= offset.y && offset.y < renderSize.y) { + vec4 diskTexture = texture2D(textureIn, diskUv + offset / renderScale); + // vec4 diskTexture = vec4(1.0, 0.0, 0.0, 1.0); + if (diskTexture.w > 0.5) { + vec3 hehe = rgb2hsv(diskTexture.xyz); + + float otherHue = float(something) / 255.0; + if (otherHue > 1){ + hehe.x = 1; + } else if (otherHue < 0){ + hehe.x = 0; + } else { + hehe.x = otherHue; + } + + texture = vec4(hsv2rgb(hehe), 1.0); + } + } + gl_FragColor = texture; +} diff --git a/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.vert b/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.vert new file mode 100644 index 00000000..d2bc8e19 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.vert @@ -0,0 +1,6 @@ +#version 120 + +void main() { + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + gl_TexCoord[0] = gl_MultiTexCoord0; +} |