minor fixes
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-07-26 17:42:34 -04:00
parent 56ed405aea
commit 5f56f0d742
12 changed files with 128 additions and 37 deletions

View 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
*/ */

View File

@ -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);

View File

@ -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;

View File

@ -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);
}
} }
} }
} }

View File

@ -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
*/ */

View File

@ -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();
} }
} }

View File

@ -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){