implement attach point offset and tweak human

This commit is contained in:
austin 2022-05-09 22:28:12 -04:00
parent 74a9ea4a5f
commit 55cebdf33a
7 changed files with 31 additions and 7 deletions

View File

@ -236,7 +236,7 @@
"equipPointId" : "handRight", "equipPointId" : "handRight",
"bone" : "MiddleLower.R", "bone" : "MiddleLower.R",
"offsetVector" : [], "offsetVector" : [],
"offsetRotation" : [], "offsetRotation" : [0.3057,0.2926,0.09933,0.9006],
"equipClassWhitelist" : [ "equipClassWhitelist" : [
"tool", "tool",
"weapon", "weapon",

View File

@ -148,6 +148,7 @@ public class EntityDataStrings {
public static final String ATTACH_PARENT = "attachParent"; public static final String ATTACH_PARENT = "attachParent";
public static final String ATTACH_TARGET_BONE = "attachTargetBone"; public static final String ATTACH_TARGET_BONE = "attachTargetBone";
public static final String ATTACH_CHILDREN_LIST = "attachChildrenList"; public static final String ATTACH_CHILDREN_LIST = "attachChildrenList";
public static final String ATTACH_ROTATION_OFFSET = "attachRotationOffset";
/* /*
Item Entity Item Entity

View File

@ -72,7 +72,7 @@ public class EquipState {
meshMask.queueMesh(modelName, toDraw); meshMask.queueMesh(modelName, toDraw);
} }
//attach to parent bone //attach to parent bone
AttachUtils.attachEntityToEntityAtBone(parent, toEquip, point.getBone()); AttachUtils.attachEntityToEntityAtBone(parent, toEquip, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotation()));
//make uncollidable //make uncollidable
if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){
CollisionObject rigidBody = (CollisionObject)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); CollisionObject rigidBody = (CollisionObject)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
@ -88,7 +88,7 @@ public class EquipState {
} else { } else {
//since we're not replacing meshes we must be attaching to a bone //since we're not replacing meshes we must be attaching to a bone
equipMap.put(point.getEquipPointId(),toEquip); 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)){ if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){
CollisionObject rigidBody = (CollisionObject)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); CollisionObject rigidBody = (CollisionObject)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
Globals.collisionEngine.deregisterPhysicsObject(rigidBody); Globals.collisionEngine.deregisterPhysicsObject(rigidBody);

View File

@ -23,11 +23,12 @@ import org.joml.Vector3f;
public class AttachUtils { 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); Globals.entityManager.registerBoneAttachedEntity(toAttach);
toAttach.putData(EntityDataStrings.ATTACH_ENTITY_IS_ATTACHED, true); toAttach.putData(EntityDataStrings.ATTACH_ENTITY_IS_ATTACHED, true);
toAttach.putData(EntityDataStrings.ATTACH_PARENT, parent); toAttach.putData(EntityDataStrings.ATTACH_PARENT, parent);
toAttach.putData(EntityDataStrings.ATTACH_TARGET_BONE, boneName); toAttach.putData(EntityDataStrings.ATTACH_TARGET_BONE, boneName);
toAttach.putData(EntityDataStrings.ATTACH_ROTATION_OFFSET, rotation);
if(parent.containsKey(EntityDataStrings.ATTACH_CHILDREN_LIST)){ if(parent.containsKey(EntityDataStrings.ATTACH_CHILDREN_LIST)){
getChildrenList(parent).add(toAttach); getChildrenList(parent).add(toAttach);
} else { } else {
@ -44,6 +45,8 @@ public class AttachUtils {
String targetBone; String targetBone;
if((targetBone = (String)currentEntity.getData(EntityDataStrings.ATTACH_TARGET_BONE))!=null){ if((targetBone = (String)currentEntity.getData(EntityDataStrings.ATTACH_TARGET_BONE))!=null){
Actor parentActor = EntityUtils.getActor(parent); Actor parentActor = EntityUtils.getActor(parent);
//get offset rotation
Quaternionf offsetRotation = getRotationOffset(currentEntity);
//transform bone space //transform bone space
Vector3d position = new Vector3d(parentActor.getBonePosition(targetBone)); Vector3d position = new Vector3d(parentActor.getBonePosition(targetBone));
position = position.mul(((Vector3f)EntityUtils.getScale(parent))); position = position.mul(((Vector3f)EntityUtils.getScale(parent)));
@ -57,7 +60,12 @@ public class AttachUtils {
// Quaternionf rotation = parentActor.getBoneRotation(targetBone); // Quaternionf rotation = parentActor.getBoneRotation(targetBone);
// EntityUtils.getRotation(currentEntity).set(rotation).normalize(); // EntityUtils.getRotation(currentEntity).set(rotation).normalize();
Vector3d facingAngle = CreatureUtils.getFacingVector(parent); 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){ public static Entity getParent(Entity e){
return (Entity)e.getData(EntityDataStrings.ATTACH_PARENT); 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){ public static boolean hasChildren(Entity e){
return e.containsKey(EntityDataStrings.ATTACH_CHILDREN_LIST) && !getChildrenList(e).isEmpty(); return e.containsKey(EntityDataStrings.ATTACH_CHILDREN_LIST) && !getChildrenList(e).isEmpty();
@ -104,4 +116,9 @@ public class AttachUtils {
parent.putData(EntityDataStrings.ATTACH_CHILDREN_LIST, childrenEntities); parent.putData(EntityDataStrings.ATTACH_CHILDREN_LIST, childrenEntities);
} }
} }
public static Quaternionf getEquipPointRotationOffset(List<Float> values){
return new Quaternionf(values.get(0),values.get(1),values.get(2),values.get(3));
}
} }

View File

@ -8,6 +8,8 @@ import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.item.ItemUtils; import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.server.ai.creature.MillAbout; import electrosphere.game.server.ai.creature.MillAbout;
import org.joml.Quaterniond;
import org.joml.Quaternionf;
import org.joml.Vector3d; import org.joml.Vector3d;
import org.joml.Vector3f; import org.joml.Vector3f;
@ -23,7 +25,7 @@ public class UnitUtils {
EntityUtils.getScale(goblin).set(0.005f); EntityUtils.getScale(goblin).set(0.005f);
//give evil goblin sword //give evil goblin sword
Entity goblinSword = ItemUtils.spawnBasicItem("Katana"); Entity goblinSword = ItemUtils.spawnBasicItem("Katana");
AttachUtils.attachEntityToEntityAtBone(goblin, goblinSword, "Bone.031"); AttachUtils.attachEntityToEntityAtBone(goblin, goblinSword, "Bone.031", new Quaternionf());
//attach ai to evil goblin //attach ai to evil goblin
MillAbout.attachToCreature(goblin); MillAbout.attachToCreature(goblin);
// MindlessAttacker.attachToCreature(goblin); // MindlessAttacker.attachToCreature(goblin);

View File

@ -37,6 +37,7 @@ import java.util.Iterator;
import java.util.Random; import java.util.Random;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.joml.Matrix4f; import org.joml.Matrix4f;
import org.joml.Quaterniond;
import org.joml.Quaternionf; import org.joml.Quaternionf;
import org.joml.Vector3f; import org.joml.Vector3f;
import org.lwjgl.glfw.*; import org.lwjgl.glfw.*;

View File

@ -1,5 +1,8 @@
package electrosphere.net.client.protocol; package electrosphere.net.client.protocol;
import org.joml.Quaterniond;
import org.joml.Quaternionf;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils; import electrosphere.entity.EntityUtils;
import electrosphere.entity.types.attach.AttachUtils; import electrosphere.entity.types.attach.AttachUtils;
@ -79,7 +82,7 @@ public class EntityProtocol {
Entity parent = Globals.entityManager.getEntityFromId(message.gettargetID()); Entity parent = Globals.entityManager.getEntityFromId(message.gettargetID());
LoggerInterface.loggerNetworking.DEBUG("Attach " + message.getentityID() + " to " + message.gettargetID() + " on bone " + message.getbone()); LoggerInterface.loggerNetworking.DEBUG("Attach " + message.getentityID() + " to " + message.gettargetID() + " on bone " + message.getbone());
if(child != null && parent != null){ if(child != null && parent != null){
AttachUtils.attachEntityToEntityAtBone(parent, child, message.getbone()); AttachUtils.attachEntityToEntityAtBone(parent, child, message.getbone(), new Quaternionf());
} }
break; break;
case MOVEUPDATE: case MOVEUPDATE: