From 55cebdf33af9f8526e397e00e11602645e2caf3d Mon Sep 17 00:00:00 2001 From: austin Date: Mon, 9 May 2022 22:28:12 -0400 Subject: [PATCH] implement attach point offset and tweak human --- assets/Data/creatures/human.json | 2 +- .../entity/EntityDataStrings.java | 1 + .../entity/state/equip/EquipState.java | 4 ++-- .../entity/types/attach/AttachUtils.java | 21 +++++++++++++++++-- .../game/server/unit/UnitUtils.java | 4 +++- src/main/java/electrosphere/main/Main.java | 1 + .../net/client/protocol/EntityProtocol.java | 5 ++++- 7 files changed, 31 insertions(+), 7 deletions(-) diff --git a/assets/Data/creatures/human.json b/assets/Data/creatures/human.json index 95450fa2..300b51a5 100644 --- a/assets/Data/creatures/human.json +++ b/assets/Data/creatures/human.json @@ -236,7 +236,7 @@ "equipPointId" : "handRight", "bone" : "MiddleLower.R", "offsetVector" : [], - "offsetRotation" : [], + "offsetRotation" : [0.3057,0.2926,0.09933,0.9006], "equipClassWhitelist" : [ "tool", "weapon", diff --git a/src/main/java/electrosphere/entity/EntityDataStrings.java b/src/main/java/electrosphere/entity/EntityDataStrings.java index 3cceea80..2396cf28 100644 --- a/src/main/java/electrosphere/entity/EntityDataStrings.java +++ b/src/main/java/electrosphere/entity/EntityDataStrings.java @@ -148,6 +148,7 @@ public class EntityDataStrings { public static final String ATTACH_PARENT = "attachParent"; public static final String ATTACH_TARGET_BONE = "attachTargetBone"; public static final String ATTACH_CHILDREN_LIST = "attachChildrenList"; + public static final String ATTACH_ROTATION_OFFSET = "attachRotationOffset"; /* Item Entity diff --git a/src/main/java/electrosphere/entity/state/equip/EquipState.java b/src/main/java/electrosphere/entity/state/equip/EquipState.java index 7842e756..6c51a9b1 100644 --- a/src/main/java/electrosphere/entity/state/equip/EquipState.java +++ b/src/main/java/electrosphere/entity/state/equip/EquipState.java @@ -72,7 +72,7 @@ public class EquipState { meshMask.queueMesh(modelName, toDraw); } //attach to parent bone - AttachUtils.attachEntityToEntityAtBone(parent, toEquip, point.getBone()); + AttachUtils.attachEntityToEntityAtBone(parent, toEquip, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotation())); //make uncollidable if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ CollisionObject rigidBody = (CollisionObject)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); @@ -88,7 +88,7 @@ public class EquipState { } else { //since we're not replacing meshes we must be attaching to a bone equipMap.put(point.getEquipPointId(),toEquip); - AttachUtils.attachEntityToEntityAtBone(parent, toEquip, point.getBone()); + AttachUtils.attachEntityToEntityAtBone(parent, toEquip, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotation())); if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ CollisionObject rigidBody = (CollisionObject)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); Globals.collisionEngine.deregisterPhysicsObject(rigidBody); diff --git a/src/main/java/electrosphere/entity/types/attach/AttachUtils.java b/src/main/java/electrosphere/entity/types/attach/AttachUtils.java index 2f76b843..4f524cd8 100644 --- a/src/main/java/electrosphere/entity/types/attach/AttachUtils.java +++ b/src/main/java/electrosphere/entity/types/attach/AttachUtils.java @@ -23,11 +23,12 @@ import org.joml.Vector3f; public class AttachUtils { - public static void attachEntityToEntityAtBone(Entity parent, Entity toAttach, String boneName){ + public static void attachEntityToEntityAtBone(Entity parent, Entity toAttach, String boneName, Quaternionf rotation){ Globals.entityManager.registerBoneAttachedEntity(toAttach); toAttach.putData(EntityDataStrings.ATTACH_ENTITY_IS_ATTACHED, true); toAttach.putData(EntityDataStrings.ATTACH_PARENT, parent); toAttach.putData(EntityDataStrings.ATTACH_TARGET_BONE, boneName); + toAttach.putData(EntityDataStrings.ATTACH_ROTATION_OFFSET, rotation); if(parent.containsKey(EntityDataStrings.ATTACH_CHILDREN_LIST)){ getChildrenList(parent).add(toAttach); } else { @@ -44,6 +45,8 @@ public class AttachUtils { String targetBone; if((targetBone = (String)currentEntity.getData(EntityDataStrings.ATTACH_TARGET_BONE))!=null){ Actor parentActor = EntityUtils.getActor(parent); + //get offset rotation + Quaternionf offsetRotation = getRotationOffset(currentEntity); //transform bone space Vector3d position = new Vector3d(parentActor.getBonePosition(targetBone)); position = position.mul(((Vector3f)EntityUtils.getScale(parent))); @@ -57,7 +60,12 @@ public class AttachUtils { // Quaternionf rotation = parentActor.getBoneRotation(targetBone); // EntityUtils.getRotation(currentEntity).set(rotation).normalize(); Vector3d facingAngle = CreatureUtils.getFacingVector(parent); - EntityUtils.getRotation(currentEntity).rotationTo(new Vector3f(0,0,1), new Vector3f((float)facingAngle.x,(float)facingAngle.y,(float)facingAngle.z)).mul(parentActor.getBoneRotation(targetBone)).normalize(); + //calculate rotation of model + EntityUtils.getRotation(currentEntity) + .rotationTo(new Vector3f(0,0,1), new Vector3f((float)facingAngle.x,(float)facingAngle.y,(float)facingAngle.z)) + .mul(parentActor.getBoneRotation(targetBone)) + .mul(offsetRotation) + .normalize(); } } } @@ -84,6 +92,10 @@ public class AttachUtils { public static Entity getParent(Entity e){ return (Entity)e.getData(EntityDataStrings.ATTACH_PARENT); } + + protected static Quaternionf getRotationOffset(Entity e){ + return (Quaternionf)e.getData(EntityDataStrings.ATTACH_ROTATION_OFFSET); + } public static boolean hasChildren(Entity e){ return e.containsKey(EntityDataStrings.ATTACH_CHILDREN_LIST) && !getChildrenList(e).isEmpty(); @@ -104,4 +116,9 @@ public class AttachUtils { parent.putData(EntityDataStrings.ATTACH_CHILDREN_LIST, childrenEntities); } } + + public static Quaternionf getEquipPointRotationOffset(List values){ + return new Quaternionf(values.get(0),values.get(1),values.get(2),values.get(3)); + } + } diff --git a/src/main/java/electrosphere/game/server/unit/UnitUtils.java b/src/main/java/electrosphere/game/server/unit/UnitUtils.java index c57553a8..e4dfce97 100644 --- a/src/main/java/electrosphere/game/server/unit/UnitUtils.java +++ b/src/main/java/electrosphere/game/server/unit/UnitUtils.java @@ -8,6 +8,8 @@ import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.types.item.ItemUtils; import electrosphere.game.server.ai.creature.MillAbout; +import org.joml.Quaterniond; +import org.joml.Quaternionf; import org.joml.Vector3d; import org.joml.Vector3f; @@ -23,7 +25,7 @@ public class UnitUtils { EntityUtils.getScale(goblin).set(0.005f); //give evil goblin sword Entity goblinSword = ItemUtils.spawnBasicItem("Katana"); - AttachUtils.attachEntityToEntityAtBone(goblin, goblinSword, "Bone.031"); + AttachUtils.attachEntityToEntityAtBone(goblin, goblinSword, "Bone.031", new Quaternionf()); //attach ai to evil goblin MillAbout.attachToCreature(goblin); // MindlessAttacker.attachToCreature(goblin); diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java index 819f386a..675f0561 100644 --- a/src/main/java/electrosphere/main/Main.java +++ b/src/main/java/electrosphere/main/Main.java @@ -37,6 +37,7 @@ import java.util.Iterator; import java.util.Random; import java.util.concurrent.TimeUnit; import org.joml.Matrix4f; +import org.joml.Quaterniond; import org.joml.Quaternionf; import org.joml.Vector3f; import org.lwjgl.glfw.*; diff --git a/src/main/java/electrosphere/net/client/protocol/EntityProtocol.java b/src/main/java/electrosphere/net/client/protocol/EntityProtocol.java index dce4275c..62b4e4d8 100644 --- a/src/main/java/electrosphere/net/client/protocol/EntityProtocol.java +++ b/src/main/java/electrosphere/net/client/protocol/EntityProtocol.java @@ -1,5 +1,8 @@ package electrosphere.net.client.protocol; +import org.joml.Quaterniond; +import org.joml.Quaternionf; + import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.entity.types.attach.AttachUtils; @@ -79,7 +82,7 @@ public class EntityProtocol { Entity parent = Globals.entityManager.getEntityFromId(message.gettargetID()); LoggerInterface.loggerNetworking.DEBUG("Attach " + message.getentityID() + " to " + message.gettargetID() + " on bone " + message.getbone()); if(child != null && parent != null){ - AttachUtils.attachEntityToEntityAtBone(parent, child, message.getbone()); + AttachUtils.attachEntityToEntityAtBone(parent, child, message.getbone(), new Quaternionf()); } break; case MOVEUPDATE: