Skip to content
2 changes: 2 additions & 0 deletions src/client/java/com/beatcraft/beatmap/Difficulty.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public abstract class Difficulty {
public final ArrayList<AssignTrackParent> assignTrackParents = new ArrayList<>();
public final AssignTrackParentHandler parentHandler = new AssignTrackParentHandler(assignTrackParents, trackLibrary);
public final HashMap<String, JsonArray> pointDefinitions = new HashMap<>();
public final ArrayList<PhysicalChromaGeo> chromaGeometries = new ArrayList<>();

public Environment lightShowEnvironment;

Expand Down Expand Up @@ -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) {
Expand Down
36 changes: 34 additions & 2 deletions src/client/java/com/beatcraft/beatmap/DifficultyV3.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;

Expand All @@ -32,6 +34,8 @@ DifficultyV3 load(JsonObject json) {
loadRotationEvents(json);
loadPointDefinitions(json);
loadCustomEvents(json);
loadChromaMaterials(json);
loadEnvironmentEnhancements(json);
doPostLoad();
return this;
}
Expand Down Expand Up @@ -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())));
}
}
}
}
62 changes: 62 additions & 0 deletions src/client/java/com/beatcraft/beatmap/data/ChromaGeometry.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
36 changes: 36 additions & 0 deletions src/client/java/com/beatcraft/beatmap/data/ChromaMaterial.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<ChromaMaterial> chromaMaterials = new ArrayList<>();

public static void addChromaMaterial(ChromaMaterial chromaMaterial) {
chromaMaterials.add(chromaMaterial);
}
public static List<ChromaMaterial> getChromaMaterials() {
return chromaMaterials;
}
public static ChromaMaterial getChromaMaterial(String name) {
for (ChromaMaterial chromaMaterial : chromaMaterials) {
if (Objects.equals(name, chromaMaterial.getName())){
return chromaMaterial;
}
}
return null;
}
}
59 changes: 59 additions & 0 deletions src/client/java/com/beatcraft/render/object/PhysicalChromaGeo.java
Original file line number Diff line number Diff line change
@@ -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();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "beatcraft:block/filled_light_panel"
}
}