diff --git a/src/client/java/com/beatcraft/beatmap/Difficulty.java b/src/client/java/com/beatcraft/beatmap/Difficulty.java index 17d1c552..52b7410e 100644 --- a/src/client/java/com/beatcraft/beatmap/Difficulty.java +++ b/src/client/java/com/beatcraft/beatmap/Difficulty.java @@ -42,6 +42,7 @@ public abstract class Difficulty { public final ArrayList assignTrackParents = new ArrayList<>(); public final AssignTrackParentHandler parentHandler = new AssignTrackParentHandler(assignTrackParents, trackLibrary); public final HashMap pointDefinitions = new HashMap<>(); + public final ArrayList chromaGeometries = new ArrayList<>(); public Environment lightShowEnvironment; @@ -159,6 +160,7 @@ public void render(MatrixStack matrices, Camera camera) { chainLinkNotes.forEach(o -> o.render(matrices, camera)); obstacles.forEach(o -> o.render(matrices, camera)); arcs.forEach(o -> o.render(matrices, camera)); + chromaGeometries.forEach(o -> o.render(matrices, camera)); } public void seek(float beat) { diff --git a/src/client/java/com/beatcraft/beatmap/DifficultyV3.java b/src/client/java/com/beatcraft/beatmap/DifficultyV3.java index 9090121e..747650d2 100644 --- a/src/client/java/com/beatcraft/beatmap/DifficultyV3.java +++ b/src/client/java/com/beatcraft/beatmap/DifficultyV3.java @@ -1,5 +1,9 @@ package com.beatcraft.beatmap; +import com.beatcraft.BeatCraft; +import com.beatcraft.beatmap.data.ChromaGeometry; +import com.beatcraft.beatmap.data.ChromaMaterial; +import com.beatcraft.beatmap.data.ChromaMaterialManager; import com.beatcraft.beatmap.data.event.AnimateTrack; import com.beatcraft.beatmap.data.event.AssignPathAnimation; import com.beatcraft.beatmap.data.event.AssignTrackParent; @@ -10,9 +14,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import net.minecraft.util.Pair; -import org.joml.Vector2f; -import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -32,6 +34,8 @@ DifficultyV3 load(JsonObject json) { loadRotationEvents(json); loadPointDefinitions(json); loadCustomEvents(json); + loadChromaMaterials(json); + loadEnvironmentEnhancements(json); doPostLoad(); return this; } @@ -173,4 +177,32 @@ private void loadCustomEvent(JsonObject json) { case "AssignTrackParent" -> assignTrackParents.add(new AssignTrackParent().loadV3(json, this)); } } + private void loadEnvironmentEnhancements(JsonObject json) { + if (json.has("customData")) { + JsonObject customData = json.getAsJsonObject("customData"); + if (customData.has("environment")) { + JsonArray environments = customData.getAsJsonArray("environment"); + environments.forEach(o -> loadEnvironmentEnhancement(o.getAsJsonObject())); + } + } + } + + private void loadEnvironmentEnhancement(JsonObject json) { + if (json.has("geometry")) { + ChromaGeometry rawGeo = new ChromaGeometry().loadV3(json,this); + chromaGeometries.add(new PhysicalChromaGeo(rawGeo)); + } else if (json.has("id")) { + BeatCraft.LOGGER.warn("ENVIROMENT ENHANCEMENTS NOT SUPPORTED"); + } + + } + private void loadChromaMaterials(JsonObject json) { + if (json.has("customData")) { + JsonObject customData = json.getAsJsonObject("customData"); + if (customData.has("materials")) { + JsonObject materials = customData.getAsJsonObject("materials"); + materials.asMap().forEach((s, jsonElement) -> ChromaMaterialManager.addChromaMaterial(new ChromaMaterial().load(s,jsonElement.getAsJsonObject()))); + } + } + } } diff --git a/src/client/java/com/beatcraft/beatmap/data/ChromaGeometry.java b/src/client/java/com/beatcraft/beatmap/data/ChromaGeometry.java new file mode 100644 index 00000000..fd69abbb --- /dev/null +++ b/src/client/java/com/beatcraft/beatmap/data/ChromaGeometry.java @@ -0,0 +1,62 @@ +package com.beatcraft.beatmap.data; + +import com.beatcraft.animation.track.Track; +import com.beatcraft.beatmap.Difficulty; +import com.beatcraft.beatmap.data.object.BeatmapObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + + +public class ChromaGeometry extends BeatmapObject{ + public enum GeometryType { + Sphere, + Capsule, + Cylinder, + Cube, + Plane, + Quad, + Triangle + + } + protected GeometryType type; + protected ChromaMaterial material; + protected JsonArray position; + protected JsonArray rotation; + protected JsonArray scale; + protected Track track; + + @Override + public ChromaGeometry loadV3(JsonObject json, Difficulty difficulty) { + super.loadV3(json, difficulty); + + // geometry specific shi + JsonObject geo = json.getAsJsonObject("geometry"); + type = GeometryType.valueOf(geo.get("type").getAsString()); + material = ChromaMaterialManager.getChromaMaterial(geo.get("material").getAsString()); + + // chroma shit + position = json.getAsJsonArray("position"); + rotation = json.getAsJsonArray("rotation"); + scale = json.getAsJsonArray("scale"); + track = difficulty.getTrackLibrary().getOrCreateTrack(json.get("track").getAsString()); + return this; + } + public GeometryType getType() { + return type; + } + public ChromaMaterial getMaterial() { + return material; + } + public JsonArray getPosition() { + return position; + } + public JsonArray getRotation() { + return rotation; + } + public JsonArray getScale() { + return scale; + } + public Track getTrack() { + return track; + } +} diff --git a/src/client/java/com/beatcraft/beatmap/data/ChromaMaterial.java b/src/client/java/com/beatcraft/beatmap/data/ChromaMaterial.java new file mode 100644 index 00000000..0ce9fdd9 --- /dev/null +++ b/src/client/java/com/beatcraft/beatmap/data/ChromaMaterial.java @@ -0,0 +1,36 @@ +package com.beatcraft.beatmap.data; + +import com.beatcraft.BeatCraft; +import com.beatcraft.beatmap.data.object.BeatmapObject; +import com.beatcraft.data.types.Color; +import com.google.gson.JsonObject; + + +public class ChromaMaterial extends BeatmapObject { + // currently shader does nothing, im not doing shaders for this everything will just be unlit :shrug: + protected String shader; + protected Color color; + protected String name; + + public ChromaMaterial load(String matName, JsonObject properties) { + name = matName; + shader = properties.get("shader").toString(); + try{ + color = Color.fromJsonArray(properties.get("color").getAsJsonArray()); + } + catch(NullPointerException e){ + BeatCraft.LOGGER.warn("Material has no color property, defaulting to white"); + color = new Color(255,255,255,1); + } + return this; + } + public String getName(){ + return name; + } + public String getShader() { + return shader; + } + public Color getColor() { + return color; + } +} diff --git a/src/client/java/com/beatcraft/beatmap/data/ChromaMaterialManager.java b/src/client/java/com/beatcraft/beatmap/data/ChromaMaterialManager.java new file mode 100644 index 00000000..2ced28f0 --- /dev/null +++ b/src/client/java/com/beatcraft/beatmap/data/ChromaMaterialManager.java @@ -0,0 +1,24 @@ +package com.beatcraft.beatmap.data; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class ChromaMaterialManager { + private static final List chromaMaterials = new ArrayList<>(); + + public static void addChromaMaterial(ChromaMaterial chromaMaterial) { + chromaMaterials.add(chromaMaterial); + } + public static List getChromaMaterials() { + return chromaMaterials; + } + public static ChromaMaterial getChromaMaterial(String name) { + for (ChromaMaterial chromaMaterial : chromaMaterials) { + if (Objects.equals(name, chromaMaterial.getName())){ + return chromaMaterial; + } + } + return null; + } +} diff --git a/src/client/java/com/beatcraft/render/object/PhysicalChromaGeo.java b/src/client/java/com/beatcraft/render/object/PhysicalChromaGeo.java new file mode 100644 index 00000000..548d13f8 --- /dev/null +++ b/src/client/java/com/beatcraft/render/object/PhysicalChromaGeo.java @@ -0,0 +1,59 @@ +package com.beatcraft.render.object; + +import com.beatcraft.BeatCraft; +import com.beatcraft.audio.BeatmapAudioPlayer; +import com.beatcraft.beatmap.data.ChromaGeometry; +import com.beatcraft.render.WorldRenderer; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.util.ModelIdentifier; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; +import org.joml.Quaternionf; +import org.joml.Vector3f; + + +public class PhysicalChromaGeo extends WorldRenderer { + + private final ChromaGeometry chromaGeometry; + protected BakedModel model; + private Vector3f worldPos = new Vector3f(); + private Quaternionf worldRot = new Quaternionf(); + protected static final float SIZE_SCALAR = 0.5f; + public static final ModelIdentifier cubeID = new ModelIdentifier(Identifier.of(BeatCraft.MOD_ID, "geo_cube"), "inventory"); + private static final int overlay = OverlayTexture.getUv(0, false); + + public PhysicalChromaGeo(ChromaGeometry geo){ + chromaGeometry = geo; + // on instantiation, we should figure out geo, load all the materials etc. so worldRender doesn't have issues + + switch (geo.getType()) { + // for now, everything is cube. + default -> model = mc.getBakedModelManager().getModel(cubeID); + } + } + + + + @Override + protected void worldRender(MatrixStack matrices, VertexConsumer vertexConsumer) { + //this is literally a combination of every single render function I could find what the fuck am I doing + var localPos = matrices.peek(); + worldPos = matrices.peek().getPositionMatrix().getTranslation(worldPos) + .add(mc.gameRenderer.getCamera().getPos().toVector3f()); + worldRot = matrices.peek().getPositionMatrix().getUnnormalizedRotation(worldRot); + matrices.scale(SIZE_SCALAR, SIZE_SCALAR, SIZE_SCALAR); + matrices.translate(-0.5, -0.5, -0.5); + mc.getBlockRenderManager().getModelRenderer().render(localPos, vertexConsumer, null, model, chromaGeometry.getMaterial().getColor().getRed(), chromaGeometry.getMaterial().getColor().getGreen(), chromaGeometry.getMaterial().getColor().getBlue(), 255, overlay); + + + } + + @Override + public boolean shouldRender() { + return BeatmapAudioPlayer.isReady(); + } + +} diff --git a/src/main/resources/assets/beatcraft/models/block/geo_cube.json b/src/main/resources/assets/beatcraft/models/block/geo_cube.json new file mode 100644 index 00000000..47c81137 --- /dev/null +++ b/src/main/resources/assets/beatcraft/models/block/geo_cube.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "beatcraft:block/filled_light_panel" + } +} \ No newline at end of file