Compare commits

...

2 Commits

Author SHA1 Message Date
238776cfde Zwischenstand 2026-10-22 08:15:41 +02:00
60741d3116 Kampfsystem für Zweihänder vorerst abgeschlossen 2026-10-19 11:52:51 +02:00
13 changed files with 35 additions and 29 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -1,4 +1,4 @@
#Mon Oct 12 14:17:44 CEST 2026 #Mon Oct 19 14:39:04 CEST 2026
attachedEmitters.count=0 attachedEmitters.count=0
attachedLights.count=0 attachedLights.count=0
attachedSounds.count=0 attachedSounds.count=0

View File

@@ -1,4 +1,4 @@
#Thu Oct 15 15:05:26 CEST 2026 #Mon Oct 19 14:39:11 CEST 2026
attachedEmitters.count=0 attachedEmitters.count=0
attachedLights.count=0 attachedLights.count=0
attachedSounds.count=0 attachedSounds.count=0

View File

@@ -12,13 +12,13 @@
"damage": 50, "damage": 50,
"grip": { "grip": {
"posX": 0.10248406, "posX": 0.10248406,
"posY": 0.104730606, "posY": 0.10473058,
"posZ": 0.4630257, "posZ": 0.4630257,
"rotX": 0.0, "rotX": 0.0,
"rotY": 0.0, "rotY": 0.0,
"rotZ": 0.0, "rotZ": 0.0,
"grip2PosX": 0.0024840608, "grip2PosX": 0.0024840608,
"grip2PosY": 0.104730606, "grip2PosY": 0.10473058,
"grip2PosZ": 0.6630257, "grip2PosZ": 0.6630257,
"handOffsetX": 0.0, "handOffsetX": 0.0,
"handOffsetY": 0.0, "handOffsetY": 0.0,

View File

@@ -12,8 +12,8 @@
"damage": 0, "damage": 0,
"grip": { "grip": {
"posX": 0.1114975, "posX": 0.1114975,
"posY": 0.07676052, "posY": 0.07795838,
"posZ": -0.27503356, "posZ": 0.36503196,
"rotX": 0.0, "rotX": 0.0,
"rotY": 0.0, "rotY": 0.0,
"rotZ": 0.0, "rotZ": 0.0,

View File

@@ -1,8 +1,8 @@
{ {
"SWORD": { "SWORD": {
"handOffX": 0.105, "handOffX": 0.095,
"handOffY": 0.1, "handOffY": 0.045,
"handOffZ": 0.5, "handOffZ": 0.645,
"hand2OffX": 0.0, "hand2OffX": 0.0,
"hand2OffY": 0.0, "hand2OffY": 0.0,
"hand2OffZ": 0.0 "hand2OffZ": 0.0

View File

@@ -174,7 +174,7 @@ public class EditorApp extends Application {
animPreviewController = new de.blight.editor.toolset.anim.AnimPreviewController(toolCtx); animPreviewController = new de.blight.editor.toolset.anim.AnimPreviewController(toolCtx);
animSetController = new de.blight.editor.toolset.anim.AnimSetController(toolCtx); animSetController = new de.blight.editor.toolset.anim.AnimSetController(toolCtx);
objectController = new de.blight.editor.toolset.object.ObjectController(toolCtx); objectController = new de.blight.editor.toolset.object.ObjectController(toolCtx);
modelEditorController = new de.blight.editor.toolset.model.ModelEditorController(toolCtx, () -> assetController.openOverlay()); modelEditorController = new de.blight.editor.toolset.model.ModelEditorController(toolCtx, () -> { assetController.openOverlay(); assetController.expandModelsNode(); });
modelEditorController.setObjectController(objectController); modelEditorController.setObjectController(objectController);
atmosphereController = new de.blight.editor.toolset.atmosphere.AtmosphereController(toolCtx); atmosphereController = new de.blight.editor.toolset.atmosphere.AtmosphereController(toolCtx);
waterController = new de.blight.editor.toolset.water.WaterController(toolCtx); waterController = new de.blight.editor.toolset.water.WaterController(toolCtx);

View File

@@ -1551,7 +1551,7 @@ public class ModelEditorState extends BaseAppState {
// Schritt 3: Richtung A→B auf +Z ausrichten // Schritt 3: Richtung A→B auf +Z ausrichten
Vector3f bladeDir = B.subtract(A).normalizeLocal(); Vector3f bladeDir = B.subtract(A).normalizeLocal();
if (bladeDir.z < 0) bladeDir.negateLocal(); // +Z-Richtung bevorzugen if (bladeDir.z > 0) bladeDir.negateLocal(); // -Z-Richtung bevorzugen
Quaternion rot1 = awRotateToZ(bladeDir); Quaternion rot1 = awRotateToZ(bladeDir);
// Mitte der Hauptachse → Ursprung // Mitte der Hauptachse → Ursprung
@@ -1609,11 +1609,11 @@ public class ModelEditorState extends BaseAppState {
float guardNorm = (float) guardBucket / (BKTS - 1); float guardNorm = (float) guardBucket / (BKTS - 1);
log.info("[ModelEditor] AlignWeapon: Parierstange bei normZ={} (Bucket {}/{})", log.info("[ModelEditor] AlignWeapon: Parierstange bei normZ={} (Bucket {}/{})",
String.format("%.2f", guardNorm), guardBucket, BKTS); String.format("%.2f", guardNorm), guardBucket, BKTS);
if (guardNorm > 0.5f) { if (guardNorm < 0.5f) {
// Parierstange in +Z-Hälfte → Pommel bei +Z, Klinge bei -Z → 180° um X flippen // Parierstange in -Z-Hälfte → Pommel bei -Z, Klinge bei +Z → 180° um X flippen
Quaternion flip = new Quaternion().fromAngles(FastMath.PI, 0f, 0f); Quaternion flip = new Quaternion().fromAngles(FastMath.PI, 0f, 0f);
combined = flip.mult(combined); combined = flip.mult(combined);
log.info("[ModelEditor] AlignWeapon: Pommel bei +Z detektiert → Schwert geflippt"); log.info("[ModelEditor] AlignWeapon: Pommel bei -Z detektiert → Schwert geflippt");
} }
} }
} }
@@ -2156,8 +2156,9 @@ public class ModelEditorState extends BaseAppState {
float g2x = input.gripEditorGrip2PosX; float g2x = input.gripEditorGrip2PosX;
float g2y = input.gripEditorGrip2PosY; float g2y = input.gripEditorGrip2PosY;
float g2z = input.gripEditorGrip2PosZ; float g2z = input.gripEditorGrip2PosZ;
boolean bladeAtMinusZ = g2z > g1z; boolean hasGrip2 = g2x != 0f || g2y != 0f || g2z != 0f;
boolean isTwoHand = bladeAtMinusZ && (g2x != 0f || g2y != 0f || g2z != 0f); boolean bladeAtMinusZ = hasGrip2 ? (g2z > g1z) : (g1z > 0f);
boolean isTwoHand = hasGrip2 && bladeAtMinusZ;
Quaternion charWorldRot = charPreviewNode.getWorldRotation(); Quaternion charWorldRot = charPreviewNode.getWorldRotation();
Quaternion charWorldRotInv = charWorldRot.inverse(); Quaternion charWorldRotInv = charWorldRot.inverse();

View File

@@ -277,11 +277,8 @@ public class ModelEditorController implements ToolController {
public void openModelEditor(String relPath, Path absolutePath) { public void openModelEditor(String relPath, Path absolutePath) {
this.pendingRelPath = relPath; this.pendingRelPath = relPath;
this.pendingAbsPath = absolutePath; this.pendingAbsPath = absolutePath;
if (ctx.registry().getActive() == this) { ctx.switchToWorld().run();
activate(); ctx.registry().activate(this);
} else {
ctx.registry().activate(this);
}
} }
/** Öffnet den Datei-Dialog für den Modell-Import. */ /** Öffnet den Datei-Dialog für den Modell-Import. */

View File

@@ -407,6 +407,8 @@ public class PlayerInputControl implements CombatStyleBase.AnimReceiver {
this.visual = visual; this.visual = visual;
} }
public Spatial getVisual() { return visual; }
/** /**
* Setzt die Navigationsquellen (PathFinder + Terrain). Muss vor oder beim * Setzt die Navigationsquellen (PathFinder + Terrain). Muss vor oder beim
* ersten setAnimationContext gesetzt sein, damit der CharacterNavigator * ersten setAnimationContext gesetzt sein, damit der CharacterNavigator

View File

@@ -72,6 +72,7 @@ public class WeaponAttachmentControl extends AbstractControl {
// Wird im 2. Frame aus den Runtime-Node-Positionen berechnet (skalierungs-unabhängig). // Wird im 2. Frame aus den Runtime-Node-Positionen berechnet (skalierungs-unabhängig).
private Vector3f palmOffsetLocal; private Vector3f palmOffsetLocal;
private Item lastEquippedWeapon; private Item lastEquippedWeapon;
private boolean lastDrawnState = false; private boolean lastDrawnState = false;
private Spatial weaponSpatial; private Spatial weaponSpatial;
@@ -224,7 +225,10 @@ public class WeaponAttachmentControl extends AbstractControl {
Quaternion animDelta = (handBindRotInChar != null) Quaternion animDelta = (handBindRotInChar != null)
? boneRotInChar.mult(handBindRotInChar.inverse()) ? boneRotInChar.mult(handBindRotInChar.inverse())
: boneRotInChar; : boneRotInChar;
boolean bladeAtMinusZ2 = grip != null && grip.getGrip2PosZ() != 0f && grip.getGrip2PosZ() > grip.getPosZ(); boolean bladeAtMinusZ2 = grip != null && (
(grip.getGrip2PosX() != 0f || grip.getGrip2PosY() != 0f || grip.getGrip2PosZ() != 0f)
? grip.getGrip2PosZ() > grip.getPosZ()
: grip.getPosZ() > 0f);
Quaternion bladeFlip2 = bladeAtMinusZ2 Quaternion bladeFlip2 = bladeAtMinusZ2
? new Quaternion().fromAngles(com.jme3.math.FastMath.PI, 0f, 0f) ? new Quaternion().fromAngles(com.jme3.math.FastMath.PI, 0f, 0f)
: new Quaternion(); : new Quaternion();
@@ -368,20 +372,22 @@ public class WeaponAttachmentControl extends AbstractControl {
DEG_TO_RAD * grip.getRotY(), DEG_TO_RAD * grip.getRotY(),
DEG_TO_RAD * grip.getRotZ()) DEG_TO_RAD * grip.getRotZ())
: new Quaternion(); : new Quaternion();
// Klinge bei -Z erkannt (grip2PosZ > posZ) → 180° um X vorschalten, damit BACK_ROT_NORM boolean bladeAtMinusZ = grip != null && (
// dieselbe Wirkung hat wie bei korrekt ausgerichtetem Modell (Klinge bei +Z). (grip.getGrip2PosX() != 0f || grip.getGrip2PosY() != 0f || grip.getGrip2PosZ() != 0f)
boolean bladeAtMinusZ = grip != null && grip.getGrip2PosZ() != 0f && grip.getGrip2PosZ() > grip.getPosZ(); ? grip.getGrip2PosZ() > grip.getPosZ()
: grip.getPosZ() > 0f);
Quaternion bladeFlip = bladeAtMinusZ Quaternion bladeFlip = bladeAtMinusZ
? new Quaternion().fromAngles(com.jme3.math.FastMath.PI, 0f, 0f) ? new Quaternion().fromAngles(com.jme3.math.FastMath.PI, 0f, 0f)
: new Quaternion(); : new Quaternion();
Quaternion weaponRot = boneRotInChar.mult(BACK_ROT_NORM).mult(bladeFlip).mult(gripRot.inverse()); Quaternion weaponRot = boneRotInChar.mult(BACK_ROT_NORM).mult(bladeFlip).mult(gripRot.inverse());
Vector3f gripTarget = bonePosInChar.add(boneRotInChar.mult( Vector3f offset = twoHanded ? TWO_HAND_BACK_GRIP_OFFSET : BACK_GRIP_OFFSET;
twoHanded ? TWO_HAND_BACK_GRIP_OFFSET : BACK_GRIP_OFFSET)); Vector3f gripTarget = bonePosInChar.add(boneRotInChar.mult(offset));
// X=0: Waffenmitte (nicht handspezifischer Griffpunkt) auf Wirbelsäule zentrieren
Vector3f gripPos = (grip != null) Vector3f gripPos = (grip != null)
? new Vector3f(grip.getPosX(), grip.getPosY(), grip.getPosZ()) ? new Vector3f(0f, grip.getPosY(), grip.getPosZ())
: Vector3f.ZERO; : Vector3f.ZERO;
Vector3f backPos = gripTarget.subtract(weaponRot.mult(gripPos)); Vector3f backPos = gripTarget.subtract(weaponRot.mult(gripPos));
if (bladeAtMinusZ) backPos = backPos.add(0.1f, 0f, 0f);
weaponSpatial.setLocalRotation(weaponRot); weaponSpatial.setLocalRotation(weaponRot);
weaponSpatial.setLocalTranslation(backPos); weaponSpatial.setLocalTranslation(backPos);
} }