minor fixes
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
This commit is contained in:
parent
56ed405aea
commit
5f56f0d742
24
docs/src/highlevel-design/controls/controlDesign.md
Normal file
24
docs/src/highlevel-design/controls/controlDesign.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
@page controlDesign Controls Design
|
||||||
|
|
||||||
|
==First person control scheme==
|
||||||
|
How to move - WASD, Space
|
||||||
|
Crouch - Ctrl
|
||||||
|
Sprint - Shift
|
||||||
|
Cursor interaction - E
|
||||||
|
Radial menu for various important submenus (ie inventories) - Tab
|
||||||
|
Quick switch equipped item (Radial Menu) - Hold 4 key
|
||||||
|
Item interaction 1 (ie swapping weapon stance, swapping spell, etc) - X
|
||||||
|
Item interaction 2 (ie swapping weapon stance, swapping spell, etc) - C
|
||||||
|
Item interaction 3 (ie swapping weapon stance, swapping spell, etc) - V
|
||||||
|
|
||||||
|
==Third person control scheme==
|
||||||
|
How to move - WASD, Space
|
||||||
|
Crouch - Ctrl
|
||||||
|
Sprint - Shift
|
||||||
|
Cursor interaction - E
|
||||||
|
Radial menu for various important submenus (ie inventories) - Tab
|
||||||
|
Quick switch equipped item (Radial Menu) - Hold 4 key radial menu
|
||||||
|
Item interaction 1 (ie swapping weapon stance, swapping spell, etc) - X
|
||||||
|
Item interaction 2 (ie swapping weapon stance, swapping spell, etc) - C
|
||||||
|
Item interaction 3 (ie swapping weapon stance, swapping spell, etc) - V
|
||||||
|
|
||||||
@ -18,4 +18,5 @@ Discussion of, at a high game-design level, how everything should work and conne
|
|||||||
- @subpage locomotion
|
- @subpage locomotion
|
||||||
- @subpage economicsindex
|
- @subpage economicsindex
|
||||||
- @subpage structuresandbuildings
|
- @subpage structuresandbuildings
|
||||||
- @subpage dungeonsindex
|
- @subpage dungeonsindex
|
||||||
|
- @subpage controlDesign
|
||||||
@ -8,3 +8,6 @@
|
|||||||
review combat code (lifestate, damage calculation, etc)
|
review combat code (lifestate, damage calculation, etc)
|
||||||
audio fx for everything
|
audio fx for everything
|
||||||
fix rendering pipelines (black when looking at character from angle with item, shadows are not darker color, etc)
|
fix rendering pipelines (black when looking at character from angle with item, shadows are not darker color, etc)
|
||||||
|
|
||||||
|
+ bug fixes
|
||||||
|
fix client-attached models drawing on previous frame
|
||||||
|
|||||||
@ -452,6 +452,9 @@ Attacker ai tree
|
|||||||
Switching between first and third person
|
Switching between first and third person
|
||||||
Devtools for updating first person attachment rotations
|
Devtools for updating first person attachment rotations
|
||||||
|
|
||||||
|
(07/26/2024)
|
||||||
|
Viewmodel equipped item rotates inverted to bone rotation
|
||||||
|
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
@ -497,6 +500,9 @@ Fix being able to walk off far side of the world (ie in level editor)
|
|||||||
Grass System properly LOD
|
Grass System properly LOD
|
||||||
- Have foliage dynamically time out cells to be reconsidered based on distance from player (if close, short cooldown, if far long cooldown)
|
- Have foliage dynamically time out cells to be reconsidered based on distance from player (if close, short cooldown, if far long cooldown)
|
||||||
|
|
||||||
|
Debug
|
||||||
|
- Draw all bones with orientations
|
||||||
|
|
||||||
Would be nice to be able to cut clients that stream their logs to my server
|
Would be nice to be able to cut clients that stream their logs to my server
|
||||||
|
|
||||||
Data Cleanup
|
Data Cleanup
|
||||||
|
|||||||
@ -104,6 +104,17 @@ public class ClientSceneWrapper {
|
|||||||
return scene.getEntityFromId(mapServerToClientId(id));
|
return scene.getEntityFromId(mapServerToClientId(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dumps the status of the network translation layer
|
||||||
|
*/
|
||||||
|
public void dumpTranslationLayerStatus(){
|
||||||
|
LoggerInterface.loggerNetworking.WARNING("Client -> Server keys");
|
||||||
|
LoggerInterface.loggerNetworking.WARNING(clientToServerIdMap.keySet() + "");
|
||||||
|
LoggerInterface.loggerNetworking.WARNING("Server -> Client keys");
|
||||||
|
LoggerInterface.loggerNetworking.WARNING(serverToClientIdMap.keySet() + "");
|
||||||
|
LoggerInterface.loggerNetworking.WARNING("Debug here");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the scene backing this client scene wrapper
|
* Gets the scene backing this client scene wrapper
|
||||||
* @return The scene
|
* @return The scene
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package electrosphere.client.sim;
|
package electrosphere.client.sim;
|
||||||
|
|
||||||
import org.joml.Vector3d;
|
import org.joml.Vector3d;
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
import electrosphere.client.fluid.manager.ClientFluidManager;
|
import electrosphere.client.fluid.manager.ClientFluidManager;
|
||||||
import electrosphere.client.instancing.InstanceUpdater;
|
import electrosphere.client.instancing.InstanceUpdater;
|
||||||
@ -11,7 +12,10 @@ import electrosphere.entity.Entity;
|
|||||||
import electrosphere.entity.EntityTags;
|
import electrosphere.entity.EntityTags;
|
||||||
import electrosphere.entity.EntityUtils;
|
import electrosphere.entity.EntityUtils;
|
||||||
import electrosphere.entity.state.collidable.ClientCollidableTree;
|
import electrosphere.entity.state.collidable.ClientCollidableTree;
|
||||||
|
import electrosphere.entity.state.equip.ClientEquipState;
|
||||||
import electrosphere.entity.types.attach.AttachUtils;
|
import electrosphere.entity.types.attach.AttachUtils;
|
||||||
|
import electrosphere.entity.types.camera.CameraEntityUtils;
|
||||||
|
import electrosphere.entity.types.creature.CreatureUtils;
|
||||||
import electrosphere.entity.types.item.ItemUtils;
|
import electrosphere.entity.types.item.ItemUtils;
|
||||||
import electrosphere.entity.types.particle.ParticleUtils;
|
import electrosphere.entity.types.particle.ParticleUtils;
|
||||||
import electrosphere.renderer.actor.Actor;
|
import electrosphere.renderer.actor.Actor;
|
||||||
@ -133,6 +137,7 @@ public class ClientSimulation {
|
|||||||
Globals.clientSceneWrapper.destroyEntitiesOutsideSimRange();
|
Globals.clientSceneWrapper.destroyEntitiesOutsideSimRange();
|
||||||
InstanceUpdater.updateInstancedActorPriority();
|
InstanceUpdater.updateInstancedActorPriority();
|
||||||
Globals.cameraHandler.updateGlobalCamera();
|
Globals.cameraHandler.updateGlobalCamera();
|
||||||
|
updateFirstPersonAttachments();
|
||||||
// updateCellManager();
|
// updateCellManager();
|
||||||
Globals.profiler.endCpuSample();
|
Globals.profiler.endCpuSample();
|
||||||
}
|
}
|
||||||
@ -141,7 +146,7 @@ public class ClientSimulation {
|
|||||||
/**
|
/**
|
||||||
* Updates the skybox position to center on the player
|
* Updates the skybox position to center on the player
|
||||||
*/
|
*/
|
||||||
void updateSkyboxPos(){
|
private void updateSkyboxPos(){
|
||||||
Globals.profiler.beginCpuSample("updateSkyboxPos");
|
Globals.profiler.beginCpuSample("updateSkyboxPos");
|
||||||
if(Globals.skybox != null && Globals.playerEntity != null){
|
if(Globals.skybox != null && Globals.playerEntity != null){
|
||||||
EntityUtils.getPosition(Globals.skybox).set(EntityUtils.getPosition(Globals.playerEntity));
|
EntityUtils.getPosition(Globals.skybox).set(EntityUtils.getPosition(Globals.playerEntity));
|
||||||
@ -149,6 +154,24 @@ public class ClientSimulation {
|
|||||||
Globals.profiler.endCpuSample();
|
Globals.profiler.endCpuSample();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If in first person, update the spatial transforms of things attached to the player viewmodel
|
||||||
|
*/
|
||||||
|
private void updateFirstPersonAttachments(){
|
||||||
|
Globals.profiler.beginCpuSample("updateFirstPersonAttachments");
|
||||||
|
//update the facing vector when camera moves in first person
|
||||||
|
if(!Globals.controlHandler.cameraIsThirdPerson() && Globals.playerCamera != null && Globals.playerEntity != null){
|
||||||
|
Vector3f cameraEyeVec = CameraEntityUtils.getCameraEye(Globals.playerCamera);
|
||||||
|
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(cameraEyeVec.x,0,cameraEyeVec.z).normalize());
|
||||||
|
//flush equipped item state
|
||||||
|
if(ClientEquipState.hasEquipState(Globals.playerEntity)){
|
||||||
|
ClientEquipState equipState = ClientEquipState.getClientEquipState(Globals.playerEntity);
|
||||||
|
equipState.evaluatePlayerAttachments();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Globals.profiler.endCpuSample();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads terrain that is in queue
|
* Loads terrain that is in queue
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -127,7 +127,6 @@ public class CameraHandler {
|
|||||||
Vector3f radialOffset = CameraEntityUtils.getOrbitalCameraRadialOffset(Globals.playerCamera);
|
Vector3f radialOffset = CameraEntityUtils.getOrbitalCameraRadialOffset(Globals.playerCamera);
|
||||||
Vector3f trueOffset = new Vector3f(radialOffset).mul(xFactor,1.0f,yFactor);
|
Vector3f trueOffset = new Vector3f(radialOffset).mul(xFactor,1.0f,yFactor);
|
||||||
CameraEntityUtils.setOrbitalCameraRadialOffset(Globals.playerCamera, trueOffset);
|
CameraEntityUtils.setOrbitalCameraRadialOffset(Globals.playerCamera, trueOffset);
|
||||||
// float cam_Player_Orbit_Magnitude = CameraEntityUtils.getCameraOrbitRadius(Globals.playerCamera);
|
|
||||||
cameraRotationVector.mul(CameraEntityUtils.getOrbitalCameraDistance(Globals.playerCamera));
|
cameraRotationVector.mul(CameraEntityUtils.getOrbitalCameraDistance(Globals.playerCamera));
|
||||||
CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
|
CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
|
||||||
|
|
||||||
|
|||||||
@ -92,7 +92,6 @@ import electrosphere.entity.state.movement.SprintTree;
|
|||||||
import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree;
|
import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree;
|
||||||
import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree.MovementRelativeFacing;
|
import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree.MovementRelativeFacing;
|
||||||
import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree.MovementTreeState;
|
import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree.MovementTreeState;
|
||||||
import electrosphere.entity.types.attach.AttachUtils;
|
|
||||||
import electrosphere.entity.types.camera.CameraEntityUtils;
|
import electrosphere.entity.types.camera.CameraEntityUtils;
|
||||||
import electrosphere.entity.types.creature.CreatureUtils;
|
import electrosphere.entity.types.creature.CreatureUtils;
|
||||||
import electrosphere.logger.LoggerInterface;
|
import electrosphere.logger.LoggerInterface;
|
||||||
|
|||||||
@ -340,15 +340,23 @@ public class ClientEquipState implements BehaviorTree {
|
|||||||
for(String occupiedPoint : this.getEquippedPoints()){
|
for(String occupiedPoint : this.getEquippedPoints()){
|
||||||
EquipPoint point = this.getEquipPoint(occupiedPoint);
|
EquipPoint point = this.getEquipPoint(occupiedPoint);
|
||||||
Entity toEquip = this.equipMap.get(point.getEquipPointId());
|
Entity toEquip = this.equipMap.get(point.getEquipPointId());
|
||||||
AttachUtils.clientDetatchEntityFromEntityAtBone(Globals.firstPersonEntity, toEquip);
|
if(AttachUtils.getParent(toEquip) != Globals.playerEntity){
|
||||||
AttachUtils.clientAttachEntityToEntityAtBone(Globals.playerEntity, toEquip, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()));
|
AttachUtils.clientDetatchEntityFromEntityAtBone(Globals.firstPersonEntity, toEquip);
|
||||||
|
AttachUtils.clientAttachEntityToEntityAtBone(Globals.playerEntity, toEquip, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()));
|
||||||
|
} else {
|
||||||
|
AttachUtils.clientUpdateEntityTransforms(toEquip, Globals.playerEntity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for(String occupiedPoint : this.getEquippedPoints()){
|
for(String occupiedPoint : this.getEquippedPoints()){
|
||||||
EquipPoint point = this.getEquipPoint(occupiedPoint);
|
EquipPoint point = this.getEquipPoint(occupiedPoint);
|
||||||
Entity toEquip = this.equipMap.get(point.getEquipPointId());
|
Entity toEquip = this.equipMap.get(point.getEquipPointId());
|
||||||
AttachUtils.clientDetatchEntityFromEntityAtBone(Globals.playerEntity, toEquip);
|
if(AttachUtils.getParent(toEquip) != Globals.firstPersonEntity){
|
||||||
AttachUtils.clientAttachEntityToEntityAtBone(Globals.firstPersonEntity, toEquip, point.getFirstPersonBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson()));
|
AttachUtils.clientDetatchEntityFromEntityAtBone(Globals.playerEntity, toEquip);
|
||||||
|
AttachUtils.clientAttachEntityToEntityAtBone(Globals.firstPersonEntity, toEquip, point.getFirstPersonBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson()));
|
||||||
|
} else {
|
||||||
|
AttachUtils.clientUpdateEntityTransforms(toEquip, Globals.firstPersonEntity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -182,34 +182,7 @@ public class AttachUtils {
|
|||||||
for(Entity currentEntity : Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.BONE_ATTACHED)){
|
for(Entity currentEntity : Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.BONE_ATTACHED)){
|
||||||
Entity parent;
|
Entity parent;
|
||||||
if((parent = (Entity)currentEntity.getData(EntityDataStrings.ATTACH_PARENT))!=null){
|
if((parent = (Entity)currentEntity.getData(EntityDataStrings.ATTACH_PARENT))!=null){
|
||||||
String targetBone;
|
clientUpdateEntityTransforms(currentEntity,parent);
|
||||||
if((targetBone = (String)currentEntity.getData(EntityDataStrings.ATTACH_TARGET_BONE))!=null){
|
|
||||||
Actor parentActor = EntityUtils.getActor(parent);
|
|
||||||
//get offset rotation
|
|
||||||
Quaterniond offsetRotation = getRotationOffset(currentEntity);
|
|
||||||
//transform bone space
|
|
||||||
Vector3d position = new Vector3d(parentActor.getBonePosition(targetBone));
|
|
||||||
position = position.mul(((Vector3f)EntityUtils.getScale(parent)));
|
|
||||||
Quaterniond rotation = EntityUtils.getRotation(parent);
|
|
||||||
position = position.rotate(new Quaterniond(rotation.x,rotation.y,rotation.z,rotation.w));
|
|
||||||
//transform worldspace
|
|
||||||
position.add(new Vector3d(EntityUtils.getPosition(parent)));
|
|
||||||
//set
|
|
||||||
EntityUtils.getPosition(currentEntity).set(position);
|
|
||||||
//set rotation
|
|
||||||
// Quaternionf rotation = parentActor.getBoneRotation(targetBone);
|
|
||||||
// EntityUtils.getRotation(currentEntity).set(rotation).normalize();
|
|
||||||
Vector3d facingAngle = CreatureUtils.getFacingVector(parent);
|
|
||||||
if(facingAngle == null){
|
|
||||||
facingAngle = MathUtils.getOriginVector();
|
|
||||||
}
|
|
||||||
//calculate rotation of model
|
|
||||||
EntityUtils.getRotation(currentEntity)
|
|
||||||
.rotationTo(MathUtils.getOriginVector(), new Vector3d(facingAngle.x,facingAngle.y,facingAngle.z))
|
|
||||||
.mul(parentActor.getBoneRotation(targetBone))
|
|
||||||
.mul(offsetRotation)
|
|
||||||
.normalize();
|
|
||||||
}
|
|
||||||
} else if(currentEntity.getData(EntityDataStrings.ATTACH_TARGET_BASE)!=null){
|
} else if(currentEntity.getData(EntityDataStrings.ATTACH_TARGET_BASE)!=null){
|
||||||
Vector3d positionOffset = getAttachPositionOffset(currentEntity);
|
Vector3d positionOffset = getAttachPositionOffset(currentEntity);
|
||||||
Vector3d parentPosition = EntityUtils.getPosition(parent);
|
Vector3d parentPosition = EntityUtils.getPosition(parent);
|
||||||
@ -219,6 +192,47 @@ public class AttachUtils {
|
|||||||
Globals.profiler.endCpuSample();
|
Globals.profiler.endCpuSample();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the spatial data for the attached entity
|
||||||
|
* @param child The entity that is attached to a parent
|
||||||
|
* @param parent The parent entity that has a child attached to it
|
||||||
|
*/
|
||||||
|
public static void clientUpdateEntityTransforms(Entity child, Entity parent){
|
||||||
|
String targetBone;
|
||||||
|
if((targetBone = (String)child.getData(EntityDataStrings.ATTACH_TARGET_BONE))!=null){
|
||||||
|
Actor parentActor = EntityUtils.getActor(parent);
|
||||||
|
//get offset rotation
|
||||||
|
Quaterniond offsetRotation = getRotationOffset(child);
|
||||||
|
//transform bone space
|
||||||
|
Vector3d position = new Vector3d(parentActor.getBonePosition(targetBone));
|
||||||
|
position = position.mul(((Vector3f)EntityUtils.getScale(parent)));
|
||||||
|
Quaterniond rotation = EntityUtils.getRotation(parent);
|
||||||
|
position = position.rotate(new Quaterniond(rotation.x,rotation.y,rotation.z,rotation.w));
|
||||||
|
//transform worldspace
|
||||||
|
position.add(new Vector3d(EntityUtils.getPosition(parent)));
|
||||||
|
//set
|
||||||
|
EntityUtils.getPosition(child).set(position);
|
||||||
|
//set rotation
|
||||||
|
// Quaternionf rotation = parentActor.getBoneRotation(targetBone);
|
||||||
|
// EntityUtils.getRotation(currentEntity).set(rotation).normalize();
|
||||||
|
Vector3d facingAngle;
|
||||||
|
if(parent == Globals.firstPersonEntity){
|
||||||
|
facingAngle = CreatureUtils.getFacingVector(Globals.playerEntity);
|
||||||
|
} else {
|
||||||
|
facingAngle = CreatureUtils.getFacingVector(parent);
|
||||||
|
}
|
||||||
|
if(facingAngle == null){
|
||||||
|
facingAngle = MathUtils.getOriginVector();
|
||||||
|
}
|
||||||
|
//calculate rotation of model
|
||||||
|
EntityUtils.getRotation(child)
|
||||||
|
.rotationTo(MathUtils.getOriginVector(), new Vector3d(facingAngle.x,facingAngle.y,facingAngle.z))
|
||||||
|
.mul(parentActor.getBoneRotation(targetBone))
|
||||||
|
.mul(offsetRotation)
|
||||||
|
.normalize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates entities that aren't attached to a bone directly
|
* Updates entities that aren't attached to a bone directly
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -71,6 +71,7 @@ public class ImGuiEntityMacros {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ImGui.beginGroup();
|
ImGui.beginGroup();
|
||||||
|
ImGui.pushID(entity.getId());
|
||||||
ImGui.text("Id: " + entity.getId() + " (" + getEntityName(entity) + ")");
|
ImGui.text("Id: " + entity.getId() + " (" + getEntityName(entity) + ")");
|
||||||
if(CreatureUtils.isCreature(entity)){
|
if(CreatureUtils.isCreature(entity)){
|
||||||
if(EntityUtils.getActor(entity) != null){
|
if(EntityUtils.getActor(entity) != null){
|
||||||
@ -86,6 +87,7 @@ public class ImGuiEntityMacros {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ImGui.popID();
|
||||||
ImGui.endGroup();
|
ImGui.endGroup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -76,7 +76,8 @@ public class ClientSynchronizationManager {
|
|||||||
"Client received synchronization packet for entity that does not exists on client!\n" +
|
"Client received synchronization packet for entity that does not exists on client!\n" +
|
||||||
"Entity id in network message: " + message.getentityId()
|
"Entity id in network message: " + message.getentityId()
|
||||||
;
|
;
|
||||||
LoggerInterface.loggerNetworking.ERROR(new IllegalStateException(errorMessage));
|
Globals.clientSceneWrapper.dumpTranslationLayerStatus();
|
||||||
|
throw new IllegalStateException(errorMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(SynchronizationMessage message : messagesToClear){
|
for(SynchronizationMessage message : messagesToClear){
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user