Start work on collision update and virtual sim
This commit is contained in:
parent
3cf8a45c63
commit
f585af6fad
@ -1,5 +1,18 @@
|
|||||||
package electrosphere.game.collision;
|
package electrosphere.game.collision;
|
||||||
|
|
||||||
|
import com.bulletphysics.collision.broadphase.BroadphaseInterface;
|
||||||
|
import com.bulletphysics.collision.broadphase.DbvtBroadphase;
|
||||||
|
import com.bulletphysics.collision.dispatch.CollisionDispatcher;
|
||||||
|
import com.bulletphysics.collision.dispatch.CollisionObject;
|
||||||
|
import com.bulletphysics.collision.dispatch.DefaultCollisionConfiguration;
|
||||||
|
import com.bulletphysics.collision.shapes.BoxShape;
|
||||||
|
import com.bulletphysics.collision.shapes.CollisionShape;
|
||||||
|
import com.bulletphysics.dynamics.DiscreteDynamicsWorld;
|
||||||
|
import com.bulletphysics.dynamics.RigidBody;
|
||||||
|
import com.bulletphysics.dynamics.RigidBodyConstructionInfo;
|
||||||
|
import com.bulletphysics.dynamics.constraintsolver.SequentialImpulseConstraintSolver;
|
||||||
|
import com.bulletphysics.linearmath.DefaultMotionState;
|
||||||
|
import com.bulletphysics.linearmath.Transform;
|
||||||
import electrosphere.entity.Entity;
|
import electrosphere.entity.Entity;
|
||||||
import electrosphere.entity.EntityDataStrings;
|
import electrosphere.entity.EntityDataStrings;
|
||||||
import electrosphere.entity.EntityUtils;
|
import electrosphere.entity.EntityUtils;
|
||||||
@ -15,9 +28,31 @@ import org.joml.Vector3f;
|
|||||||
*/
|
*/
|
||||||
public class CollisionEngine {
|
public class CollisionEngine {
|
||||||
|
|
||||||
|
BroadphaseInterface broadphase;
|
||||||
|
DefaultCollisionConfiguration collisionConfiguration;
|
||||||
|
CollisionDispatcher dispatcher;
|
||||||
|
|
||||||
List<Entity> collisionEntities = new ArrayList();
|
List<Entity> collisionEntities = new ArrayList();
|
||||||
|
|
||||||
public CollisionEngine(){
|
public CollisionEngine(){
|
||||||
|
broadphase = new DbvtBroadphase();
|
||||||
|
collisionConfiguration = new DefaultCollisionConfiguration();
|
||||||
|
dispatcher = new CollisionDispatcher(collisionConfiguration);
|
||||||
|
SequentialImpulseConstraintSolver solver = new SequentialImpulseConstraintSolver();
|
||||||
|
DiscreteDynamicsWorld world = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
|
||||||
|
|
||||||
|
CollisionShape boxShape = new BoxShape(new javax.vecmath.Vector3f(1,1,1));
|
||||||
|
float mass = 1.0f;
|
||||||
|
DefaultMotionState fallMotionState = new DefaultMotionState(new Transform(new javax.vecmath.Matrix4f(new javax.vecmath.Quat4f(0,0,0,1),new javax.vecmath.Vector3f(0,50,0),1.0f)));
|
||||||
|
RigidBodyConstructionInfo boxShapeRigidBodyCI = new RigidBodyConstructionInfo(mass, fallMotionState, boxShape);
|
||||||
|
RigidBody boxRigidBody = new RigidBody(boxShapeRigidBodyCI);
|
||||||
|
|
||||||
|
|
||||||
|
world.addRigidBody(boxRigidBody);
|
||||||
|
|
||||||
|
//https://pybullet.org/Bullet/phpBB3/viewtopic.php?t=11507
|
||||||
|
//https://www.google.com/search?client=firefox-b-1-d&q=bullet+set+position+and+check+if+collision
|
||||||
|
//https://pybullet.org/Bullet/phpBB3/viewtopic.php?t=11399
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,12 @@
|
|||||||
|
package electrosphere.game.collision.collidable;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author satellite
|
||||||
|
*/
|
||||||
|
public class Collidable {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,9 +1,96 @@
|
|||||||
package electrosphere.game.server.world.datacell;
|
package electrosphere.game.server.world.datacell;
|
||||||
|
|
||||||
|
import electrosphere.entity.Entity;
|
||||||
|
import electrosphere.net.server.Player;
|
||||||
|
import electrosphere.game.server.character.Character;
|
||||||
|
import electrosphere.game.server.world.virtualcell.VirtualCell;
|
||||||
|
import electrosphere.main.Globals;
|
||||||
|
import electrosphere.net.parser.net.message.NetworkMessage;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* Container for entities loaded into memory. This isn't intended to be in charge
|
||||||
* @author amaterasu
|
* of simulation. It just acts as an object to relate players and entities by location.
|
||||||
|
* This SHOULD be used for networking purposes. This is the mechanism to scope
|
||||||
|
* network messages by location.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
public class DataCell {
|
public class DataCell {
|
||||||
|
|
||||||
|
List<Entity> loadedEntities;
|
||||||
|
List<Player> activePlayers;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a datacell based on a virtual cell. Should be used when a player
|
||||||
|
* first comes into range of the cell.
|
||||||
|
* @param virtualCell
|
||||||
|
*/
|
||||||
|
public DataCell(VirtualCell virtualCell, Player p){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a player to the current datacell. This should be done if a player moves
|
||||||
|
* into close enough proximity with the cell that they are concerned with
|
||||||
|
* the microlevel simulation of the cell. This should _not_ be called if
|
||||||
|
* this is the first player coming into range.
|
||||||
|
* @param p
|
||||||
|
*/
|
||||||
|
public void addPlayer(Player p){
|
||||||
|
if(!activePlayers.contains(p)){
|
||||||
|
activePlayers.add(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a player from the current datacell. Basically the player has moved
|
||||||
|
* far enough away that this cell doesn't concern them anymore.
|
||||||
|
* If the number of players for this cell is zero, we should prepare it to be
|
||||||
|
* unloaded from memory and converted back into a virtual cell.
|
||||||
|
* @param p
|
||||||
|
*/
|
||||||
|
public void removePlayer(Player p){
|
||||||
|
activePlayers.remove(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This should be used to translate a character from macrolevel simulation to
|
||||||
|
* microlevel, datacell based simulation.
|
||||||
|
* @param character
|
||||||
|
*/
|
||||||
|
public void addCharacter(Character character){
|
||||||
|
Entity newEntity = new Entity();
|
||||||
|
loadedEntities.add(newEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This should be used to translate an entity from one data cell to another.
|
||||||
|
* @param e
|
||||||
|
*/
|
||||||
|
public void addEntity(Entity e){
|
||||||
|
loadedEntities.add(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intention of this function is to entirely remove the entity from microlevel simulation.
|
||||||
|
* This should be conbined with code to convert the entity into a tracked macrolevel character.
|
||||||
|
* The previous should not be true if you're tracking something inconsequential like
|
||||||
|
* a rabbit or something. Then just delete it.
|
||||||
|
* @param e
|
||||||
|
*/
|
||||||
|
public void removeEntity(Entity e){
|
||||||
|
loadedEntities.remove(e);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Broadcast a message to all players within range of this cell.
|
||||||
|
* @param message
|
||||||
|
*/
|
||||||
|
public void broadcastNetworkMessage(NetworkMessage message){
|
||||||
|
for(Player player : activePlayers){
|
||||||
|
player.setMessage(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,16 @@
|
|||||||
|
package electrosphere.game.server.world.datacell;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author satellite
|
||||||
|
*/
|
||||||
|
public class DataCellManager {
|
||||||
|
List<DataCell> loadedDataCells = new LinkedList();
|
||||||
|
|
||||||
|
public DataCellManager() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
package electrosphere.game.server.world.virtualcell;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import electrosphere.game.server.character.Character;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container of virtual character data related to a position. The intention isn't
|
||||||
|
* to have it perform simulation itself.
|
||||||
|
*/
|
||||||
|
public class VirtualCell {
|
||||||
|
|
||||||
|
List<Character> characterList = new LinkedList();
|
||||||
|
|
||||||
|
|
||||||
|
public void addCharacter(Character c){
|
||||||
|
if(!characterList.contains(c)){
|
||||||
|
characterList.add(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeCharacter(Character c){
|
||||||
|
characterList.remove(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Character> getCharacters(){
|
||||||
|
return characterList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -162,6 +162,7 @@ public class Globals {
|
|||||||
//
|
//
|
||||||
//keeps track of all entities in game
|
//keeps track of all entities in game
|
||||||
public static EntityManager entityManager;
|
public static EntityManager entityManager;
|
||||||
|
public static EntityManager serverEntityManager;
|
||||||
|
|
||||||
//terrain manager
|
//terrain manager
|
||||||
public static boolean LOAD_TERRAIN = true;
|
public static boolean LOAD_TERRAIN = true;
|
||||||
|
|||||||
23
src/main/java/electrosphere/net/server/Player.java
Normal file
23
src/main/java/electrosphere/net/server/Player.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package electrosphere.net.server;
|
||||||
|
|
||||||
|
import electrosphere.net.parser.net.message.NetworkMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author satellite
|
||||||
|
*/
|
||||||
|
public class Player {
|
||||||
|
|
||||||
|
ServerConnectionHandler connectionHandler;
|
||||||
|
int id;
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessage(NetworkMessage message){
|
||||||
|
connectionHandler.addMessagetoOutgoingQueue(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
package electrosphere.renderer.light;
|
||||||
|
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author amaterasu
|
||||||
|
*/
|
||||||
|
public class ItsBroken_DirectionalLight {
|
||||||
|
Vector3f direction;
|
||||||
|
|
||||||
|
Vector3f ambient;
|
||||||
|
Vector3f diffuse;
|
||||||
|
Vector3f specular;
|
||||||
|
|
||||||
|
public void setDirection(Vector3f direction) {
|
||||||
|
this.direction = direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAmbient(Vector3f ambient) {
|
||||||
|
this.ambient = ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDiffuse(Vector3f diffuse) {
|
||||||
|
this.diffuse = diffuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSpecular(Vector3f specular) {
|
||||||
|
this.specular = specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getDirection() {
|
||||||
|
return direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getAmbient() {
|
||||||
|
return ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getDiffuse() {
|
||||||
|
return diffuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getSpecular() {
|
||||||
|
return specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItsBroken_DirectionalLight(Vector3f direction){
|
||||||
|
this.direction = direction;
|
||||||
|
ambient = new Vector3f(0.05f, 0.05f, 0.05f);
|
||||||
|
diffuse = new Vector3f(0.4f, 0.4f, 0.4f);
|
||||||
|
specular = new Vector3f(0.5f, 0.5f, 0.5f);
|
||||||
|
this.direction.normalize();
|
||||||
|
ambient.normalize();
|
||||||
|
diffuse.normalize();
|
||||||
|
specular.normalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItsBroken_DirectionalLight(Vector3f direction, Vector3f color){
|
||||||
|
this.direction = direction;
|
||||||
|
ambient = new Vector3f( color.x * 0.05f, color.y * 0.05f, color.z * 0.05f);
|
||||||
|
diffuse = new Vector3f( color.x * 0.4f, color.y * 0.4f, color.z * 0.4f);
|
||||||
|
specular = new Vector3f(color.x * 0.5f, color.y * 0.5f, color.z * 0.5f);
|
||||||
|
this.direction.normalize();
|
||||||
|
ambient.normalize();
|
||||||
|
diffuse.normalize();
|
||||||
|
specular.normalize();
|
||||||
|
}
|
||||||
|
}
|
||||||
23
src/main/java/electrosphere/renderer/light/LightBuffer.java
Normal file
23
src/main/java/electrosphere/renderer/light/LightBuffer.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package electrosphere.renderer.light;
|
||||||
|
|
||||||
|
import static org.lwjgl.opengl.GL15.*;
|
||||||
|
import static org.lwjgl.opengl.GL31.GL_UNIFORM_BUFFER;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author amaterasu
|
||||||
|
*/
|
||||||
|
public class LightBuffer {
|
||||||
|
int light_uniform_buffer_address;
|
||||||
|
|
||||||
|
public LightBuffer(){
|
||||||
|
light_uniform_buffer_address = glGenBuffers();
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER,light_uniform_buffer_address);
|
||||||
|
//glBufferData(GL_UNIFORM_BUFFER, <my_data>, GL_STATIC_DRAW);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
package electrosphere.renderer.light;
|
||||||
|
|
||||||
|
import electrosphere.entity.Entity;
|
||||||
|
import electrosphere.entity.EntityDataStrings;
|
||||||
|
import electrosphere.main.Globals;
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author amaterasu
|
||||||
|
*/
|
||||||
|
public class LightEntityUtils {
|
||||||
|
|
||||||
|
public static Entity createDirectionalLight(Vector3f position, Vector3f ambient, Vector3f diffuse, Vector3f specular){
|
||||||
|
Entity rVal = new Entity();
|
||||||
|
Globals.entityManager.registerEntity(rVal);
|
||||||
|
Globals.entityManager.registerLightEntity(rVal);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_TYPE, EntityDataStrings.DATA_STRING_LIGHT_TYPE_DIRECTIONAL);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_POSITION, position);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_AMBIENT, ambient);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_DIFFUSE, diffuse);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_SPECULAR, specular);
|
||||||
|
return rVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Entity createPointLight(Vector3f position, Vector3f ambient, Vector3f diffuse, Vector3f specular, float constant, float linear, float quadratic){
|
||||||
|
Entity rVal = new Entity();
|
||||||
|
Globals.entityManager.registerEntity(rVal);
|
||||||
|
Globals.entityManager.registerLightEntity(rVal);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_TYPE, EntityDataStrings.DATA_STRING_LIGHT_TYPE_POINT);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_POSITION, position);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_AMBIENT, ambient);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_DIFFUSE, diffuse);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_SPECULAR, specular);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_CONSTANT, constant);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_LINEAR, linear);
|
||||||
|
rVal.putData(EntityDataStrings.DATA_STRING_LIGHT_QUADRATIC, quadratic);
|
||||||
|
return rVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
package electrosphere.renderer.light;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author amaterasu
|
||||||
|
*/
|
||||||
|
public class LightManager {
|
||||||
|
|
||||||
|
}
|
||||||
106
src/main/java/electrosphere/renderer/light/PointLight.java
Normal file
106
src/main/java/electrosphere/renderer/light/PointLight.java
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package electrosphere.renderer.light;
|
||||||
|
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author amaterasu
|
||||||
|
*/
|
||||||
|
public class PointLight {
|
||||||
|
Vector3f position;
|
||||||
|
float constant;
|
||||||
|
float linear;
|
||||||
|
float quadratic;
|
||||||
|
Vector3f ambient;
|
||||||
|
Vector3f diffuse;
|
||||||
|
Vector3f specular;
|
||||||
|
|
||||||
|
public void setPosition(Vector3f position) {
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConstant(float constant) {
|
||||||
|
this.constant = constant;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLinear(float linear) {
|
||||||
|
this.linear = linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQuadratic(float quadratic) {
|
||||||
|
this.quadratic = quadratic;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAmbient(Vector3f ambient) {
|
||||||
|
this.ambient = ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDiffuse(Vector3f diffuse) {
|
||||||
|
this.diffuse = diffuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSpecular(Vector3f specular) {
|
||||||
|
this.specular = specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getConstant() {
|
||||||
|
return constant;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getLinear() {
|
||||||
|
return linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getQuadratic() {
|
||||||
|
return quadratic;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getAmbient() {
|
||||||
|
return ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getDiffuse() {
|
||||||
|
return diffuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getSpecular() {
|
||||||
|
return specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PointLight(Vector3f position){
|
||||||
|
this.position = position;
|
||||||
|
constant = 1.0f;
|
||||||
|
linear = 0.01f;
|
||||||
|
quadratic = 0.01f;
|
||||||
|
ambient = new Vector3f(0.05f, 0.05f, 0.05f);
|
||||||
|
diffuse = new Vector3f(0.8f, 0.8f, 0.8f);
|
||||||
|
specular = new Vector3f(1.0f, 1.0f, 1.0f);
|
||||||
|
this.position.normalize();
|
||||||
|
ambient.normalize();
|
||||||
|
diffuse.normalize();
|
||||||
|
specular.normalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PointLight(Vector3f position, Vector3f color){
|
||||||
|
this.position = position;
|
||||||
|
constant = 1.0f;
|
||||||
|
linear = 0.01f;
|
||||||
|
quadratic = 0.01f;
|
||||||
|
ambient = new Vector3f(color.x * 0.05f, color.y * 0.05f, color.z * 0.05f);
|
||||||
|
diffuse = new Vector3f(color.x * 0.8f, color.y * 0.8f, color.z * 0.8f);
|
||||||
|
specular = new Vector3f(color.x, color.y, color.z);
|
||||||
|
this.position.normalize();
|
||||||
|
ambient.normalize();
|
||||||
|
diffuse.normalize();
|
||||||
|
specular.normalize();
|
||||||
|
}
|
||||||
|
}
|
||||||
143
src/main/java/electrosphere/renderer/light/SpotLight.java
Normal file
143
src/main/java/electrosphere/renderer/light/SpotLight.java
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package electrosphere.renderer.light;
|
||||||
|
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author amaterasu
|
||||||
|
*/
|
||||||
|
public class SpotLight {
|
||||||
|
Vector3f position;
|
||||||
|
Vector3f direction;
|
||||||
|
float cutOff;
|
||||||
|
float outerCutOff;
|
||||||
|
|
||||||
|
float constant;
|
||||||
|
float linear;
|
||||||
|
float quadratic;
|
||||||
|
|
||||||
|
Vector3f ambient;
|
||||||
|
Vector3f diffuse;
|
||||||
|
Vector3f specular;
|
||||||
|
|
||||||
|
public void setPosition(Vector3f position) {
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDirection(Vector3f direction) {
|
||||||
|
this.direction = direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCutOff(float cutOff) {
|
||||||
|
this.cutOff = cutOff;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOuterCutOff(float outerCutOff) {
|
||||||
|
this.outerCutOff = outerCutOff;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConstant(float constant) {
|
||||||
|
this.constant = constant;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLinear(float linear) {
|
||||||
|
this.linear = linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQuadratic(float quadratic) {
|
||||||
|
this.quadratic = quadratic;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAmbient(Vector3f ambient) {
|
||||||
|
this.ambient = ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDiffuse(Vector3f diffuse) {
|
||||||
|
this.diffuse = diffuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSpecular(Vector3f specular) {
|
||||||
|
this.specular = specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getDirection() {
|
||||||
|
return direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getCutOff() {
|
||||||
|
return cutOff;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getOuterCutOff() {
|
||||||
|
return outerCutOff;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getConstant() {
|
||||||
|
return constant;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getLinear() {
|
||||||
|
return linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getQuadratic() {
|
||||||
|
return quadratic;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getAmbient() {
|
||||||
|
return ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getDiffuse() {
|
||||||
|
return diffuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3f getSpecular() {
|
||||||
|
return specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public SpotLight(Vector3f position, Vector3f direction){
|
||||||
|
this.position = position;
|
||||||
|
this.direction = direction;
|
||||||
|
cutOff = (float)Math.toRadians(12.5f);
|
||||||
|
outerCutOff = (float)Math.toRadians(15.0f);
|
||||||
|
constant = 1.0f;
|
||||||
|
linear = 0.01f;
|
||||||
|
quadratic = 0.01f;
|
||||||
|
ambient = new Vector3f(0.05f, 0.05f, 0.05f);
|
||||||
|
diffuse = new Vector3f(0.8f, 0.8f, 0.8f);
|
||||||
|
specular = new Vector3f(1.0f, 1.0f, 1.0f);
|
||||||
|
this.position.normalize();
|
||||||
|
this.direction.normalize();
|
||||||
|
ambient.normalize();
|
||||||
|
diffuse.normalize();
|
||||||
|
specular.normalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SpotLight(Vector3f position, Vector3f direction, Vector3f color){
|
||||||
|
this.position = position;
|
||||||
|
this.direction = direction;
|
||||||
|
constant = 1.0f;
|
||||||
|
linear = 0.01f;
|
||||||
|
quadratic = 0.01f;
|
||||||
|
ambient = new Vector3f(color.x * 0.05f, color.y * 0.05f, color.z * 0.05f);
|
||||||
|
diffuse = new Vector3f(color.x * 0.8f, color.y * 0.8f, color.z * 0.8f);
|
||||||
|
specular = new Vector3f(color.x, color.y, color.z);
|
||||||
|
this.position.normalize();
|
||||||
|
this.direction.normalize();
|
||||||
|
ambient.normalize();
|
||||||
|
diffuse.normalize();
|
||||||
|
specular.normalize();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user