feat: quaternion tests

This commit is contained in:
Andrey Terentev 2025-04-07 22:04:03 +07:00
parent 7ebcad5fa7
commit 0efc8dd18d
2 changed files with 77 additions and 11 deletions

View File

@ -1,14 +1,29 @@
package ru.dragonestia.msb3.api.boot; package ru.dragonestia.msb3.api.boot;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.GameMode; import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.metadata.display.BlockDisplayMeta;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
import ru.dragonestia.msb3.api.entity.debug.DebugCollider;
import ru.dragonestia.msb3.api.entity.debug.DebugLine;
import ru.dragonestia.msb3.api.entity.debug.DebugMarker;
import ru.dragonestia.msb3.api.entity.debug.DebugRendererEntity;
import ru.dragonestia.msb3.api.module.FlatWorldModule; import ru.dragonestia.msb3.api.module.FlatWorldModule;
import ru.dragonestia.msb3.api.module.MotdModule; import ru.dragonestia.msb3.api.module.MotdModule;
import ru.dragonestia.msb3.api.module.PrometheusMetricsModule; import ru.dragonestia.msb3.api.module.PrometheusMetricsModule;
import ru.dragonestia.msb3.api.module.ResourcePackRepositoryModule; import ru.dragonestia.msb3.api.module.ResourcePackRepositoryModule;
import ru.dragonestia.msb3.api.math.Quaternion;
import team.unnamed.creative.ResourcePack; import team.unnamed.creative.ResourcePack;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@Log4j2 @Log4j2
public class DefaultBootstrap extends ServerInitializer { public class DefaultBootstrap extends ServerInitializer {
@ -20,7 +35,7 @@ public class DefaultBootstrap extends ServerInitializer {
@Override @Override
public void onDefaultModulesLoaded() { public void onDefaultModulesLoaded() {
MotdModule.init("logo.png", "<gradient:#ff0059:#e06806><bold>msb3 server</bold></gradient>"); MotdModule.init("logo.png", "<gradient:#ff0059:#e06806><bold>msb3 server</bold></gradient>");
FlatWorldModule.init(GameMode.ADVENTURE); FlatWorldModule.init(GameMode.CREATIVE);
PrometheusMetricsModule.init(new InetSocketAddress("0.0.0.0", 7500)); PrometheusMetricsModule.init(new InetSocketAddress("0.0.0.0", 7500));
} }
@ -33,4 +48,54 @@ public class DefaultBootstrap extends ServerInitializer {
public void onResourcePackCompiled(ResourcePack resourcePack) { public void onResourcePackCompiled(ResourcePack resourcePack) {
ResourcePackRepositoryModule.init("0.0.0.0", 7270); ResourcePackRepositoryModule.init("0.0.0.0", 7270);
} }
@Override
public void onServerStarted() {
var instance = FlatWorldModule.getWorld().getInstance();
drawLine(instance, new Pos(0, 12, 10), new Pos(5, 16, 20));
drawLine(instance, new Pos(0, 12, -10), new Pos(5, 16, -20));
drawLine(instance, new Pos(10, 16, 2), new Pos(5, 12, 3));
drawLine(instance, new Pos(9, 20, 10), new Pos(-2, 18, 7));
var collider = new DebugCollider("test", Block.ORANGE_STAINED_GLASS, new Vec(5, 5, 5), Component.text("Collider"));
collider.setInstance(instance, new Vec(30, 11, 10));
}
private static final AtomicInteger I = new AtomicInteger(1);
private void drawLine(Instance instance, Pos startPos, Pos endPos) {
var id = I.getAndIncrement();
{
var marker = new DebugMarker("test", Block.RED_CONCRETE, Component.text("[%s] START".formatted(id)));
marker.setInstance(instance, startPos);
}
{
var marker = new DebugMarker("test", Block.RED_CONCRETE, Component.text("[%s] END".formatted(id)));
marker.setInstance(instance, endPos);
}
var dist = startPos.distance(endPos);
record LineColor(Block block, Vec rot) {}
for (var rot: List.of(
new LineColor(Block.RED_CONCRETE, new Vec(dist, 0.1, 0.1)),
new LineColor(Block.LIME_CONCRETE, new Vec(0.1, dist, 0.1)),
new LineColor(Block.LIGHT_BLUE_CONCRETE, new Vec(0.1, 0.1, dist))
)) {
var entity = new DebugRendererEntity(EntityType.BLOCK_DISPLAY, "test");
var meta = (BlockDisplayMeta) entity.getEntityMeta();
var normal = endPos.sub(startPos).asVec().normalize();
meta.setBlockState(rot.block());
meta.setScale(rot.rot());
var quaternion = Quaternion.DEFAULT // В классе кватерниона уже писать логику для его вычисления
.normalize();
meta.setLeftRotation(quaternion.toFloatArray());
entity.setInstance(instance, startPos);
}
var line = new DebugLine("test", startPos, endPos, NamedTextColor.GOLD);
line.setInstance(instance, startPos);
}
} }

View File

@ -1,18 +1,19 @@
package ru.dragonestia.msb3.api.math; package ru.dragonestia.msb3.api.math;
import net.minestom.server.coordinate.Vec; public record Quaternion(double x, double y, double z, double w) {
public record Quaternion(float w, float x, float y, float z) { public static final Quaternion DEFAULT = new Quaternion(0, 0, 0, 1);
public static Quaternion fromVec(Vec vec, double angle) { public float[] toFloatArray() {
double halfAngle = angle / 2.0; return new float[] { (float) x, (float) y, (float) z, (float) w };
double sinHalfAngle = Math.sin(halfAngle); }
double qX = vec.x() * sinHalfAngle; public double length() {
double qY = vec.y() * sinHalfAngle; return Math.sqrt(x * x + y * y + z * z + w * w);
double qZ = vec.z() * sinHalfAngle; }
double qW = Math.cos(halfAngle);
return new Quaternion((float) qW, (float) qX, (float) qY, (float) qZ); public Quaternion normalize() {
var length = length();
return new Quaternion(x / length, y / length, z / length, w);
} }
} }