First working version of proper networking

This commit is contained in:
austin 2021-05-21 21:19:00 -04:00
parent 631bdea776
commit c0b0362e71
34 changed files with 1141 additions and 434 deletions

19
pom.xml
View File

@ -108,6 +108,13 @@
<artifactId>TerrainGen</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>electrosphere</groupId>
<artifactId>RendererNetworkParser</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
<profiles>
@ -160,13 +167,23 @@
<configuration>
<archive>
<manifest>
<mainClass>main.Main</mainClass>
<addClasspath>true</addClasspath>
<mainClass>electrosphere.main.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

View File

@ -19,7 +19,7 @@ import java.util.logging.Logger;
public class MainConfig {
//localconfig.json version
public static final int CONFIG_FILE_VERSION = 2;
public static final int CONFIG_FILE_VERSION = 4;
//physical file version
public int version;
@ -32,7 +32,8 @@ public class MainConfig {
//
//should we run a server at all?
public boolean runServer;
public boolean runClient;
public String serverAddress;
//
//Rendering related
@ -82,6 +83,12 @@ public class MainConfig {
} else {
Globals.mainConfig.runServer = false;
}
System.out.println("Would you like to run the client?(1-y/0-n)");
if(scan.nextInt() == 1){
Globals.mainConfig.runClient = true;
} else {
Globals.mainConfig.runClient = false;
}
System.out.println("Would you like to run the renderer?(1-y/0-n)");
if(scan.nextInt() == 1){
Globals.mainConfig.runRenderer = true;

View File

@ -1,11 +1,13 @@
package electrosphere.controls;
import electrosphere.entity.CameraEntityUtils;
import electrosphere.entity.CreatureUtils;
import electrosphere.entity.EntityUtil;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.MovementTree;
import electrosphere.entity.state.MovementTree.MovementTreeState;
import electrosphere.main.Globals;
import static electrosphere.main.Main.camera_Current;
import electrosphere.net.client.ClientNetworkMessage;
import electrosphere.net.message.EntityMessage;
import electrosphere.util.Utilities;
import java.util.HashMap;
import java.util.List;
@ -68,86 +70,97 @@ public class ControlHandler {
public void pollControls(){
MovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
/*
Move forward
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD)){
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD)) == GLFW_PRESS){
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-camera_Current.pos_Center.x,0,-camera_Current.pos_Center.z).normalize());
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
movementTree.start();
if(Globals.playerCharacter != null){
MovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
/*
Move forward
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD)){
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD)) == GLFW_PRESS){
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-cameraEyeVector.x,0,-cameraEyeVector.z).normalize());
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
movementTree.start();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, true);
Vector3f position = EntityUtils.getEntityPosition(Globals.playerCharacter);
EntityMessage outgoingMessage = EntityMessage.constructMoveMessage(
Globals.playerCharacter.getId(),
position.x,
position.y,
position.z
);
Globals.clientConnection.queueOutgoingMessage(outgoingMessage);
} else {
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD) == true){
movementTree.slowdown();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, false);
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, true);
} else {
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD) == true){
movementTree.slowdown();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, false);
}
}
/*
Move backward
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD)){
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD)) == GLFW_PRESS){
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(camera_Current.pos_Center.x,0,camera_Current.pos_Center.z).normalize());
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
movementTree.start();
/*
Move backward
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD)){
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD)) == GLFW_PRESS){
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(cameraEyeVector.x,0,cameraEyeVector.z).normalize());
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
movementTree.start();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, true);
} else {
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD) == true){
movementTree.slowdown();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, false);
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, true);
} else {
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD) == true){
movementTree.slowdown();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, false);
}
}
/*
Move left
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT)){
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT)) == GLFW_PRESS){
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-camera_Current.pos_Center.x,0,-camera_Current.pos_Center.z).rotateY((float)(90 * Math.PI / 180)).normalize());
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
movementTree.start();
/*
Move left
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT)){
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT)) == GLFW_PRESS){
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY((float)(90 * Math.PI / 180)).normalize());
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
movementTree.start();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, true);
} else {
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT) == true){
movementTree.slowdown();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, false);
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, true);
} else {
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT) == true){
movementTree.slowdown();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, false);
}
}
/*
Move right
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT)){
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT)) == GLFW_PRESS){
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-camera_Current.pos_Center.x,0,-camera_Current.pos_Center.z).rotateY((float)(-90 * Math.PI / 180)).normalize());
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
movementTree.start();
/*
Move right
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT)){
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT)) == GLFW_PRESS){
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY((float)(-90 * Math.PI / 180)).normalize());
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
movementTree.start();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, true);
} else {
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT) == true){
movementTree.slowdown();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, false);
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, true);
} else {
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT) == true){
movementTree.slowdown();
}
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, false);
}
}
/*
Move up
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP) && glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP)) == GLFW_PRESS){
EntityUtil.getEntityPosition(Globals.playerCharacter).add(new Vector3f(0,0.6f,0).mul(1f));
}
/*
Move down
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_FALL) && glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_FALL)) == GLFW_PRESS){
EntityUtil.getEntityPosition(Globals.playerCharacter).add(new Vector3f(0,-0.6f,0).mul(1f));
/*
Move up
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP) && glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP)) == GLFW_PRESS){
EntityUtils.getEntityPosition(Globals.playerCharacter).add(new Vector3f(0,0.6f,0).mul(1f));
}
/*
Move down
*/
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_FALL) && glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_FALL)) == GLFW_PRESS){
EntityUtils.getEntityPosition(Globals.playerCharacter).add(new Vector3f(0,-0.6f,0).mul(1f));
}
}
}

View File

@ -1,6 +1,7 @@
package electrosphere.entity;
import electrosphere.main.Globals;
import org.joml.Matrix4f;
import org.joml.Quaternionf;
import org.joml.Vector3f;
@ -11,19 +12,21 @@ import org.joml.Vector3f;
public class CameraEntityUtils {
public static Entity spawnBasicCameraEntity(Vector3f position){
public static Entity spawnBasicCameraEntity(Vector3f center, Vector3f eye){
Entity rVal = new Entity();
Globals.entityManager.registerEntity(rVal);
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_TYPE, EntityDataStrings.DATA_STRING_CAMERA_TYPE_BASIC);
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_CENTER, center);
rVal.putData(EntityDataStrings .DATA_STRING_CAMERA_EYE, eye);
return rVal;
}
public static Entity spawnOrbitalCameraEntity(Entity target, float distance){
public static Entity spawnPointTrackingCameraEntity(Vector3f center, Vector3f eye){
Entity rVal = new Entity();
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_TYPE, EntityDataStrings.DATA_STRING_CAMERA_TYPE_ORBIT);
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_ORBIT_TARGET, target);
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_POSITION, new Vector3f(0,0,0));
rVal.putData(EntityDataStrings .DATA_STRING_CAMERA_ROTATION, new Quaternionf());
Globals.entityManager.registerEntity(rVal);
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_TYPE, EntityDataStrings.DATA_STRING_CAMERA_TYPE_ORBIT);
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_CENTER, center);
rVal.putData(EntityDataStrings .DATA_STRING_CAMERA_EYE, eye);
return rVal;
}
@ -35,20 +38,20 @@ public class CameraEntityUtils {
return (float)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_ORBIT_DISTANCE);
}
public static void setCameraPosition(Entity camera, Vector3f position){
camera.putData(EntityDataStrings.DATA_STRING_CAMERA_POSITION, position);
public static void setCameraCenter(Entity camera, Vector3f center){
camera.putData(EntityDataStrings.DATA_STRING_CAMERA_CENTER, center);
}
public static Vector3f getCameraPosition(Entity camera){
return (Vector3f)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_POSITION);
public static Vector3f getCameraCenter(Entity camera){
return (Vector3f)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_CENTER);
}
public static void setCameraRotation(Entity camera, Quaternionf rotation){
camera.putData(EntityDataStrings.DATA_STRING_CAMERA_ROTATION, rotation);
public static void setCameraEye(Entity camera, Vector3f eye){
camera.putData(EntityDataStrings.DATA_STRING_CAMERA_EYE, eye);
}
public static Quaternionf getCameraRotation(Entity camera){
return (Quaternionf)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_ROTATION);
public static Vector3f getCameraEye(Entity camera){
return (Vector3f)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_EYE);
}
public static void destroyCameraEntity(Entity e){
@ -57,4 +60,13 @@ public class CameraEntityUtils {
}
}
public static Matrix4f getCameraViewMatrix(Vector3f cameraEye){
Matrix4f rVal = new Matrix4f().setLookAt(
cameraEye, //eye
new Vector3f(0,0,0), //center
new Vector3f(cameraEye).add(new Vector3f(0,1.0f,0)) // up
).scale(1.0f, 1.5f, 1.0f);
return rVal;
}
}

View File

@ -2,7 +2,10 @@ package electrosphere.entity;
import electrosphere.entity.state.MovementTree;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.message.EntityMessage;
import electrosphere.renderer.Model;
import electrosphere.util.ModelLoader;
import org.joml.Quaternionf;
import org.joml.Vector3f;
@ -11,9 +14,12 @@ import org.joml.Vector3f;
* @author amaterasu
*/
public class CreatureUtils {
public static Entity spawnBasicControllableEntity(Model m, float acceleration, float maxVelocity){
public static Entity spawnBasicCreature(int creatureId, float acceleration, float maxVelocity){
Entity rVal = new Entity();
rVal.putData(EntityDataStrings.DATA_STRING_MODEL, m);
rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_IS_CREATURE, true);
rVal.putData(EntityDataStrings.DATA_STRING_MODEL_PATH, Globals.entityTypeMap.get(creatureId).getModelPath());
Globals.assetManager.addModelPathToQueue(Globals.entityTypeMap.get(creatureId).getModelPath());
rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_TYPE, creatureId);
rVal.putData(EntityDataStrings.DATA_STRING_POSITION, new Vector3f(0,0,0));
rVal.putData(EntityDataStrings.DATA_STRING_ROTATION, new Quaternionf().rotateAxis((float)0, new Vector3f(1,0,0)));
rVal.putData(EntityDataStrings.DATA_STRING_SCALE, new Vector3f(1,1,1));
@ -63,4 +69,28 @@ public class CreatureUtils {
public static MovementTree getEntityMovementTree(Entity e){
return (MovementTree)e.getData(EntityDataStrings.DATA_STRING_MOVEMENT_BT);
}
public static void attachEntityMessageToMovementTree(Entity e, EntityMessage em){
getEntityMovementTree(e).addNetworkMessage(em);
}
public static int getCreatureType(Entity e){
return (int)e.getData(EntityDataStrings.DATA_STRING_CREATURE_TYPE);
}
public static int getControllerPlayerId(Entity e){
return (int)e.getData(EntityDataStrings.DATA_STRING_CREATURE_CONTROLLER_PLAYER_ID);
}
public static void setControllerPlayerId(Entity e, int id){
e.putData(EntityDataStrings.DATA_STRING_CREATURE_CONTROLLER_PLAYER_ID, id);
}
public static boolean hasControllerPlayerId(Entity e){
return e.getDataKeys().contains(EntityDataStrings.DATA_STRING_CREATURE_CONTROLLER_PLAYER_ID);
}
public static boolean isCreature(Entity e){
return e.getDataKeys().contains(EntityDataStrings.DATA_STRING_CREATURE_IS_CREATURE);
}
}

View File

@ -26,6 +26,10 @@ public class Entity {
public int getId() {
return id;
}
public void setId(int id){
this.id = id;
}
// HashMap<String, Object> getData() {
// return data;

View File

@ -12,12 +12,15 @@ public class EntityDataStrings {
public static final String DATA_STRING_POSITION = "position";
public static final String DATA_STRING_ROTATION = "rotation";
public static final String DATA_STRING_SCALE = "scale";
public static final String DATA_STRING_MODEL = "model";
public static final String DATA_STRING_MODEL_PATH = "modelPath";
/*
Moveable Entity
Creature Entity
*/
public static final String DATA_STRING_CREATURE_IS_CREATURE = "isCreature";
public static final String DATA_STRING_CREATURE_TYPE = "creatureType";
public static final String DATA_STRING_CREATURE_CONTROLLER_PLAYER_ID = "creaturePlayerId";
public static final String DATA_STRING_MOVEMENT_BT = "movementBT";
public static final String DATA_STRING_MOVEMENT_VECTOR = "movementVector";
public static final String DATA_STRING_VELOCITY = "velocity";
@ -29,9 +32,10 @@ public class EntityDataStrings {
*/
public static final String DATA_STRING_CAMERA_TYPE = "cameraType";
public static final String DATA_STRING_CAMERA_TYPE_BASIC = "cameraTypeBasic";
public static final String DATA_STRING_CAMERA_TYPE_ORBIT = "cameraTypeOrbit";
public static final String DATA_STRING_CAMERA_POSITION = "cameraPosition";
public static final String DATA_STRING_CAMERA_ROTATION = "cameraRotation";
public static final String DATA_STRING_CAMERA_EYE = "cameraEye";
public static final String DATA_STRING_CAMERA_CENTER = "cameraCenter";
/*

View File

@ -1,6 +1,7 @@
package electrosphere.entity;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@ -9,17 +10,18 @@ import java.util.concurrent.CopyOnWriteArrayList;
*/
public class EntityManager {
static CopyOnWriteArrayList<Entity> entityList;
static CopyOnWriteArrayList<Entity> drawableList;
static CopyOnWriteArrayList<Entity> moveableList;
static ConcurrentHashMap entityIdMap = new ConcurrentHashMap();
static CopyOnWriteArrayList<Entity> entityList = new CopyOnWriteArrayList();
static CopyOnWriteArrayList<Entity> drawableList = new CopyOnWriteArrayList();
static CopyOnWriteArrayList<Entity> moveableList = new CopyOnWriteArrayList();
public EntityManager(){
entityList = new CopyOnWriteArrayList();
drawableList = new CopyOnWriteArrayList();
moveableList = new CopyOnWriteArrayList();
}
public void registerEntity(Entity e){
entityIdMap.put(e.getId(), e);
entityList.add(e);
}
@ -27,26 +29,38 @@ public class EntityManager {
drawableList.add(e);
}
public Iterator<Entity> getDrawableIterator(){
return drawableList.iterator();
public CopyOnWriteArrayList<Entity> getDrawable(){
return drawableList;
}
public void registerMoveableEntity(Entity e){
moveableList.add(e);
}
public Iterator<Entity> getMoveableIterator(){
return moveableList.iterator();
public CopyOnWriteArrayList<Entity> getMoveable(){
return moveableList;
}
public void deregisterEntity(Entity e){
if(drawableList.contains(e)){
drawableList.remove(e);
EntityUtil.cleanUpDrawableEntity(e);
EntityUtils.cleanUpDrawableEntity(e);
}
if(entityList.contains(e)){
entityList.remove(e);
}
}
public void overrideEntityId(Entity e, int id){
if(entityIdMap.contains(e.getId())){
entityIdMap.remove(e.getId());
}
e.setId(id);
entityIdMap.put(e.getId(), e);
}
public Entity getEntityFromId(int id){
return (Entity)entityIdMap.get(id);
}
}

View File

@ -15,7 +15,7 @@ import org.joml.Vector3f;
*
* @author amaterasu
*/
public class EntityUtil {
public class EntityUtils {
public static Vector3f getEntityPosition(Entity e){
return (Vector3f)e.getData(EntityDataStrings.DATA_STRING_POSITION);
@ -29,13 +29,13 @@ public class EntityUtil {
return (Vector3f)e.getData(EntityDataStrings.DATA_STRING_SCALE);
}
public static Model getEntityModel(Entity e){
return (Model)e.getData(EntityDataStrings.DATA_STRING_MODEL);
public static String getEntityModelPath(Entity e){
return (String)e.getData(EntityDataStrings.DATA_STRING_MODEL_PATH);
}
public static Entity spawnDrawableEntity(Model m){
public static Entity spawnDrawableEntity(String modelPath){
Entity rVal = new Entity();
rVal.putData(EntityDataStrings.DATA_STRING_MODEL, m);
rVal.putData(EntityDataStrings.DATA_STRING_MODEL_PATH, modelPath);
rVal.putData(EntityDataStrings.DATA_STRING_POSITION, new Vector3f(0,0,0));
rVal.putData(EntityDataStrings.DATA_STRING_ROTATION, new Quaternionf().rotateAxis((float)0, new Vector3f(1,0,0)));
rVal.putData(EntityDataStrings.DATA_STRING_SCALE, new Vector3f(1,1,1));
@ -47,7 +47,13 @@ public class EntityUtil {
public static void cleanUpDrawableEntity(Entity e){
if(e != null){
Globals.entityManager.deregisterEntity(e);
getEntityModel(e).free();
// getEntityModelPath(e).free();
}
}
public static void setEntityID(Entity e, int id){
Globals.entityManager.overrideEntityId(e, id);
}
}

View File

@ -2,10 +2,14 @@ package electrosphere.entity.state;
import electrosphere.entity.CreatureUtils;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtil;
import electrosphere.entity.EntityUtils;
import electrosphere.main.Globals;
import electrosphere.net.NetUtils;
import electrosphere.net.message.EntityMessage;
import electrosphere.renderer.Animation;
import electrosphere.renderer.Model;
import java.util.LinkedList;
import java.util.concurrent.CopyOnWriteArrayList;
import org.joml.Vector3f;
/**
@ -28,6 +32,8 @@ public class MovementTree {
Entity parent;
CopyOnWriteArrayList<EntityMessage> networkMessageQueue = new CopyOnWriteArrayList();
public MovementTree(Entity e){
state = MovementTreeState.IDLE;
parent = e;
@ -69,18 +75,35 @@ public class MovementTree {
float velocity = CreatureUtils.getVelocity(parent);
float acceleration = CreatureUtils.getAcceleration(parent);
float maxNaturalVelocity = CreatureUtils.getMaxNaturalVelocity(parent);
Model entityModel = EntityUtil.getEntityModel(parent);
Vector3f position = EntityUtil.getEntityPosition(parent);
Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent));
Vector3f position = EntityUtils.getEntityPosition(parent);
Vector3f movementVector = CreatureUtils.getMovementVector(parent);
System.out.println(movementVector);
//parse attached network messages
for(EntityMessage message : networkMessageQueue){
networkMessageQueue.remove(message);
// System.out.println("MOVE to " + message.getX() + " " + message.getY() + " " + message.getZ());
switch(message.getEntityMessageType()){
case MOVE:
position.set(message.getX(), message.getY(), message.getZ());
if(Globals.mainConfig.runServer){
Globals.server.broadcastMessage(EntityMessage.constructMoveMessage(parent.getId(), message.getX(), message.getY(), message.getZ()));
}
break;
}
}
//state machine
switch(state){
case STARTUP:
//run startup code
velocity = velocity + acceleration;
CreatureUtils.setVelocity(parent, velocity);
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_STARTUP)){
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP);
entityModel.currentAnimation.incrementTime(0.01);
if(entityModel != null){
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_STARTUP)){
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP);
entityModel.currentAnimation.incrementTime(0.01);
}
}
//check if can transition state
if(velocity >= maxNaturalVelocity){
@ -89,29 +112,33 @@ public class MovementTree {
}
//move the entity
position.add(new Vector3f(movementVector).mul(velocity));
position.y = Globals.cellManager.getElevationAtRealPoint(position.x, position.z);
EntityUtil.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z);
EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
break;
case MOVE:
//check if can restart animation
//if yes, restart animation
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_MOVE)){
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_MOVE);
entityModel.currentAnimation.incrementTime(0.01);
if(entityModel != null){
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_MOVE)){
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_MOVE);
entityModel.currentAnimation.incrementTime(0.01);
}
}
//check if can move forward (collision engine)
//if can, move forward by entity movement stats
position.add(new Vector3f(movementVector).mul(velocity));
position.y = Globals.cellManager.getElevationAtRealPoint(position.x, position.z);
EntityUtil.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z);
EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
break;
case SLOWDOWN:
//run slowdown code
velocity = velocity - acceleration;
CreatureUtils.setVelocity(parent, velocity);
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_STARTUP)){
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP);
entityModel.currentAnimation.incrementTime(0.01);
if(entityModel != null){
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_STARTUP)){
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP);
entityModel.currentAnimation.incrementTime(0.01);
}
}
//check if can transition state
if(velocity <= 0){
@ -120,17 +147,25 @@ public class MovementTree {
}
//move the entity
position.add(new Vector3f(movementVector).mul(velocity));
position.y = Globals.cellManager.getElevationAtRealPoint(position.x, position.z);
EntityUtil.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z);
EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
break;
case IDLE:
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_IDLE_1)){
entityModel.playAnimation(Animation.ANIMATION_IDLE_1);
entityModel.currentAnimation.incrementTime(0.01);
if(entityModel != null){
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_IDLE_1)){
entityModel.playAnimation(Animation.ANIMATION_IDLE_1);
entityModel.currentAnimation.incrementTime(0.01);
}
}
break;
}
}
public void addNetworkMessage(EntityMessage networkMessage) {
networkMessageQueue.add(networkMessage);
}
}

View File

@ -0,0 +1,27 @@
package electrosphere.entity.types.creature;
/**
*
* @author amaterasu
*/
public class CreatureType {
int id;
String modelPath;
public int getId() {
return id;
}
public String getModelPath() {
return modelPath;
}
public void setId(int id) {
this.id = id;
}
public void setModelPath(String modelPath) {
this.modelPath = modelPath;
}
}

View File

@ -0,0 +1,16 @@
package electrosphere.entity.types.creature;
import java.util.List;
/**
*
* @author amaterasu
*/
public class CreatureTypeList {
List<CreatureType> types;
public List<CreatureType> getTypes() {
return types;
}
}

View File

@ -1,7 +1,7 @@
package electrosphere.game.cell;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtil;
import electrosphere.entity.EntityUtils;
import electrosphere.main.Globals;
import electrosphere.renderer.Model;
import electrosphere.renderer.ModelUtils;
@ -44,13 +44,14 @@ public class DrawCell {
Globals.entityManager.deregisterEntity(modelEntity);
}
Model terrainModel = ModelUtils.createTerrainModelPrecomputedShader(drawArray, program, stride);
modelEntity = EntityUtil.spawnDrawableEntity(terrainModel);
String terrainModelPath = Globals.assetManager.registerModel(terrainModel);
modelEntity = EntityUtils.spawnDrawableEntity(terrainModelPath);
// System.out.println("New cell @ " + cellX * cellWidth + "," + cellY * cellWidth);
EntityUtil.getEntityPosition(modelEntity).set(new Vector3f(cellX * cellWidth, 0.01f, cellY * cellWidth));
EntityUtils.getEntityPosition(modelEntity).set(new Vector3f(cellX * cellWidth, 0.01f, cellY * cellWidth));
}
public void retireCell(){
EntityUtil.cleanUpDrawableEntity(modelEntity);
EntityUtils.cleanUpDrawableEntity(modelEntity);
}
}

View File

@ -9,7 +9,7 @@ import org.joml.Vector3f;
*
* @author satellite
*/
public class CellManager {
public class DrawCellManager {
//the terrain manager this cell manager constructs off of
TerrainManager terrainManager;
@ -36,7 +36,7 @@ public class CellManager {
int drawStepdownInterval = 3;
int drawStepdownValue = 5;
public CellManager(TerrainManager terrainManager, float realX, float realY){
public DrawCellManager(TerrainManager terrainManager, float realX, float realY){
this.terrainManager = terrainManager;
this.miniCellWidth = miniCellWidth;
cells = new DrawCell[drawRadius * 2 + 1][drawRadius * 2 + 1];

View File

@ -0,0 +1,40 @@
package electrosphere.game.simcell.entity;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import java.util.concurrent.CopyOnWriteArrayList;
import org.joml.Vector3f;
/**
*
* @author satellite
*/
public class EntityCell {
int realWorldXStart;
int realWorldYStart;
int width;
CopyOnWriteArrayList<Entity> residentEntities = new CopyOnWriteArrayList();
public boolean containsPoint(Vector3f position){
float x = position.x;
float z = position.z;
return x >=realWorldXStart &&
x < realWorldXStart + width &&
z >=realWorldYStart &&
z < realWorldYStart + width;
}
public CopyOnWriteArrayList<Entity> getResidentEntities(){
return residentEntities;
}
public void simulate(){
for(Entity entity : residentEntities){
if(!containsPoint(EntityUtils.getEntityPosition(entity))){
residentEntities.remove(entity);
}
}
}
}

View File

@ -1,9 +0,0 @@
package electrosphere.game.simcell.physical;
/**
*
* @author satellite
*/
public class PhysicalCell {
}

View File

@ -1,9 +0,0 @@
package electrosphere.game.simcell.virtual;
/**
*
* @author satellite
*/
public class VirtualCell {
}

View File

@ -13,8 +13,13 @@ import electrosphere.cfg.MainConfig;
import electrosphere.controls.ControlHandler;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityManager;
import electrosphere.game.cell.CellManager;
import electrosphere.net.client.Connection;
import electrosphere.entity.types.creature.CreatureType;
import electrosphere.entity.types.creature.CreatureTypeList;
import electrosphere.game.cell.DrawCellManager;
import electrosphere.game.terrain.TerrainManager;
import electrosphere.net.client.ClientNetworking;
import electrosphere.net.server.Server;
import electrosphere.renderer.assetmanager.AssetManager;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
@ -24,6 +29,8 @@ import java.util.logging.Logger;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import electrosphere.util.ModelLoader;
import electrosphere.util.Utilities;
import java.util.HashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import org.lwjgl.glfw.GLFWErrorCallback;
@ -43,7 +50,12 @@ public class Globals {
//
//Client connection to server
//
public static Connection connection;
public static ClientNetworking clientConnection;
//
//Server manager thing
//
public static Server server;
//
@ -52,6 +64,12 @@ public class Globals {
public static ControlHandler controlHandler;
//
//Entity Types Map
//
public static HashMap<Integer,CreatureType> entityTypeMap = new HashMap();
//
//Generic OpenGL Statements
@ -83,7 +101,10 @@ public class Globals {
public static EntityManager entityManager;
public static Camera cameraVisible;
public static TerrainManager terrainManager;
public static AssetManager assetManager;
//
//Game specific models
@ -92,7 +113,7 @@ public class Globals {
//chunk stuff
//constant for how far in game units you have to move to load chunks
public static CellManager cellManager;
public static DrawCellManager drawCellManager;
//famous fuckin last words, but temporary solution
@ -100,8 +121,6 @@ public class Globals {
public static ArrayList<Vector3f> skyboxColors;
//player's entity
//the player camera entity
public static Entity playerCamera;
@ -112,6 +131,27 @@ public class Globals {
public static void initGlobals(){
//load in default texture map
Gson gson = new Gson();
try {
//deserializes the texture map from its default path using gson
//also done in one line
textureMapDefault = gson.fromJson(Files.newBufferedReader(new File(Thread.currentThread().getContextClassLoader().getResource("Textures/default_texture_map.json").getFile()).toPath()), TextureMap.class); //only the best of coding practices :)
} catch (IOException ex) { ex.printStackTrace(); } //TODO: handle better :tm:
//entity type map
initEntityTypeMap();
//create entity manager
entityManager = new EntityManager();
//init game specific variables
initGameSpecifics();
//temporary hold for skybox colors
skyboxColors = new ArrayList();
//load asset manager
assetManager = new AssetManager();
}
public static void initDefaultResources(){
//create default textures
textureDiffuseDefault = new Texture("Textures/default_diffuse.png");
textureSpecularDefault = new Texture("Textures/default_specular.png");
@ -121,23 +161,15 @@ public class Globals {
materialDefault.set_specular(textureSpecularDefault);
//create default lights
lightDirectionalDefault = new DirectionalLight(new Vector3f(0,-1f,0));
//load in default texture map
Gson gson = new Gson();
try {
//deserializes the texture map from its default path using gson
//also done in one line
textureMapDefault = gson.fromJson(Files.newBufferedReader(new File(Thread.currentThread().getContextClassLoader().getResource("Textures/default_texture_map.json").getFile()).toPath()), TextureMap.class); //only the best of coding practices :)
} catch (IOException ex) { ex.printStackTrace(); } //TODO: handle better :tm:
//create entity manager
entityManager = new EntityManager();
//create the camera object that generates view matrix
cameraVisible = new Camera();
//init game specific variables
initGameSpecifics();
//temporary hold for skybox colors
skyboxColors = new ArrayList();
}
public static void initGameSpecifics(){
}
static void initEntityTypeMap(){
CreatureTypeList typeList = Utilities.loadObjectFromJsonFile("/Data/entity_map.json", CreatureTypeList.class);
for(CreatureType type : typeList.getTypes()){
entityTypeMap.put(type.getId(), type);
}
}
}

View File

@ -12,11 +12,12 @@ import electrosphere.renderer.RenderUtils;
import electrosphere.renderer.ShaderProgram;
import electrosphere.renderer.texture.Texture;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtil;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.MovementTree;
import electrosphere.game.cell.CellManager;
import electrosphere.game.cell.DrawCellManager;
import electrosphere.game.terrain.TerrainManager;
import electrosphere.net.client.Connection;
import electrosphere.net.client.ClientNetworkMessage;
import electrosphere.net.client.ClientNetworking;
import electrosphere.net.server.Server;
import electrosphere.renderer.ModelUtils;
import electrosphere.terraingen.TerrainGen;
@ -45,6 +46,7 @@ import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -69,7 +71,6 @@ public class Main {
public static float lastFrame = 0.0f;
//View Controls
public static float view_Range = 200000.0f;
public static Camera camera_Current = new Camera();
/*
Mouse Controls
*/
@ -86,14 +87,6 @@ public class Main {
//
//Player Object Variables
//
public static boolean CAMERA_UNDER_USER_CONTROL = false;
public static boolean CAMERA_UNDER_FREE_CONTROL = false;
public static boolean PLAYER_UNDER_USER_CONTROL = true;
public static boolean CAMERA_IS_ORBIT = true;
public static float camera_Orbit_Length = 1.0f;
static int playerStartRealX = 0;
static int playerStartRealY = 0;
@ -105,8 +98,10 @@ public class Main {
public static Model model;
public static int playerId = -1;
static TerrainManager terrainManager;
static boolean running = true;
@ -120,13 +115,23 @@ public class Main {
//
//
//temporary prompt user for stuff
Scanner scan = new Scanner(System.in);
System.out.println("Run server?");
if(scan.nextInt() == 1){
Globals.mainConfig.runServer = true;
} else {
Globals.mainConfig.runServer = false;
System.out.println("Address?");
Globals.mainConfig.serverAddress = scan.next();
}
//controls
initControlHandler();
//run initialization stuff
initWorld();
//init global variables
Globals.initGlobals();
//run initialization stuff
initTerrainManager();
@ -135,13 +140,24 @@ public class Main {
RenderUtils.createOpenglContext();
}
//init global variables
Globals.initGlobals();
if(Globals.mainConfig.runRenderer){
forkConnection();
//start server networking
Thread serverThread = null;
if(Globals.mainConfig.runServer){
Globals.server = new Server(42536);
serverThread = new Thread(Globals.server);
serverThread.start();
}
//start client networking
Thread clientThread = null;
if(Globals.mainConfig.runClient){
Globals.clientConnection = new ClientNetworking(Globals.mainConfig.serverAddress,42536);
clientThread = new Thread(Globals.clientConnection);
clientThread.start();
}
//init default resources
Globals.initDefaultResources();
if(Globals.mainConfig.runRenderer){
initCellManager();
@ -151,21 +167,21 @@ public class Main {
initPlayer();
createPlayerCamera();
Entity unitCube = EntityUtil.spawnDrawableEntity(ModelUtils.createUnitCube());
EntityUtil.getEntityPosition(unitCube).set(playerStartRealX - 0.5f,10,playerStartRealY - 0.5f);
// String unitCubeModelPath = Globals.assetManager.registerModel(ModelUtils.createUnitCube());
// Entity unitCube = EntityUtils.spawnDrawableEntity(unitCubeModelPath);
// EntityUtils.getEntityPosition(unitCube).set(playerStartRealX - 0.5f,10,playerStartRealY - 0.5f);
RenderUtils.recaptureScreen();
///
/// C A M E R A C R E A T I O N
///
Camera camera_player_chase = new Camera();
Camera cam_Player_Orbit = new Camera();
Vector3f cameraRotationVector = new Vector3f();
boolean running = true;
//main loop
while (running) {
@ -178,29 +194,24 @@ public class Main {
lastFrame = currentFrame;
//poll mouse variables and update camera variables
updateMouseVariables();
float cam_Player_Orbit_Magnitude = 1f;
float cam_Player_Orbit_Offset_Height = 0f;
cam_Player_Orbit.pos_Center = new Vector3f(0, 0, 0);
cam_Player_Orbit.pos_Center.x = 0 + (float) Math.cos(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
cam_Player_Orbit.pos_Center.y = 0 + (float) Math.sin(pitch / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
cam_Player_Orbit.pos_Center.z = 0 + (float) Math.sin(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
cam_Player_Orbit.pos_Center.normalize();
// System.out.println(cam_Player_Orbit.pos_Center);
///
/// A S S E T M A N A G E R S T U F F
///
Globals.assetManager.loadAssetsInQueue();
if(CAMERA_IS_ORBIT){
camera_Current = cam_Player_Orbit;
///
/// C L I E N T N E T W O R K I N G S T U F F
///
//Why is this its own function? Just to get the networking code out of main()
if(Globals.mainConfig.runClient){
Globals.clientConnection.parseMessages();
}
///
/// I N P U T C O N T R O L S
///
@ -210,43 +221,59 @@ public class Main {
}
//Poll controls
Vector3f oldPlayerCharacterPosition = new Vector3f(EntityUtil.getEntityPosition(Globals.playerCharacter));
Vector3f oldPlayerCharacterPosition = new Vector3f();
if(Globals.playerCharacter != null){
oldPlayerCharacterPosition = new Vector3f(EntityUtils.getEntityPosition(Globals.playerCharacter));
}
Vector3f newPlayerCharacterPosition = oldPlayerCharacterPosition;
Globals.controlHandler.pollControls();
///
/// C R E A T U R E S I M U L A T I O N T R E E S
/// C L I E N T S I M U L A T I O N S T U F F
///
Iterator<Entity> moveablesIterator = Globals.entityManager.getMoveableIterator();
while(moveablesIterator.hasNext()){
Entity currentMoveable = moveablesIterator.next();
MovementTree behaviorTree = CreatureUtils.getEntityMovementTree(currentMoveable);
behaviorTree.simulate();
if(Globals.mainConfig.runClient){
//simulate creature behavior trees
for(Entity currentMoveable : Globals.entityManager.getMoveable()){
MovementTree behaviorTree = CreatureUtils.getEntityMovementTree(currentMoveable);
behaviorTree.simulate();
}
}
Vector3f newPlayerCharacterPosition = EntityUtil.getEntityPosition(Globals.playerCharacter);
///
/// C E L L M A N A G E R
/// C L I E N T C E L L M A N A G E R
///
//Cell manager do your things
Globals.cellManager.calculateDeltas(oldPlayerCharacterPosition, newPlayerCharacterPosition);
Globals.cellManager.update();
if(Globals.mainConfig.runRenderer){
if(Globals.playerCharacter != null){
newPlayerCharacterPosition = EntityUtils.getEntityPosition(Globals.playerCharacter);
}
//Cell manager do your things
Globals.drawCellManager.calculateDeltas(oldPlayerCharacterPosition, newPlayerCharacterPosition);
Globals.drawCellManager.update();
}
// camera_player_chase.pos_Center = new Vector3f(EntityUtil.getEntityPosition(player)).sub(EntityUtil.getEntityRotation(player).transform(new Vector3f(-1,1,0)));
///
/// C A M E R A S T U F F
///
Globals.cameraVisible.apply_camera(camera_player_chase);
Globals.viewMatrix = Globals.cameraVisible.get_view_matrix();
Globals.viewMatrix = new Matrix4f().setLookAt(
camera_Current.pos_Center, //eye
new Vector3f(0,0,0), //center
new Vector3f(camera_Current.pos_Center).add(new Vector3f(0,1.0f,0)) // up
).scale(1.0f, 1.5f, 1.0f);
//poll mouse variables and update camera variables
updateMouseVariables();
if(Globals.playerCharacter != null){
CameraEntityUtils.setCameraCenter(Globals.playerCamera, EntityUtils.getEntityPosition(Globals.playerCharacter));
}
float cam_Player_Orbit_Magnitude = 1f;
// cam_Player_Orbit.pos_Center = new Vector3f(0, 0, 0);
cameraRotationVector.x = 0 + (float) Math.cos(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
cameraRotationVector.y = 0 + (float) Math.sin(pitch / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
cameraRotationVector.z = 0 + (float) Math.sin(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
cameraRotationVector.normalize();
CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
// System.out.println(cam_Player_Orbit.pos_Center);
Globals.viewMatrix = CameraEntityUtils.getCameraViewMatrix(CameraEntityUtils.getCameraEye(Globals.playerCamera));
@ -259,20 +286,20 @@ public class Main {
//
// Draw all entities
// D R A W A L L E N T I T I E S
//
Iterator<Entity> entity_iterator = Globals.entityManager.getDrawableIterator();
while(entity_iterator.hasNext()){
Entity currentEntity = entity_iterator.next();
Model currentModel = EntityUtil.getEntityModel(currentEntity);
if(currentModel.currentAnimation != null){
currentModel.incrementTime(deltaTime * 500);
for(Entity currentEntity : Globals.entityManager.getDrawable()){
Model currentModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(currentEntity));
if(currentModel != null){
if(currentModel.currentAnimation != null){
currentModel.incrementTime(deltaTime * 500);
}
currentModel.modelMatrix = new Matrix4f();
currentModel.modelMatrix.translate(new Vector3f(EntityUtils.getEntityPosition(currentEntity)).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera)).sub(new Vector3f(0,1,0)));
currentModel.modelMatrix.rotate(EntityUtils.getEntityRotation(currentEntity));
currentModel.modelMatrix.scale(EntityUtils.getEntityScale(currentEntity));
currentModel.draw();
}
currentModel.modelMatrix = new Matrix4f();
currentModel.modelMatrix.translate(new Vector3f(EntityUtil.getEntityPosition(currentEntity)).sub(EntityUtil.getEntityPosition(Globals.playerCharacter)).sub(new Vector3f(0,1,0)));
currentModel.modelMatrix.rotate(EntityUtil.getEntityRotation(currentEntity));
currentModel.modelMatrix.scale(EntityUtil.getEntityScale(currentEntity));
currentModel.draw();
}
@ -287,6 +314,9 @@ public class Main {
}
//Terminate the program.
glfwTerminate();
//used to signal threads to stop
running = false;
Globals.server.close();
}
static void sleep(int i) {
@ -298,7 +328,9 @@ public class Main {
}
public static boolean isRunning(){
return running;
}
@ -333,8 +365,9 @@ public class Main {
static void initSkybox(){
Model skyboxModel = RenderUtils.createSkyboxModel(null);
Entity skyboxEntity = EntityUtil.spawnDrawableEntity(skyboxModel);
EntityUtil.getEntityScale(skyboxEntity).mul(100);
String skyboxModelPath = Globals.assetManager.registerModel(skyboxModel);
Entity skyboxEntity = EntityUtils.spawnDrawableEntity(skyboxModelPath);
EntityUtils.getEntityScale(skyboxEntity).mul(100);
Globals.skyboxColors.add(new Vector3f(100,150,200));
@ -352,12 +385,14 @@ public class Main {
static void initTerrainManager(){
float[][] elevation;
terrainManager = new TerrainManager(2000,200,100,0.25f);
if(Globals.mainConfig.loadTerrain){
terrainManager.load();
} else {
terrainManager.generate();
terrainManager.save();
Globals.terrainManager = new TerrainManager(2000,200,100,0.25f);
if(Globals.mainConfig.runServer){
if(Globals.mainConfig.loadTerrain){
Globals.terrainManager.load();
} else {
Globals.terrainManager.generate();
Globals.terrainManager.save();
}
}
@ -368,27 +403,27 @@ public class Main {
}
static void initCellManager(){
Globals.cellManager = new CellManager(terrainManager, playerStartRealX, playerStartRealY);
Globals.drawCellManager = new DrawCellManager(Globals.terrainManager, playerStartRealX, playerStartRealY);
while(Globals.cellManager.containsInvalidCell()){
Globals.cellManager.updateInvalidCell();
while(Globals.drawCellManager.containsInvalidCell()){
Globals.drawCellManager.updateInvalidCell();
}
while(Globals.cellManager.containsUndrawableCell()){
Globals.cellManager.makeCellDrawable();
while(Globals.drawCellManager.containsUndrawableCell()){
Globals.drawCellManager.makeCellDrawable();
}
}
static void initPlayer(){
int playerStartX = 0;
int playerStartY = 0;
int discreteSize = terrainManager.getWorldDiscreteSize();
int chunkSize = terrainManager.getChunkWidth();
int discreteSize = Globals.terrainManager.getWorldDiscreteSize();
int chunkSize = Globals.terrainManager.getChunkWidth();
boolean found = false;
for(int x = 0; x < discreteSize; x++){
for(int y = 0; y < discreteSize; y++){
if(terrainManager.getDiscreteValue(x, y)>0){
if(Globals.terrainManager.getDiscreteValue(x, y)>0){
playerStartX = x;
playerStartY = y;
found = true;
@ -404,42 +439,25 @@ public class Main {
playerStartRealX = playerStartX * chunkSize;
playerStartRealY = playerStartY * chunkSize;
// Globals.player = CameraEntityUtils.spawnOrbitalCameraEntity(target, 3f);
// Globals.player.putData("position", new Vector3f(playerStartRealX,terrainManager.getHeightAtPosition(playerStartRealX, playerStartRealY),playerStartRealY));
/*
Entity playerCharacter = EntityUtil.spawnDrawableEntity(ModelLoader.load_Model_From_File("Models/person1walkanim.fbx"));
EntityUtil.getEntityPosition(playerCharacter).set(playerStartRealX - 0.5f,terrainManager.getHeightAtPosition(playerStartRealX, playerStartRealY),playerStartRealY - 0.5f);
Model playerCharacterModel = EntityUtil.getEntityModel(playerCharacter);
EntityUtil.getEntityScale(playerCharacter).set(0.005f);
// playerCharacterModel.describeAllAnimations();
playerCharacterModel.playAnimation("Armature|Walk");
playerCharacterModel.incrementTime(0.1);
// EntityUtil.getEntityModel(playerCharacter).playAnimation("Armature|Idle1");
*/
Model homieModel = ModelLoader.load_Model_From_File("Models/person1walkanim.fbx");
homieModel.describeAllAnimations();
Globals.playerCharacter = CreatureUtils.spawnBasicControllableEntity(homieModel, 0.005f, 0.025f);
EntityUtil.getEntityScale(Globals.playerCharacter).set(0.005f);
EntityUtil.getEntityPosition(Globals.playerCharacter).set(playerStartRealX - 0.5f,terrainManager.getHeightAtPosition(playerStartRealX, playerStartRealY),playerStartRealY - 0.5f);
// Model homieModel = ModelLoader.load_Model_From_File("Models/person1walkanim.fbx");
// homieModel.describeAllAnimations();
// Globals.playerCharacter = CreatureUtils.spawnBasicControllableEntity(0, 0.005f, 0.025f);
// EntityUtils.getEntityScale(Globals.playerCharacter).set(0.005f);
// EntityUtils.getEntityPosition(Globals.playerCharacter).set(playerStartRealX - 0.5f,Globals.terrainManager.getHeightAtPosition(playerStartRealX, playerStartRealY),playerStartRealY - 0.5f);
// System.out.println("Player position: " + playerStartRealX + " " + playerStartRealY);
Globals.playerCamera = CameraEntityUtils.spawnOrbitalCameraEntity(Globals.playerCharacter, 3f);
// Globals.playerCamera = CameraEntityUtils.spawnEntityTrackingCameraEntity(Globals.playerCharacter, 3f);
Globals.cellManager.setCellX(Globals.cellManager.transformRealSpaceToCellSpace(playerStartRealX));
Globals.cellManager.setCellY(Globals.cellManager.transformRealSpaceToCellSpace(playerStartRealY));
Globals.drawCellManager.setCellX(Globals.drawCellManager.transformRealSpaceToCellSpace(playerStartRealX));
Globals.drawCellManager.setCellY(Globals.drawCellManager.transformRealSpaceToCellSpace(playerStartRealY));
Globals.cellManager.invalidateAllCells();
Globals.drawCellManager.invalidateAllCells();
}
public static void forkServer(){
Server.startServerThread();
}
public static void forkConnection(){
Connection.startConnection();
static void createPlayerCamera(){
Globals.playerCamera = CameraEntityUtils.spawnBasicCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,0));
}
}

View File

@ -0,0 +1,23 @@
package electrosphere.net;
import electrosphere.entity.CreatureUtils;
import electrosphere.entity.Entity;
import electrosphere.net.message.EntityMessage;
/**
*
* @author amaterasu
*/
public class NetUtils {
public static EntityMessage createSpawnEntityMessage(Entity e){
EntityMessage rVal = EntityMessage.constructCreateMessage(e.getId(), CreatureUtils.getCreatureType(e));
return rVal;
}
public static EntityMessage createSetCreatureControllerIdEntityMessage(Entity e){
System.out.println("Controller id: " + CreatureUtils.getControllerPlayerId(e));
EntityMessage rVal = EntityMessage.constructSetPropertyMessage(e.getId(), 0, CreatureUtils.getControllerPlayerId(e));
return rVal;
}
}

View File

@ -1,9 +0,0 @@
package electrosphere.net;
/**
*
* @author satellite
*/
public class Packet {
byte[] rawBytes;
}

View File

@ -0,0 +1,70 @@
package electrosphere.net.client;
import electrosphere.util.BufferUtils;
import java.nio.ByteBuffer;
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* @author amaterasu
*/
public class ClientNetworkMessage {
byte[] bytesRaw;
public ClientNetworkMessage(byte[] bytes){
bytesRaw = bytes;
}
public byte[] getRawBytes(){
return bytesRaw;
}
public static ClientNetworkMessage getMoveForwardMessage(){
return new ClientNetworkMessage("test".getBytes());
}
static final byte CATEGORY_ENTITY = 2;
static final byte ENTITY_CREATE = 0;
static final byte ENTITY_DELETE = 1;
static final byte ENTITY_MOVE = 2;
static final byte ENTITY_SET_BEHAVIOR_TREE_STATE = 3;
static ByteBuffer integerCompactor;
static {
integerCompactor = ByteBuffer.allocate(4);
}
public static ClientNetworkMessage parseClientNetworkMessageFromByteQueue(CopyOnWriteArrayList<Byte> byteQueue){
ClientNetworkMessage rVal = null;
if(byteQueue.size() > 0){
byte firstByte = byteQueue.get(0);
switch(firstByte){
case CATEGORY_ENTITY:
if(byteQueue.size() >= 18){
byte secondByte = byteQueue.get(1);
switch(secondByte){
case ENTITY_CREATE:
byteQueue.remove(0);
byteQueue.remove(0);
int id = BufferUtils.popIntFromByteQueue(byteQueue);
int type = BufferUtils.popIntFromByteQueue(byteQueue);
System.out.println("Create entity id:" + id + " type:" + type);
break;
case ENTITY_DELETE:
break;
case ENTITY_MOVE:
break;
case ENTITY_SET_BEHAVIOR_TREE_STATE:
break;
}
}
break;
}
}
return rVal;
}
}

View File

@ -0,0 +1,161 @@
package electrosphere.net.client;
import electrosphere.entity.CreatureUtils;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.message.EntityMessage;
import electrosphere.net.message.NetworkMessage;
import electrosphere.net.message.PlayerMessage;
import electrosphere.net.raw.NetworkParser;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.net.Socket;
import java.net.SocketException;
import java.security.spec.RSAKeyGenParameterSpec;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Semaphore;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.crypto.stream.CryptoInputStream;
import org.apache.commons.crypto.stream.CryptoOutputStream;
/**
*
* @author amaterasu
*/
public class ClientNetworking implements Runnable{
static int port = 42536;
Socket socket;
// CryptoInputStream inputStream;
// CryptoOutputStream outputStream;
InputStream inputStream;
OutputStream outputStream;
boolean initialized;
NetworkParser parser;
public ClientNetworking(String address, int port){
try {
this.socket = new Socket(address,port);
} catch (IOException ex) {
System.err.println("Failed to connect!");
ex.printStackTrace();
System.exit(1);
}
}
@Override
public void run(){
initialized = false;
// final SecretKeySpec key = new SecretKeySpec(("1234567890123456").getBytes(),"AES");
// final Properties properties = new Properties();
// final RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(4096, BigInteger.probablePrime(4000, new Random()));
// try {
// inputStream = new CryptoInputStream("AES/ECB/PKCS5Padding",properties,socket.getInputStream(),key,spec);
// } catch (IOException ex) {
// ex.printStackTrace();
// System.exit(1);
// }
// try {
// outputStream = new CryptoOutputStream("AES/ECB/PKCS5Padding",properties,socket.getOutputStream(),key,spec);
// } catch (IOException ex) {
// ex.printStackTrace();
// System.exit(1);
// }
try {
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
parser = new NetworkParser(inputStream,outputStream);
} catch (IOException ex) {
Logger.getLogger(ClientNetworking.class.getName()).log(Level.SEVERE, null, ex);
}
initialized = true;
while(Main.isRunning()){
//attempt poll incoming messages
parser.readMessagesIn();
//outgoing messages
parser.pushMessagesOut();
}
}
public void parseMessages(){
while(parser.hasIncomingMessaage()){
NetworkMessage message = parser.popIncomingMessage();
System.out.println("New message " + message.getType());
//do something
handleMessage(message);
}
}
void handleMessage(NetworkMessage message){
switch(message.getType()){
case ENTITY_MESSAGE:
handleEntityMessage((EntityMessage)message);
break;
case PLAYER_MESSAGE:
handlePlayerMessage((PlayerMessage)message);
break;
}
}
void handleEntityMessage(EntityMessage message){
System.out.println(message.getEntityMessageType());
switch(message.getEntityMessageType()){
case CREATE:
System.out.println("Spawn ID " + message.getEntityType());
Entity newlySpawnedEntity = CreatureUtils.spawnBasicCreature(message.getEntityType(), 0.005f, 0.025f);
EntityUtils.getEntityScale(newlySpawnedEntity).set(0.005f);
EntityUtils.getEntityPosition(newlySpawnedEntity).set(10 - 0.5f,Globals.terrainManager.getHeightAtPosition(10, 10),10 - 0.5f);
EntityUtils.setEntityID(newlySpawnedEntity, message.getId());
break;
case DESTROY:
break;
case MOVE:
//literally just adding this to scope so I can use `` Entity target; `` again
if(message.getId() != -1){
Entity target = Globals.entityManager.getEntityFromId(message.getId());
EntityUtils.getEntityPosition(target).set(message.getX(),message.getY(),message.getZ());
}
// CreatureUtils.attachEntityMessageToMovementTree(Globals.entityManager.getEntityFromId(message.getId()),message);
break;
case SET_BEHAVIOR_TREE:
break;
case SET_PROPERTY:
if(message.getPropertyType() == 0){
Entity target = Globals.entityManager.getEntityFromId(message.getId());
if(target != null){
CreatureUtils.setControllerPlayerId(target, message.getPropertyValue());
if(message.getPropertyValue() == Main.playerId){
Globals.playerCharacter = target;
}
}
}
break;
}
}
void handlePlayerMessage(PlayerMessage message){
switch(message.getPlayerMessageType()){
case SET_PLAYER_ID:
Main.playerId = message.getId();
System.out.println("Player ID is " + Main.playerId);
break;
}
}
public void queueOutgoingMessage(NetworkMessage message){
parser.addOutgoingMessage(message);
}
}

View File

@ -1,71 +0,0 @@
package electrosphere.net.client;
import electrosphere.main.Globals;
import java.io.IOException;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.crypto.stream.CryptoInputStream;
import org.apache.commons.crypto.stream.CryptoOutputStream;
/**
*
* @author amaterasu
*/
public class Connection {
enum ConnectionState {
HANDSHAKE_START,
HANDSHAKE_SUCCESS,
HANDSHAKE_FAILURE,
}
ConnectionState state;
static int port = 42536;
Socket socket;
CryptoInputStream inputStream;
CryptoOutputStream outputStream;
public Connection(String address, int port){
try {
this.socket = new Socket(address,port);
} catch (IOException ex) {
System.err.println("Failed to connect!");
ex.printStackTrace();
System.exit(1);
}
}
public void processAllPackets(){
}
public static void startConnection(){
Globals.connection = new Connection("localhost",port);
}
class ConnectionProtocol implements Runnable {
Connection connection;
public ConnectionProtocol(Connection conn){
connection = conn;
}
@Override
public void run() {
boolean running = true;
// while(running){
// if(connection.inputStream.read)
// }
}
}
}

View File

@ -1,30 +0,0 @@
package electrosphere.net.server;
import java.net.Socket;
import org.apache.commons.crypto.stream.CryptoInputStream;
import org.apache.commons.crypto.stream.CryptoOutputStream;
/**
*
* @author satellite
*/
public class Client implements Runnable {
Socket socket;
CryptoInputStream inputStream;
CryptoOutputStream outputStream;
public Client(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
System.out.println("aaaaaaaaaaaeoiu");
}
}

View File

@ -1,9 +1,12 @@
package electrosphere.net.server;
import electrosphere.main.Main;
import electrosphere.net.message.NetworkMessage;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -12,13 +15,13 @@ import java.util.logging.Logger;
*
* @author amaterasu
*/
public class Server {
public class Server implements Runnable{
static int port = 42536;
ServerSocket serverSocket;
HashMap<String,Client> clientMap;
HashMap<String,ServerConnectionHandler> clientMap;
@ -28,38 +31,46 @@ public class Server {
}
Server(int port){
public Server(int port){
this.port = port;
}
@Override
public void run() {
initServer();
try {
serverSocket = new ServerSocket();
serverSocket = new ServerSocket(port);
} catch (IOException ex) {
System.err.println("Failed to start server socket!");
ex.printStackTrace();
System.exit(1);
}
boolean running = true;
while(running){
while(Main.isRunning()){
Socket newSocket;
try {
newSocket = serverSocket.accept();
Client newClient = new Client(newSocket);
ServerConnectionHandler newClient = new ServerConnectionHandler(newSocket);
clientMap.put(newSocket.getInetAddress().getHostAddress(), newClient);
new Thread(newClient).start();
} catch (IOException ex) {
System.err.println("Socket error on client socket!");
ex.printStackTrace();
}
}
}
public void close(){
try {
serverSocket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void startServerThread(){
Thread t = new Thread(){
@Override
public void run(){
Server s = new Server(port);
public void broadcastMessage(NetworkMessage message){
for(ServerConnectionHandler client : clientMap.values()){
if(client.playerID != Main.playerId){
client.addMessagetoOutgoingQueue(message);
}
};
t.start();
}
}
}

View File

@ -0,0 +1,162 @@
package electrosphere.net.server;
import electrosphere.entity.CreatureUtils;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.NetUtils;
import electrosphere.net.message.EntityMessage;
import electrosphere.net.message.NetworkMessage;
import electrosphere.net.message.NetworkMessage.MessageType;
import electrosphere.net.message.PlayerMessage;
import electrosphere.net.raw.NetworkParser;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.net.Socket;
import java.net.SocketException;
import java.nio.ByteBuffer;
import java.security.spec.RSAKeyGenParameterSpec;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.crypto.stream.CryptoInputStream;
import org.apache.commons.crypto.stream.CryptoOutputStream;
/**
*
* @author satellite
*/
public class ServerConnectionHandler implements Runnable {
static int playerIdIncrementer = 0;
Socket socket;
// CryptoInputStream inputStream;
// CryptoOutputStream outputStream;
InputStream inputStream;
OutputStream outputStream;
boolean initialized;
NetworkParser networkParser;
int playerID;
public ServerConnectionHandler(Socket socket) {
this.socket = socket;
playerID = getPlayerID();
System.out.println("Player ID: " + playerID);
}
@Override
public void run() {
System.out.println("aaaaaaaaaaaeoiu");
initialized = false;
try {
socket.setSoTimeout(100);
} catch (SocketException ex) {
ex.printStackTrace();
}
// final SecretKeySpec key = new SecretKeySpec(("1234567890123456").getBytes(),"AES");
// final Properties properties = new Properties();
// final RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(4096, BigInteger.probablePrime(4000, new Random()));
// try {
// inputStream = new CryptoInputStream("AES/ECB/PKCS5Padding",properties,socket.getInputStream(),key,spec);
// } catch (IOException ex) {
// ex.printStackTrace();
// System.exit(1);
// }
// try {
// outputStream = new CryptoOutputStream("AES/ECB/PKCS5Padding",properties,socket.getOutputStream(),key,spec);
// } catch (IOException ex) {
// ex.printStackTrace();
// System.exit(1);
// }
try {
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
networkParser = new NetworkParser(inputStream,outputStream);
} catch (IOException ex) {
ex.printStackTrace();
System.exit(1);
}
//spawn player in world
Entity newPlayerCharacter = CreatureUtils.spawnBasicCreature(0, 0.001f, 0.025f);
EntityUtils.getEntityScale(newPlayerCharacter).set(0.005f);
EntityUtils.getEntityPosition(newPlayerCharacter).set(10 - 0.5f,Globals.terrainManager.getHeightAtPosition(10, 10),10 - 0.5f);
CreatureUtils.setControllerPlayerId(newPlayerCharacter, playerID);
if(Globals.mainConfig.runServer && Main.playerId == -1){
Globals.playerCharacter = newPlayerCharacter;
}
//tell them what player stats they are
networkParser.addOutgoingMessage(PlayerMessage.constructSetPlayerIDMessage(playerID));
//figure out what chunk they're in
//queue messages for that chunk
if(Globals.mainConfig.runServer){
} else {
for(Entity currentEntity : Globals.entityManager.getMoveable()){
networkParser.addOutgoingMessage(NetUtils.createSpawnEntityMessage(currentEntity));
if(CreatureUtils.isCreature(currentEntity)){
if(CreatureUtils.hasControllerPlayerId(currentEntity)){
System.out.println("Sending controller packets");
networkParser.addOutgoingMessage(NetUtils.createSetCreatureControllerIdEntityMessage(currentEntity));
}
}
}
}
initialized = true;
while(Main.isRunning()){
//attempt poll incoming messages
networkParser.readMessagesIn();
//ponder incoming messages
while(networkParser.hasIncomingMessaage()){
NetworkMessage message = networkParser.popIncomingMessage();
handleMessage(message);
}
//push outgoing message
networkParser.pushMessagesOut();
}
}
void handleMessage(NetworkMessage message){
switch(message.getType()){
case ENTITY_MESSAGE:
handleEntityMessage((EntityMessage)message);
break;
}
}
void handleEntityMessage(EntityMessage message){
switch(message.getEntityMessageType()){
case CREATE:
break;
case DESTROY:
break;
case MOVE:
Entity targetEntity = Globals.entityManager.getEntityFromId(message.getId());
if(targetEntity != null){
CreatureUtils.attachEntityMessageToMovementTree(targetEntity,message);
}
break;
case SET_BEHAVIOR_TREE:
break;
}
}
static int getPlayerID(){
playerIdIncrementer++;
return playerIdIncrementer;
}
public void addMessagetoOutgoingQueue(NetworkMessage message){
networkParser.addOutgoingMessage(message);
}
}

View File

@ -0,0 +1,33 @@
package electrosphere.net.server;
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* @author amaterasu
*/
public class ServerNetworkMessage {
byte[] rawBytes;
public byte[] getRawBytes(){
return rawBytes;
}
public static ServerNetworkMessage parseServerNetworkMessage(CopyOnWriteArrayList<Byte> byteQueue){
ServerNetworkMessage rVal = null;
if(byteQueue.size() > 0){
byte firstByte = byteQueue.get(0);
switch(firstByte){
case 0:
break;
case 1:
break;
case 2:
break;
}
}
return rVal;
}
}

View File

@ -8,6 +8,7 @@ import org.joml.Vector3f;
*
* @author satellite
*/
@Deprecated
public class Camera {
public Vector3f pos_Center = new Vector3f(0,0,0);
// public Vector3f pos_Front = new Vector3f(0,0,0);

View File

@ -1,5 +1,6 @@
package electrosphere.renderer;
import electrosphere.entity.CameraEntityUtils;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.renderer.light.LightBuffer;
@ -441,7 +442,7 @@ public class Mesh {
GL20.glUniformMatrix4fv(glGetUniformLocation(shader.shaderProgram, "model"), false, parent.modelMatrix.get(new float[16]));
Vector3f cam_Loc = Globals.cameraVisible.pos_Center;
Vector3f cam_Loc = CameraEntityUtils.getCameraEye(Globals.playerCamera);//Globals.cameraVisible.pos_Center;
temp[0] = cam_Loc.x;
temp[1] = cam_Loc.y;
temp[2] = cam_Loc.z;
@ -495,7 +496,7 @@ public class Mesh {
glUniformMatrix4fv(shader.shaderVertexModelLoc, false, parent.modelMatrix.get(new float[16]));
glUniformMatrix4fv(shader.shaderVertexViewLoc, false, Globals.viewMatrix.get(new float[16]));
glUniformMatrix4fv(shader.shaderVertexProjectionLoc, false, Globals.projectionMatrix.get(new float[16]));
glUniform3fv(shader.shaderVertexViewPosLoc, Globals.cameraVisible.pos_Center.get(BufferUtils.createFloatBuffer(3)));
glUniform3fv(shader.shaderVertexViewPosLoc, CameraEntityUtils.getCameraEye(Globals.playerCamera).get(BufferUtils.createFloatBuffer(3)));
//
//
@ -520,7 +521,7 @@ public class Mesh {
test_Light_Data[2] = 0.5f;
glUniform3fv(glGetUniformLocation(shader.shaderProgram, "dirLight.diffuse"), test_Light_Data);
Vector3f cam_Loc = Globals.cameraVisible.pos_Center;
Vector3f cam_Loc = CameraEntityUtils.getCameraEye(Globals.playerCamera);
test_Light_Data = new float[3];
test_Light_Data[0] = cam_Loc.x;
test_Light_Data[1] = cam_Loc.y;

View File

@ -5,6 +5,7 @@
*/
package electrosphere.renderer;
import electrosphere.entity.CameraEntityUtils;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.ArrayList;
@ -184,7 +185,7 @@ public class RenderUtils {
glUniformMatrix4fv(shader.shaderVertexModelLoc, false, parent.modelMatrix.get(new float[16]));
glUniformMatrix4fv(shader.shaderVertexViewLoc, false, new Matrix4f(Globals.viewMatrix).scale(100).get(new float[16]));
glUniformMatrix4fv(shader.shaderVertexProjectionLoc, false, Globals.projectionMatrix.get(new float[16]));
glUniform3fv(shader.shaderVertexViewPosLoc, Globals.cameraVisible.pos_Center.get(BufferUtils.createFloatBuffer(3)));
glUniform3fv(shader.shaderVertexViewPosLoc, CameraEntityUtils.getCameraEye(Globals.playerCamera).get(BufferUtils.createFloatBuffer(3)));
GL11.glDrawElements(GL_TRIANGLES, elementCount, GL_UNSIGNED_INT, 0);

View File

@ -0,0 +1,54 @@
package electrosphere.renderer.assetmanager;
import electrosphere.renderer.Model;
import electrosphere.util.ModelLoader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* @author amaterasu
*/
public class AssetManager {
ConcurrentHashMap<String,Model> modelsLoadedIntoMemory = new ConcurrentHashMap();
CopyOnWriteArrayList<String> modelsInQueue = new CopyOnWriteArrayList();
public void loadAssetsInQueue(){
for(String currentPath : modelsInQueue){
modelsInQueue.remove(currentPath);
modelsLoadedIntoMemory.put(currentPath, ModelLoader.load_Model_From_File(currentPath));
}
}
public void addModelPathToQueue(String path){
if(!modelsInQueue.contains(path) && !modelsLoadedIntoMemory.containsKey(path)){
modelsInQueue.add(path);
}
}
public Model fetchModel(String path){
Model rVal = null;
if(modelsLoadedIntoMemory.containsKey(path)){
rVal = modelsLoadedIntoMemory.get(path);
}
return rVal;
}
/**
Registers a (presumably generated in code) model with the asset manager
@returns a random string that represents the model in the asset manager
*/
public String registerModel(Model m){
String rVal;
UUID newUUID = UUID.randomUUID();
rVal = newUUID.toString();
modelsLoadedIntoMemory.put(rVal,m);
return rVal;
}
}

View File

@ -0,0 +1,30 @@
package electrosphere.util;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* @author amaterasu
*/
public class BufferUtils {
static ByteBuffer integerCompactor;
static {
integerCompactor = ByteBuffer.allocate(4);
}
public static int popIntFromByteQueue(CopyOnWriteArrayList<Byte> queue){
int rVal = -1;
integerCompactor.clear();
integerCompactor.put(queue.remove(0));
integerCompactor.put(queue.remove(0));
integerCompactor.put(queue.remove(0));
integerCompactor.put(queue.remove(0));
integerCompactor.flip();
rVal = integerCompactor.getInt();
return rVal;
}
}

View File

@ -0,0 +1,12 @@
{
"types": [
{
"id" : 0,
"modelPath" : "Models/person1walkanim.fbx"
},
{
"id" : 1,
"modelPath" : ""
}
]
}