partway to floating island object

This commit is contained in:
austin 2022-06-15 15:53:40 -04:00
parent bbb2325e86
commit 2049692634
18 changed files with 279 additions and 16 deletions

View File

@ -2,7 +2,7 @@
"objects" : [
{
"itemId" : "crateWooden",
"objectId" : "crateWooden",
"modelPath" : "Models/crate2.fbx",
"tokens" : [
"GRAVITY",
@ -19,5 +19,8 @@
}
}
],
"files" : [
"Data/objects/floatingisland.json"
]
}

View File

@ -0,0 +1,24 @@
{
"objects" : [
{
"objectId" : "floatingisland1",
"modelPath" : "Models/floatingisland1.fbx",
"tokens" : [
"DISABLE_COLLISION_REACTION",
"TERRAIN_COLLISION"
],
"collidable": {
"type" : "CYLINDER",
"dimension1" : 1.7,
"dimension2" : 1.7,
"dimension3" : 1.7,
"offsetX" : 0,
"offsetY" : -1.7,
"offsetZ" : 0
}
}
],
"files" : []
}

Binary file not shown.

View File

@ -407,6 +407,12 @@
"/Textures/shrine2Stairs.png",
"/Textures/shrine2Stairs.png"
]
},
"Models/floatingisland1.fbx" : {
"Cube" : [
"/Textures/floatingisland1.png",
"/Textures/floatingisland1.png"
]
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

View File

@ -13,6 +13,7 @@ import electrosphere.game.collision.CollisionEngine;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.debug.DebugVisualizerUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.entity.types.object.ObjectUtils;
import electrosphere.game.client.cells.DrawCellManager;
import electrosphere.game.client.player.ClientPlayerData;
import electrosphere.game.client.terrain.manager.ClientTerrainManager;
@ -677,7 +678,11 @@ public class LoadingThread extends Thread {
EntityUtils.initiallyPositionEntity(sword, new Vector3d(1,0.4f,2));
EntityUtils.getRotation(sword).set(new Quaternionf().rotationY((float)(Math.PI/2.0)));
//floating island 1
Entity island1 = ObjectUtils.spawnBasicObject("floatingisland1");
EntityUtils.getRotation(island1).set(new Quaternionf().rotationX(-(float)(Math.PI/2.0)));
EntityUtils.getScale(island1).set(0.3f);
EntityUtils.initiallyPositionEntity(island1, new Vector3d(5,0.5,5));
//work on ez volumetrics shader
// Entity myCube = EntityUtils.spawnDrawableEntity("Models/unitcube.fbx");

View File

@ -144,6 +144,10 @@ public class EntityManager {
public List<Entity> getCollidables(){
return collidableList;
}
public void deregisterCollidableEntity(Entity e){
collidableList.remove(e);
}
public void registerTargetableEntity(Entity e){
targetableList.add(e);

View File

@ -143,7 +143,7 @@ public class EntityUtils {
}
}
//reposition entity
CollisionObjUtils.positionCharacter(entity, Globals.spawnPoint);
CollisionObjUtils.positionCharacter(entity, position);
}
/**

View File

@ -33,15 +33,24 @@ public class CollidableTree {
Collidable collidable;
Quaternionf angularVelocity = new Quaternionf(0,0,0,0);
Vector4d cumulativeTorque = new Vector4d(0,0,0,0);
boolean applyImpulses = true;
static final float DELTA_T = 0.01f;
public CollidableTree(Entity e, Collidable collidable, CollisionObject body){
parent = e;
this.collidable = collidable;
this.body = body;
}
public CollidableTree(Entity e, Collidable collidable, CollisionObject body, boolean applyImpulses){
parent = e;
this.collidable = collidable;
this.body = body;
this.applyImpulses = applyImpulses;
}
static int incrementer = 0;
public void simulate(){
@ -186,7 +195,9 @@ public class CollidableTree {
}
//make sure we're in a valid (World bounds) position
newPosition.add(offsetVector);
if(applyImpulses){
newPosition.add(offsetVector);
}
if(!Globals.collisionEngine.checkCanOccupyPosition(Globals.commonWorldData, parent, newPosition)){
newPosition = Globals.collisionEngine.suggestMovementPosition(Globals.commonWorldData, parent, newPosition);
}

View File

@ -178,7 +178,9 @@ public class CollisionObjUtils {
EntityUtils.getPosition(e).set(position);
Quaternionf rotation = EntityUtils.getRotation(e);
CollisionObject body = getCollisionBody(e);
PhysicsUtils.setRigidBodyTransform(new Vector3f((float)position.x,(float)position.y,(float)position.z), rotation, body);
if(body != null){
PhysicsUtils.setRigidBodyTransform(new Vector3f((float)position.x,(float)position.y,(float)position.z), rotation, body);
}
}
public static Collidable getCollidable(Entity e){

View File

@ -0,0 +1,133 @@
package electrosphere.entity.types.object;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import electrosphere.collision.dispatch.CollisionObject;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.IdleTree;
import electrosphere.entity.state.collidable.CollidableTree;
import electrosphere.entity.state.gravity.GravityTree;
import electrosphere.entity.state.inventory.InventoryState;
import electrosphere.entity.state.inventory.InventoryUtils;
import electrosphere.entity.state.inventory.UnrelationalInventoryState;
import electrosphere.entity.state.life.LifeState;
import electrosphere.entity.types.collision.CollisionObjUtils;
import electrosphere.game.collision.PhysicsUtils;
import electrosphere.game.collision.collidable.Collidable;
import electrosphere.game.data.creature.type.CollidableTemplate;
import electrosphere.game.data.object.type.ObjectData;
import electrosphere.main.Globals;
import electrosphere.renderer.actor.Actor;
import electrosphere.renderer.actor.ActorUtils;
public class ObjectUtils {
public static Entity spawnBasicObject(String type){
ObjectData rawType = Globals.gameConfigCurrent.getObjectTypeLoader().getObject(type);
Entity rVal = EntityUtils.spawnDrawableEntity(rawType.getModelPath());
Actor creatureActor = EntityUtils.getActor(rVal);
//forward-searching tokens
boolean collisionMakeDynamic = true;
for(String token : rawType.getTokens()){
switch(token){
case "DISABLE_COLLISION_REACTION": {
collisionMakeDynamic = false;
} break;
}
}
//main entity construction
if(rawType.getCollidable() != null){
CollidableTemplate physicsTemplate = rawType.getCollidable();
CollisionObject rigidBody;
Collidable collidable;
float mass = 1.0f;
Matrix4f inertiaTensor;
Vector3f scale;
switch(physicsTemplate.getType()){
case "CYLINDER":
rigidBody = PhysicsUtils.getCylinderObject(new Vector3f(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3()));
collidable = new Collidable(rVal, Collidable.TYPE_OBJECT);
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody);
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY_OFFSET, new Vector3f(physicsTemplate.getOffsetX(),physicsTemplate.getOffsetY(),physicsTemplate.getOffsetZ()));
rVal.putData(EntityDataStrings.PHYSICS_MODEL_TEMPLATE, physicsTemplate);
rVal.putData(EntityDataStrings.PHYSICS_COLLIDABLE, collidable);
rVal.putData(EntityDataStrings.COLLIDABLE_TREE, new CollidableTree(rVal,collidable,rigidBody, collisionMakeDynamic));
scale = new Vector3f(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3());
rVal.putData(EntityDataStrings.PHYSICS_MASS, mass);
//inertia tensor
//https://scienceworld.wolfram.com/physics/MomentofInertiaCylinder.html
inertiaTensor = new Matrix4f();
inertiaTensor.m00(mass * scale.y * scale.y / 12.0f + mass * scale.x * scale.x / 4.0f);
inertiaTensor.m11(mass * scale.y * scale.y / 12.0f + mass * scale.x * scale.x / 4.0f);
inertiaTensor.m22(mass * scale.x * scale.x / 2.0f);
rVal.putData(EntityDataStrings.PHYSICS_INVERSE_INERTIA_TENSOR, inertiaTensor.invert());
Globals.collisionEngine.registerPhysicsEntity(rVal);
Globals.collisionEngine.registerCollisionObject(rigidBody, collidable);
break;
case "CUBE":
rigidBody = PhysicsUtils.getCubeObject(new Vector3f(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3()));
collidable = new Collidable(rVal, Collidable.TYPE_OBJECT);
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody);
rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY_OFFSET, new Vector3f(physicsTemplate.getOffsetX(),physicsTemplate.getOffsetY(),physicsTemplate.getOffsetZ()));
rVal.putData(EntityDataStrings.PHYSICS_MODEL_TEMPLATE, physicsTemplate);
rVal.putData(EntityDataStrings.PHYSICS_COLLIDABLE, collidable);
rVal.putData(EntityDataStrings.COLLIDABLE_TREE, new CollidableTree(rVal,collidable,rigidBody, collisionMakeDynamic));
scale = new Vector3f(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3());
rVal.putData(EntityDataStrings.PHYSICS_MASS, mass);
//inertia tensor
//https://hepweb.ucsd.edu/ph110b/110b_notes/node26.html
inertiaTensor = new Matrix4f().identity().scale(mass * scale.x * scale.x / 6.0f).m33(1);
rVal.putData(EntityDataStrings.PHYSICS_INVERSE_INERTIA_TENSOR, inertiaTensor.invert());
Globals.collisionEngine.registerPhysicsEntity(rVal);
Globals.collisionEngine.registerCollisionObject(rigidBody, collidable);
break;
}
Globals.collisionEngine.registerDynamicPhysicsEntity(rVal);
Globals.entityManager.registerCollidableEntity(rVal);
}
for(String token : rawType.getTokens()){
switch(token){
case "BLENDER_TRANSFORM":
ActorUtils.applyBlenderTransformer(rVal);
break;
case "GRAVITY":
Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE);
CollisionObject collisionObject = (CollisionObject)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
GravityTree gravityTree = new GravityTree(rVal,collidable,collisionObject,30);
// gravityTree.setCollisionObject(collisionObject, collidable);
rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true);
rVal.putData(EntityDataStrings.GRAVITY_TREE, gravityTree);
Globals.entityManager.registerGravityEntity(rVal);
break;
case "TARGETABLE":
Globals.entityManager.registerTargetableEntity(rVal);
break;
case "INVENTORY":
rVal.putData(EntityDataStrings.NATURAL_INVENTORY,UnrelationalInventoryState.createUnrelationalInventory(10));
InventoryUtils.setInventoryState(rVal, InventoryState.createInventoryState(rVal));
break;
case "OUTLINE":
rVal.putData(EntityDataStrings.DRAW_OUTLINE, true);
break;
case "TERRAIN_COLLISION": {
CollisionObjUtils.getCollidable(rVal).overrideType(Collidable.TYPE_TERRAIN);
} break;
}
}
//add health system
// rVal.putData(EntityDataStrings.LIFE_STATE, new LifeState(rVal, rawType.getHealthSystem()));
// Globals.entityManager.registerLifeStateEntity(rVal);
//idle tree & generic stuff all objects have
rVal.putData(EntityDataStrings.IDLE_TREE, new IdleTree(rVal));
rVal.putData(EntityDataStrings.DRAW_CAST_SHADOW, true);
return rVal;
}
}

View File

@ -151,6 +151,9 @@ public class CollisionEngine {
case Collidable.TYPE_ITEM:
receiver.addImpulse(new Impulse(normal, localPosition, worldPos, magnitude, Collidable.TYPE_ITEM));
break;
case Collidable.TYPE_OBJECT:
receiver.addImpulse(new Impulse(normal, localPosition, worldPos, magnitude, Collidable.TYPE_OBJECT));
break;
}
break;
case Collidable.TYPE_ITEM:
@ -177,6 +180,9 @@ public class CollisionEngine {
case Collidable.TYPE_ITEM:
receiver.addImpulse(new Impulse(normal, localPosition, worldPos, magnitude, Collidable.TYPE_ITEM));
break;
case Collidable.TYPE_OBJECT:
receiver.addImpulse(new Impulse(normal, localPosition, worldPos, magnitude, Collidable.TYPE_OBJECT));
break;
}
break;
}
@ -296,6 +302,10 @@ public class CollisionEngine {
public void registerDynamicPhysicsEntity(Entity dynamicEntity){
dynamicPhysicsEntities.add(dynamicEntity);
}
public void deregisterDynamicPhysicsEntity(Entity dynamicEntity){
dynamicPhysicsEntities.remove(dynamicEntity);
}
public List<Entity> getDynamicPhysicsEntities(){
return dynamicPhysicsEntities;

View File

@ -28,6 +28,7 @@ public class Collidable {
public static final String TYPE_STRUCTURE = "structure";
public static final String TYPE_ITEM = "item";
public static final String TYPE_FORCE = "force";
public static final String TYPE_OBJECT = "object";
public Collidable(Entity parent, String type){
@ -50,6 +51,10 @@ public class Collidable {
public String getType() {
return type;
}
public void overrideType(String type){
this.type = type;
}
public void clear(){
impulses.clear();

View File

@ -9,6 +9,8 @@ import electrosphere.game.data.creature.type.attack.AttackMoveResolver;
import electrosphere.game.data.creature.type.model.CreatureTypeMap;
import electrosphere.game.data.foliage.type.model.FoliageTypeMap;
import electrosphere.game.data.item.type.model.ItemTypeMap;
import electrosphere.game.data.object.type.ObjectData;
import electrosphere.game.data.object.type.model.ObjectTypeLoader;
import electrosphere.game.data.object.type.model.ObjectTypeMap;
import electrosphere.game.data.structure.type.model.StructureTypeMap;
import electrosphere.game.server.race.model.RaceMap;
@ -25,7 +27,7 @@ public class Config {
StructureTypeMap structureTypeMap;
ItemTypeMap itemMap;
FoliageTypeMap foliageMap;
ObjectTypeMap objectMap;
ObjectTypeLoader objectTypeLoader;
SymbolMap symbolMap;
RaceMap raceMap;
@ -35,7 +37,7 @@ public class Config {
config.itemMap = FileUtils.loadObjectFromAssetPath("Data/items.json", ItemTypeMap.class);
config.structureTypeMap = FileUtils.loadObjectFromAssetPath("Data/structures.json", StructureTypeMap.class);
config.foliageMap = FileUtils.loadObjectFromAssetPath("Data/foliage.json", FoliageTypeMap.class);
config.objectMap = FileUtils.loadObjectFromAssetPath("Data/objects.json", ObjectTypeMap.class);
config.objectTypeLoader = loadObjectTypes("Data/objects.json");
config.symbolMap = FileUtils.loadObjectFromAssetPath("Data/symbolism.json", SymbolMap.class);
config.raceMap = FileUtils.loadObjectFromAssetPath("Data/races.json", RaceMap.class);
return config;
@ -76,6 +78,32 @@ public class Config {
return loader;
}
static List<ObjectData> readObjectTypeFile(String filename){
List<ObjectData> typeList = new LinkedList<ObjectData>();
ObjectTypeMap typeMap = FileUtils.loadObjectFromAssetPath(filename, ObjectTypeMap.class);
//push the types from this file
for(ObjectData type : typeMap.getObjects()){
typeList.add(type);
}
//push types from any other files
for(String filepath : typeMap.getFiles()){
List<ObjectData> parsedTypeList = readObjectTypeFile(filepath);
for(ObjectData type : parsedTypeList){
typeList.add(type);
}
}
return typeList;
}
static ObjectTypeLoader loadObjectTypes(String initialPath) {
ObjectTypeLoader loader = new ObjectTypeLoader();
List<ObjectData> typeList = readObjectTypeFile(initialPath);
for(ObjectData type : typeList){
loader.putObject(type.getObjectId(), type);
}
return loader;
}
public CreatureTypeLoader getCreatureTypeLoader() {
return creatureTypeLoader;
}
@ -99,5 +127,9 @@ public class Config {
public RaceMap getRaceMap() {
return raceMap;
}
public ObjectTypeLoader getObjectTypeLoader() {
return objectTypeLoader;
}
}

View File

@ -4,7 +4,7 @@ import electrosphere.entity.types.hitbox.HitboxData;
import electrosphere.game.data.creature.type.CollidableTemplate;
import java.util.List;
public class Object {
public class ObjectData {
String objectId;
String modelPath;

View File

@ -0,0 +1,22 @@
package electrosphere.game.data.object.type.model;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import electrosphere.game.data.object.type.ObjectData;
public class ObjectTypeLoader {
Map<String,ObjectData> objectMap = new HashMap<String,ObjectData>();
public void putObject(String name, ObjectData type){
objectMap.put(name,type);
}
public ObjectData getObject(String name){
return objectMap.get(name);
}
}

View File

@ -1,18 +1,20 @@
package electrosphere.game.data.object.type.model;
import electrosphere.game.data.object.type.Object;
import electrosphere.game.data.object.type.ObjectData;
import java.util.List;
public class ObjectTypeMap {
List<Object> objects;
public List<Object> getObjects() {
List<ObjectData> objects;
List<String> files;
public List<ObjectData> getObjects() {
return objects;
}
public Object getObject(String name){
Object rVal = null;
for(Object item : objects){
public ObjectData getObject(String name){
ObjectData rVal = null;
for(ObjectData item : objects){
if(item.getObjectId().equals(name)){
rVal = item;
break;
@ -20,5 +22,9 @@ public class ObjectTypeMap {
}
return rVal;
}
public List<String> getFiles(){
return files;
}
}

View File

@ -784,7 +784,7 @@ public class RenderingEngine {
// Vector3f scale = EntityUtils.getScale(physicsEntity);
Quaternionf rotation = EntityUtils.getRotation(physicsEntity);
//calculate camera-modified vector3f
Vector3f cameraModifiedPosition = new Vector3f((float)position.x,(float)position.y,(float)position.z).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
Vector3f cameraModifiedPosition = new Vector3f((float)position.x,(float)position.y,(float)position.z).add(template.getOffsetX(),template.getOffsetY(),template.getOffsetZ()).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
modelTransformMatrix.identity();
modelTransformMatrix.translate(cameraModifiedPosition);
modelTransformMatrix.rotate(rotation);