aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman / Nea <roman.graef@gmail.com>2022-05-06 15:36:49 +0200
committerGitHub <noreply@github.com>2022-05-06 13:36:49 +0000
commitead065aa1303acc3f6834bcfceb77242702b5622 (patch)
treea298f0f0d7f6a50adf5725d38b530f4022d08bf8
parent43257b6d28934b2ff9651f0a2654c46ea0a909ca (diff)
downloadNotEnoughUpdates-ead065aa1303acc3f6834bcfceb77242702b5622.tar.gz
NotEnoughUpdates-ead065aa1303acc3f6834bcfceb77242702b5622.tar.bz2
NotEnoughUpdates-ead065aa1303acc3f6834bcfceb77242702b5622.zip
Add screensaver cape and make shaders f3+t-able (#125)
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java2
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java1
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java59
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java12
-rw-r--r--src/main/resources/assets/notenoughupdates/capes/screensaver.pngbin0 -> 31381 bytes
-rw-r--r--src/main/resources/assets/notenoughupdates/capes/screensaver_preview.pngbin0 -> 19453 bytes
-rw-r--r--src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.frag54
-rw-r--r--src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.vert6
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
new file mode 100644
index 00000000..c6ce9e8c
--- /dev/null
+++ b/src/main/resources/assets/notenoughupdates/capes/screensaver.png
Binary files differ
diff --git a/src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png b/src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png
new file mode 100644
index 00000000..a7d890f8
--- /dev/null
+++ b/src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png
Binary files differ
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;
+}