chemistry engine, biome notes
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
This commit is contained in:
parent
70f7a78626
commit
634e88942b
@ -20,6 +20,7 @@
|
|||||||
- @subpage indexrendering
|
- @subpage indexrendering
|
||||||
- @subpage entitytypesindex
|
- @subpage entitytypesindex
|
||||||
- @subpage worldgenerationindex
|
- @subpage worldgenerationindex
|
||||||
|
- @subpage chemistryindex
|
||||||
|
|
||||||
|
|
||||||
# What is this section
|
# What is this section
|
||||||
|
|||||||
3
docs/src/architecture/chemistry/chemistryindex.md
Normal file
3
docs/src/architecture/chemistry/chemistryindex.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
@page chemistryindex Chemistry System
|
||||||
|
|
||||||
|
The chemistry system
|
||||||
13
docs/src/architecture/generation/biomegenerationproblems.md
Normal file
13
docs/src/architecture/generation/biomegenerationproblems.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
@page biomegenerationproblems Biome Generation Problems
|
||||||
|
|
||||||
|
Different cases to consider when working on a biome generation system
|
||||||
|
- Floating islands
|
||||||
|
- "Bowls" where the perimeter of an area has one style, and the center has another
|
||||||
|
- Blending between biomes
|
||||||
|
- Mountains
|
||||||
|
- Cliffs
|
||||||
|
- Biomes with tall structures (ie trees generated with voxels, rock spires, plateaus, etc)
|
||||||
|
- Superstructure biomes (World tree, massive mountains, etc)
|
||||||
|
- Oceans
|
||||||
|
- Lakes
|
||||||
|
- Rivers
|
||||||
@ -17,3 +17,5 @@ Once the biome is selected, a fine grain surface value is calculated
|
|||||||
|
|
||||||
All other generation proceeds based on the specific biome selected from the pool via noise
|
All other generation proceeds based on the specific biome selected from the pool via noise
|
||||||
|
|
||||||
|
This biome selection should be supercede-able in certain situations
|
||||||
|
- Rivers
|
||||||
@ -1,4 +1,5 @@
|
|||||||
@page worldgenerationindex World Generation
|
@page worldgenerationindex World Generation
|
||||||
|
|
||||||
[TOC]
|
[TOC]
|
||||||
- @subpage biomeselection
|
- @subpage biomeselection
|
||||||
|
- @subpage biomegenerationproblems
|
||||||
@ -898,6 +898,10 @@ Initial implementation of tooltips
|
|||||||
(10/23/2024)
|
(10/23/2024)
|
||||||
Tooltip improvements
|
Tooltip improvements
|
||||||
Terrain generation testing realm
|
Terrain generation testing realm
|
||||||
|
Biome data definition
|
||||||
|
Notes on biomes
|
||||||
|
OpenSimplex util class
|
||||||
|
Chemistry system collision engine instance on server and client
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -907,28 +911,28 @@ Terrain generation testing realm
|
|||||||
|
|
||||||
|
|
||||||
Implement gadgets
|
Implement gadgets
|
||||||
- Chemistry System
|
- Chemistry System
|
||||||
- Emitters
|
- Emitters
|
||||||
- Subscribers
|
- Subscribers
|
||||||
- Dedicated collision engine on server
|
- Dedicated collision engine on server
|
||||||
- Trap
|
- Trap
|
||||||
- Bear
|
- Bear
|
||||||
- Freeze
|
- Freeze
|
||||||
- Flame
|
- Flame
|
||||||
- Bomb (to be thrown)
|
- Bomb (to be thrown)
|
||||||
- Regular (Deals damage, ignites)
|
- Regular (Deals damage, ignites)
|
||||||
- Air (high push coeff)
|
- Air (high push coeff)
|
||||||
- Flash (dazes)
|
- Flash (dazes)
|
||||||
- Sleep (puts enemies to sleep)
|
- Sleep (puts enemies to sleep)
|
||||||
- Smoke (creates LOS blockers)
|
- Smoke (creates LOS blockers)
|
||||||
- Decoy (creates a decoy)
|
- Decoy (creates a decoy)
|
||||||
- Torch
|
- Torch
|
||||||
- Throwable potions
|
- Throwable potions
|
||||||
Crafting
|
Crafting
|
||||||
- Crafting Menu
|
- Crafting Menu
|
||||||
- Recipe definitions
|
- Recipe definitions
|
||||||
- Reagent items
|
- Reagent items
|
||||||
- Hover-over Tooltip for items in inventory
|
- Hover-over Tooltip for items in inventory
|
||||||
|
|
||||||
|
|
||||||
Ability to fully reload game engine state without exiting client
|
Ability to fully reload game engine state without exiting client
|
||||||
|
|||||||
@ -0,0 +1,39 @@
|
|||||||
|
package electrosphere.client.chemistry;
|
||||||
|
|
||||||
|
import org.joml.Vector3d;
|
||||||
|
import org.ode4j.ode.DContactGeom;
|
||||||
|
import org.ode4j.ode.DGeom;
|
||||||
|
|
||||||
|
import electrosphere.collision.CollisionEngine.CollisionResolutionCallback;
|
||||||
|
import electrosphere.collision.collidable.Collidable;
|
||||||
|
import electrosphere.entity.Entity;
|
||||||
|
|
||||||
|
public class ClientChemistryCollisionCallback implements CollisionResolutionCallback {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resolve(
|
||||||
|
DContactGeom contactGeom,
|
||||||
|
DGeom geom1,
|
||||||
|
DGeom geom2,
|
||||||
|
Collidable impactor,
|
||||||
|
Collidable receiver,
|
||||||
|
Vector3d normal,
|
||||||
|
Vector3d localPosition,
|
||||||
|
Vector3d worldPos,
|
||||||
|
float magnitude
|
||||||
|
) {
|
||||||
|
Entity impactorEntity = impactor.getParent();
|
||||||
|
Entity receiverEntity = receiver.getParent();
|
||||||
|
|
||||||
|
//basic error checking
|
||||||
|
if(impactorEntity == null){
|
||||||
|
throw new IllegalStateException("Impactor's entity is null");
|
||||||
|
}
|
||||||
|
if(receiverEntity == null){
|
||||||
|
throw new IllegalStateException("Receiver's entity is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -36,6 +36,11 @@ public class ClientSceneWrapper {
|
|||||||
//The engine used to back physics collision checks in client
|
//The engine used to back physics collision checks in client
|
||||||
CollisionEngine collisionEngine;
|
CollisionEngine collisionEngine;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The chemistry engine
|
||||||
|
*/
|
||||||
|
CollisionEngine chemistryEngine;
|
||||||
|
|
||||||
//The hitbox manager
|
//The hitbox manager
|
||||||
HitboxManager hitboxManager;
|
HitboxManager hitboxManager;
|
||||||
|
|
||||||
@ -43,10 +48,12 @@ public class ClientSceneWrapper {
|
|||||||
* Constructor
|
* Constructor
|
||||||
* @param scene The scene
|
* @param scene The scene
|
||||||
* @param collisionEngine The collision engine
|
* @param collisionEngine The collision engine
|
||||||
|
* @param chemistryEngine the chemsitry engine
|
||||||
*/
|
*/
|
||||||
public ClientSceneWrapper(Scene scene, CollisionEngine collisionEngine){
|
public ClientSceneWrapper(Scene scene, CollisionEngine collisionEngine, CollisionEngine chemistryEngine){
|
||||||
this.scene = scene;
|
this.scene = scene;
|
||||||
this.collisionEngine = collisionEngine;
|
this.collisionEngine = collisionEngine;
|
||||||
|
this.chemistryEngine = chemistryEngine;
|
||||||
this.hitboxManager = new HitboxManager(resolutionCallback);
|
this.hitboxManager = new HitboxManager(resolutionCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,6 +198,14 @@ public class ClientSceneWrapper {
|
|||||||
return collisionEngine;
|
return collisionEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the chemistry engine backing the wrapper
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public CollisionEngine getChemistryEngine(){
|
||||||
|
return collisionEngine;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the hitbox manager for the client
|
* Gets the hitbox manager for the client
|
||||||
* @return The hitbox manager
|
* @return The hitbox manager
|
||||||
|
|||||||
@ -57,6 +57,7 @@ public class ClientSimulation {
|
|||||||
if(Globals.RUN_PHYSICS){
|
if(Globals.RUN_PHYSICS){
|
||||||
Globals.clientSceneWrapper.getCollisionEngine().simulatePhysics((float)Globals.timekeeper.getSimFrameTime());
|
Globals.clientSceneWrapper.getCollisionEngine().simulatePhysics((float)Globals.timekeeper.getSimFrameTime());
|
||||||
Globals.clientSceneWrapper.getCollisionEngine().updateDynamicObjectTransforms();
|
Globals.clientSceneWrapper.getCollisionEngine().updateDynamicObjectTransforms();
|
||||||
|
Globals.clientSceneWrapper.getChemistryEngine().collide();
|
||||||
}
|
}
|
||||||
|
|
||||||
//update actor animations
|
//update actor animations
|
||||||
@ -107,6 +108,7 @@ public class ClientSimulation {
|
|||||||
//
|
//
|
||||||
//clear collidable impulse lists
|
//clear collidable impulse lists
|
||||||
Globals.clientSceneWrapper.getCollisionEngine().clearCollidableImpulseLists();
|
Globals.clientSceneWrapper.getCollisionEngine().clearCollidableImpulseLists();
|
||||||
|
Globals.clientSceneWrapper.getChemistryEngine().clearCollidableImpulseLists();
|
||||||
Globals.profiler.endCpuSample();
|
Globals.profiler.endCpuSample();
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@ -150,6 +150,15 @@ public class CollisionEngine {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a collision engine with a specified callback
|
||||||
|
*/
|
||||||
|
public static CollisionEngine create(CollisionResolutionCallback callback){
|
||||||
|
CollisionEngine rVal = new CollisionEngine();
|
||||||
|
rVal.setCollisionResolutionCallback(callback);
|
||||||
|
return rVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolves collisions in the engine
|
* Resolves collisions in the engine
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import electrosphere.audio.VirtualAudioSourceManager;
|
|||||||
import electrosphere.audio.collision.HitboxAudioService;
|
import electrosphere.audio.collision.HitboxAudioService;
|
||||||
import electrosphere.audio.movement.MovementAudioService;
|
import electrosphere.audio.movement.MovementAudioService;
|
||||||
import electrosphere.auth.AuthenticationManager;
|
import electrosphere.auth.AuthenticationManager;
|
||||||
|
import electrosphere.client.chemistry.ClientChemistryCollisionCallback;
|
||||||
import electrosphere.client.entity.particle.ParticleService;
|
import electrosphere.client.entity.particle.ParticleService;
|
||||||
import electrosphere.client.fluid.cells.FluidCellManager;
|
import electrosphere.client.fluid.cells.FluidCellManager;
|
||||||
import electrosphere.client.fluid.manager.ClientFluidManager;
|
import electrosphere.client.fluid.manager.ClientFluidManager;
|
||||||
@ -474,7 +475,7 @@ public class Globals {
|
|||||||
shaderOptionMap.debug();
|
shaderOptionMap.debug();
|
||||||
//client scene wrapper
|
//client scene wrapper
|
||||||
clientScene = new Scene();
|
clientScene = new Scene();
|
||||||
clientSceneWrapper = new ClientSceneWrapper(clientScene, new CollisionEngine());
|
clientSceneWrapper = new ClientSceneWrapper(clientScene, new CollisionEngine(), CollisionEngine.create(new ClientChemistryCollisionCallback()));
|
||||||
//temporary hold for skybox colors
|
//temporary hold for skybox colors
|
||||||
skyboxColors = new ArrayList<Vector3f>();
|
skyboxColors = new ArrayList<Vector3f>();
|
||||||
//load asset manager
|
//load asset manager
|
||||||
@ -674,7 +675,7 @@ public class Globals {
|
|||||||
Globals.clientPlayer = null;
|
Globals.clientPlayer = null;
|
||||||
Globals.playerManager = new PlayerManager();
|
Globals.playerManager = new PlayerManager();
|
||||||
Globals.clientScene = new Scene();
|
Globals.clientScene = new Scene();
|
||||||
Globals.clientSceneWrapper = new ClientSceneWrapper(Globals.clientScene, new CollisionEngine());
|
Globals.clientSceneWrapper = new ClientSceneWrapper(Globals.clientScene, new CollisionEngine(), CollisionEngine.create(new ClientChemistryCollisionCallback()));
|
||||||
Globals.clientSynchronizationManager = new ClientSynchronizationManager();
|
Globals.clientSynchronizationManager = new ClientSynchronizationManager();
|
||||||
Globals.server = null;
|
Globals.server = null;
|
||||||
Globals.serverSynchronizationManager = new ServerSynchronizationManager();
|
Globals.serverSynchronizationManager = new ServerSynchronizationManager();
|
||||||
|
|||||||
@ -0,0 +1,42 @@
|
|||||||
|
package electrosphere.server.chemistry;
|
||||||
|
|
||||||
|
import org.joml.Vector3d;
|
||||||
|
import org.ode4j.ode.DContactGeom;
|
||||||
|
import org.ode4j.ode.DGeom;
|
||||||
|
|
||||||
|
import electrosphere.collision.CollisionEngine.CollisionResolutionCallback;
|
||||||
|
import electrosphere.collision.collidable.Collidable;
|
||||||
|
import electrosphere.entity.Entity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The collision callback for the chemistry system
|
||||||
|
*/
|
||||||
|
public class ServerChemistryCollisionCallback implements CollisionResolutionCallback {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resolve(
|
||||||
|
DContactGeom contactGeom,
|
||||||
|
DGeom geom1,
|
||||||
|
DGeom geom2,
|
||||||
|
Collidable impactor,
|
||||||
|
Collidable receiver,
|
||||||
|
Vector3d normal,
|
||||||
|
Vector3d localPosition,
|
||||||
|
Vector3d worldPos,
|
||||||
|
float magnitude
|
||||||
|
) {
|
||||||
|
Entity impactorEntity = impactor.getParent();
|
||||||
|
Entity receiverEntity = receiver.getParent();
|
||||||
|
|
||||||
|
//basic error checking
|
||||||
|
if(impactorEntity == null){
|
||||||
|
throw new IllegalStateException("Impactor's entity is null");
|
||||||
|
}
|
||||||
|
if(receiverEntity == null){
|
||||||
|
throw new IllegalStateException("Receiver's entity is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -44,6 +44,11 @@ public class Realm {
|
|||||||
//Main entity physics collision checking engine
|
//Main entity physics collision checking engine
|
||||||
CollisionEngine collisionEngine;
|
CollisionEngine collisionEngine;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The chemistry collision engine
|
||||||
|
*/
|
||||||
|
CollisionEngine chemistryEngine;
|
||||||
|
|
||||||
//Hitbox manager for the realm
|
//Hitbox manager for the realm
|
||||||
HitboxManager hitboxManager;
|
HitboxManager hitboxManager;
|
||||||
|
|
||||||
@ -69,17 +74,22 @@ public class Realm {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Realm constructor
|
* Realm constructor
|
||||||
|
* @param serverWorldData The world data for the realm
|
||||||
* @param collisionEngine The collision engine for the realm
|
* @param collisionEngine The collision engine for the realm
|
||||||
|
* @param chemistryEngine The chemistry system collision engine for the realm
|
||||||
* @param hitboxManager The hitbox manager for the realm
|
* @param hitboxManager The hitbox manager for the realm
|
||||||
|
* @param serverContentManager The content manager for the realm
|
||||||
*/
|
*/
|
||||||
protected Realm(
|
protected Realm(
|
||||||
ServerWorldData serverWorldData,
|
ServerWorldData serverWorldData,
|
||||||
CollisionEngine collisionEngine,
|
CollisionEngine collisionEngine,
|
||||||
|
CollisionEngine chemistryEngine,
|
||||||
HitboxManager hitboxManager,
|
HitboxManager hitboxManager,
|
||||||
ServerContentManager serverContentManager
|
ServerContentManager serverContentManager
|
||||||
){
|
){
|
||||||
this.serverWorldData = serverWorldData;
|
this.serverWorldData = serverWorldData;
|
||||||
this.collisionEngine = collisionEngine;
|
this.collisionEngine = collisionEngine;
|
||||||
|
this.chemistryEngine = chemistryEngine;
|
||||||
this.hitboxManager = hitboxManager;
|
this.hitboxManager = hitboxManager;
|
||||||
this.serverContentManager = serverContentManager;
|
this.serverContentManager = serverContentManager;
|
||||||
}
|
}
|
||||||
@ -198,6 +208,7 @@ public class Realm {
|
|||||||
if(Globals.RUN_PHYSICS){
|
if(Globals.RUN_PHYSICS){
|
||||||
collisionEngine.simulatePhysics((float)Globals.timekeeper.getSimFrameTime());
|
collisionEngine.simulatePhysics((float)Globals.timekeeper.getSimFrameTime());
|
||||||
collisionEngine.updateDynamicObjectTransforms();
|
collisionEngine.updateDynamicObjectTransforms();
|
||||||
|
chemistryEngine.collide();
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
//hitbox sim
|
//hitbox sim
|
||||||
@ -213,6 +224,7 @@ public class Realm {
|
|||||||
//
|
//
|
||||||
//clear collidable impulse lists
|
//clear collidable impulse lists
|
||||||
collisionEngine.clearCollidableImpulseLists();
|
collisionEngine.clearCollidableImpulseLists();
|
||||||
|
chemistryEngine.clearCollidableImpulseLists();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import electrosphere.collision.hitbox.HitboxManager;
|
|||||||
import electrosphere.entity.Entity;
|
import electrosphere.entity.Entity;
|
||||||
import electrosphere.game.server.world.ServerWorldData;
|
import electrosphere.game.server.world.ServerWorldData;
|
||||||
import electrosphere.net.server.player.Player;
|
import electrosphere.net.server.player.Player;
|
||||||
|
import electrosphere.server.chemistry.ServerChemistryCollisionCallback;
|
||||||
import electrosphere.server.collision.ServerHitboxResolutionCallback;
|
import electrosphere.server.collision.ServerHitboxResolutionCallback;
|
||||||
import electrosphere.server.content.ServerContentManager;
|
import electrosphere.server.content.ServerContentManager;
|
||||||
|
|
||||||
@ -41,7 +42,16 @@ public class RealmManager {
|
|||||||
* @return The realm
|
* @return The realm
|
||||||
*/
|
*/
|
||||||
public Realm createRealm(){
|
public Realm createRealm(){
|
||||||
return new Realm(new ServerWorldData(), new CollisionEngine(), new HitboxManager(new ServerHitboxResolutionCallback()), ServerContentManager.createServerContentManager(false));
|
//create chemistry engine
|
||||||
|
CollisionEngine chemistryEngine = new CollisionEngine();
|
||||||
|
chemistryEngine.setCollisionResolutionCallback(new ServerChemistryCollisionCallback());
|
||||||
|
return new Realm(
|
||||||
|
new ServerWorldData(),
|
||||||
|
new CollisionEngine(),
|
||||||
|
chemistryEngine,
|
||||||
|
new HitboxManager(new ServerHitboxResolutionCallback()),
|
||||||
|
ServerContentManager.createServerContentManager(false)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,8 +62,18 @@ public class RealmManager {
|
|||||||
//create collision engine
|
//create collision engine
|
||||||
CollisionEngine collisionEngine = new CollisionEngine();
|
CollisionEngine collisionEngine = new CollisionEngine();
|
||||||
collisionEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
|
collisionEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
|
||||||
|
//create chemistry engine
|
||||||
|
CollisionEngine chemistryEngine = new CollisionEngine();
|
||||||
|
chemistryEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
|
||||||
|
chemistryEngine.setCollisionResolutionCallback(new ServerChemistryCollisionCallback());
|
||||||
//create realm
|
//create realm
|
||||||
Realm realm = new Realm(serverWorldData, collisionEngine, new HitboxManager(new ServerHitboxResolutionCallback()), serverContentManager);
|
Realm realm = new Realm(
|
||||||
|
serverWorldData,
|
||||||
|
collisionEngine,
|
||||||
|
chemistryEngine,
|
||||||
|
new HitboxManager(new ServerHitboxResolutionCallback()),
|
||||||
|
serverContentManager
|
||||||
|
);
|
||||||
//create function classes
|
//create function classes
|
||||||
GriddedDataCellManager griddedDataCellManager = new GriddedDataCellManager(realm);
|
GriddedDataCellManager griddedDataCellManager = new GriddedDataCellManager(realm);
|
||||||
EntityDataCellMapper entityDataCellMapper = new EntityDataCellMapper();
|
EntityDataCellMapper entityDataCellMapper = new EntityDataCellMapper();
|
||||||
@ -77,8 +97,19 @@ public class RealmManager {
|
|||||||
CollisionEngine collisionEngine = new CollisionEngine();
|
CollisionEngine collisionEngine = new CollisionEngine();
|
||||||
collisionEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
|
collisionEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
|
||||||
|
|
||||||
|
//create chemistry engine
|
||||||
|
CollisionEngine chemistryEngine = new CollisionEngine();
|
||||||
|
chemistryEngine.setCollisionWorldData(new CollisionWorldData(serverWorldData));
|
||||||
|
chemistryEngine.setCollisionResolutionCallback(new ServerChemistryCollisionCallback());
|
||||||
|
|
||||||
//create realm
|
//create realm
|
||||||
Realm realm = new Realm(serverWorldData, collisionEngine, new HitboxManager(new ServerHitboxResolutionCallback()), ServerContentManager.createServerContentManager(false));
|
Realm realm = new Realm(
|
||||||
|
serverWorldData,
|
||||||
|
collisionEngine,
|
||||||
|
chemistryEngine,
|
||||||
|
new HitboxManager(new ServerHitboxResolutionCallback()),
|
||||||
|
ServerContentManager.createServerContentManager(false)
|
||||||
|
);
|
||||||
|
|
||||||
//add function classes to realm
|
//add function classes to realm
|
||||||
realm.setDataCellManager(ViewportDataCellManager.create(realm));
|
realm.setDataCellManager(ViewportDataCellManager.create(realm));
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user