feat: quaternion tests
This commit is contained in:
parent
7ebcad5fa7
commit
0efc8dd18d
@ -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", "<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));
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user