From 0efc8dd18d2517fbd1b682c84d9cbd075345c7b8 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Mon, 7 Apr 2025 22:04:03 +0700 Subject: [PATCH] feat: quaternion tests --- .../msb3/api/boot/DefaultBootstrap.java | 67 ++++++++++++++++++- .../dragonestia/msb3/api/math/Quaternion.java | 21 +++--- 2 files changed, 77 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/ru/dragonestia/msb3/api/boot/DefaultBootstrap.java b/api/src/main/java/ru/dragonestia/msb3/api/boot/DefaultBootstrap.java index edc547a..e7e806c 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/boot/DefaultBootstrap.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/boot/DefaultBootstrap.java @@ -1,14 +1,29 @@ package ru.dragonestia.msb3.api.boot; 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.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.MotdModule; import ru.dragonestia.msb3.api.module.PrometheusMetricsModule; import ru.dragonestia.msb3.api.module.ResourcePackRepositoryModule; +import ru.dragonestia.msb3.api.math.Quaternion; import team.unnamed.creative.ResourcePack; import java.net.InetSocketAddress; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; @Log4j2 public class DefaultBootstrap extends ServerInitializer { @@ -20,7 +35,7 @@ public class DefaultBootstrap extends ServerInitializer { @Override public void onDefaultModulesLoaded() { MotdModule.init("logo.png", "msb3 server"); - FlatWorldModule.init(GameMode.ADVENTURE); + FlatWorldModule.init(GameMode.CREATIVE); PrometheusMetricsModule.init(new InetSocketAddress("0.0.0.0", 7500)); } @@ -33,4 +48,54 @@ public class DefaultBootstrap extends ServerInitializer { public void onResourcePackCompiled(ResourcePack resourcePack) { 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); + } } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/math/Quaternion.java b/api/src/main/java/ru/dragonestia/msb3/api/math/Quaternion.java index 1f49256..9da251b 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/math/Quaternion.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/math/Quaternion.java @@ -1,18 +1,19 @@ 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) { - double halfAngle = angle / 2.0; - double sinHalfAngle = Math.sin(halfAngle); + public float[] toFloatArray() { + return new float[] { (float) x, (float) y, (float) z, (float) w }; + } - double qX = vec.x() * sinHalfAngle; - double qY = vec.y() * sinHalfAngle; - double qZ = vec.z() * sinHalfAngle; - double qW = Math.cos(halfAngle); + public double length() { + return Math.sqrt(x * x + y * y + z * z + w * w); + } - 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); } }