fuck it we're rendering blocks using webgl

This commit is contained in:
2026-05-19 00:15:54 -04:00
parent d440199d4e
commit b802c39334
15 changed files with 80463 additions and 179 deletions
@@ -1,5 +1,6 @@
package dev.plex.request.impl;
import dev.plex.HTTPDModule;
import dev.plex.request.AbstractServlet;
import dev.plex.request.GetMapping;
import dev.plex.request.MappingHeaders;
@@ -9,11 +10,15 @@ import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.regex.Pattern;
public class AssetsEndpoint extends AbstractServlet
{
private static final Pattern TEXTURE_PATH = Pattern.compile("(item|block)/[a-z0-9_]+\\.png");
private static final Pattern TEXTURE_PATH = Pattern.compile("((item|block)/[a-z0-9_]+|entity/shield/[a-z0-9_]+)\\.png");
private static final Pattern MODEL_PATH = Pattern.compile("(item|block)/[a-z0-9_]+\\.json");
private static final Pattern ITEM_DEF_PATH = Pattern.compile("[a-z0-9_]+\\.json");
@GetMapping(endpoint = "/assets/dashboard.js")
@@ -37,6 +42,29 @@ public class AssetsEndpoint extends AbstractServlet
return readFileReal(this.getClass().getResourceAsStream("/httpd/assets/player.js"));
}
@GetMapping(endpoint = "/assets/blockrenderer.js")
@MappingHeaders(headers = {"content-type;application/javascript; charset=utf-8", "cache-control;public, max-age=300"})
public String blockRendererJs(HttpServletRequest request, HttpServletResponse response)
{
return readFileReal(this.getClass().getResourceAsStream("/httpd/assets/blockrenderer.js"));
}
@GetMapping(endpoint = "/assets/three.module.js")
@MappingHeaders(headers = {"content-type;application/javascript; charset=utf-8", "cache-control;public, max-age=86400"})
public String threeJs(HttpServletRequest request, HttpServletResponse response)
{
serveResource("/httpd/assets/three.module.js", response);
return null;
}
@GetMapping(endpoint = "/assets/three.core.js")
@MappingHeaders(headers = {"content-type;application/javascript; charset=utf-8", "cache-control;public, max-age=86400"})
public String threeCoreJs(HttpServletRequest request, HttpServletResponse response)
{
serveResource("/httpd/assets/three.core.js", response);
return null;
}
@GetMapping(endpoint = "/assets/plexlogo.webp")
@MappingHeaders(headers = {"content-type;image/webp", "cache-control;public, max-age=86400"})
public String plexLogo(HttpServletRequest request, HttpServletResponse response)
@@ -49,23 +77,74 @@ public class AssetsEndpoint extends AbstractServlet
@MappingHeaders(headers = {"content-type;image/png", "cache-control;public, max-age=86400"})
public String texture(HttpServletRequest request, HttpServletResponse response)
{
String uri = request.getRequestURI();
String prefix = "/assets/textures/";
if (!uri.startsWith(prefix))
{
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return null;
}
String resourcePath = uri.substring(prefix.length());
if (!TEXTURE_PATH.matcher(resourcePath).matches())
{
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return null;
}
serveResource("/httpd/assets/textures/" + resourcePath, response);
servePathUnder(request, response, "/assets/textures/", TEXTURE_PATH, "textures", "/httpd/assets/textures/");
return null;
}
@GetMapping(endpoint = "/assets/models/")
@MappingHeaders(headers = {"content-type;application/json; charset=utf-8", "cache-control;public, max-age=86400"})
public String model(HttpServletRequest request, HttpServletResponse response)
{
servePathUnder(request, response, "/assets/models/", MODEL_PATH, "models", "/httpd/assets/models/");
return null;
}
@GetMapping(endpoint = "/assets/items/")
@MappingHeaders(headers = {"content-type;application/json; charset=utf-8", "cache-control;public, max-age=86400"})
public String itemDef(HttpServletRequest request, HttpServletResponse response)
{
servePathUnder(request, response, "/assets/items/", ITEM_DEF_PATH, "items", "/httpd/assets/items/");
return null;
}
private static void servePathUnder(HttpServletRequest request, HttpServletResponse response, String urlPrefix, Pattern allowed, String cacheCategory, String resourcePrefix)
{
String uri = request.getRequestURI();
if (!uri.startsWith(urlPrefix))
{
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
String rest = uri.substring(urlPrefix.length());
if (!allowed.matcher(rest).matches())
{
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
if (currentStaff(request) == null)
{
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
if (serveCached(cacheCategory, rest, response))
{
return;
}
serveResource(resourcePrefix + rest, response);
}
private static boolean serveCached(String category, String relativePath, HttpServletResponse response)
{
if (HTTPDModule.getMinecraftAssetsManager() == null)
{
return false;
}
Path path = HTTPDModule.getMinecraftAssetsManager().resolve(category, relativePath);
if (path == null)
{
return false;
}
try (OutputStream out = response.getOutputStream())
{
Files.copy(path, out);
return true;
}
catch (IOException ignored)
{
return false;
}
}
private static void serveResource(String classpathPath, HttpServletResponse response)
{
try (InputStream in = AssetsEndpoint.class.getResourceAsStream(classpathPath);