intelligently place foliage
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
This commit is contained in:
parent
7275bd7ec1
commit
15e10ad83e
@ -1,3 +1,3 @@
|
|||||||
#maven.buildNumber.plugin properties file
|
#maven.buildNumber.plugin properties file
|
||||||
#Sun Mar 10 11:10:27 EDT 2024
|
#Tue Mar 12 21:28:50 EDT 2024
|
||||||
buildNumber=45
|
buildNumber=46
|
||||||
|
|||||||
@ -147,7 +147,9 @@ Overhaul mesh class
|
|||||||
(03/10/2024)
|
(03/10/2024)
|
||||||
De-dupe render calls via doing mutations in render pipeline status and dont call setting variables to values they are already set to
|
De-dupe render calls via doing mutations in render pipeline status and dont call setting variables to values they are already set to
|
||||||
|
|
||||||
|
(03/12/2024)
|
||||||
|
Foliage Manager upgrades
|
||||||
|
- Place foliage intelligently
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -160,11 +162,6 @@ Fix Frustum Culling for skybox
|
|||||||
|
|
||||||
Clean up main method/class
|
Clean up main method/class
|
||||||
|
|
||||||
Build a lod system
|
|
||||||
- Could potentially be held at actor level
|
|
||||||
- Link different models based on LOD level
|
|
||||||
- LOD trees aggressively
|
|
||||||
|
|
||||||
|
|
||||||
Fluid Dynamics System
|
Fluid Dynamics System
|
||||||
- Basic transparent voxels for fluid
|
- Basic transparent voxels for fluid
|
||||||
@ -174,6 +171,31 @@ Fluid Dynamics System
|
|||||||
- Networked fluid chunk transportation (including force vectors for generating particles on client)
|
- Networked fluid chunk transportation (including force vectors for generating particles on client)
|
||||||
- Save fluid chunks
|
- Save fluid chunks
|
||||||
|
|
||||||
|
Transvoxel Algorithm
|
||||||
|
Client Terrain Entity Management (specifically creation/teardown for client)
|
||||||
|
- Also queries for far out chunks to load far away terrain
|
||||||
|
Server Terrain Management (specifically for collision)
|
||||||
|
- Handles communicating far out LOD chunks to client as well
|
||||||
|
Terrain Interface Positional Access Interface
|
||||||
|
- Ability to get terrain at point for interactions with game world eg placing grass/water collision
|
||||||
|
Actually implement transvoxel algo
|
||||||
|
Marching Cubes Texture Overhaul
|
||||||
|
- Detect opengl max image size
|
||||||
|
- Construct texture atlas of max size
|
||||||
|
- (target 256x256 resolution initially, should give ~1000 types for 8192x8192)
|
||||||
|
- Prebake all textures into atlas
|
||||||
|
- Rewrite marching cubes shader to leverage this atlas
|
||||||
|
|
||||||
|
Build a lod system
|
||||||
|
- Could potentially be held at actor level
|
||||||
|
- Link different models based on LOD level
|
||||||
|
- LOD trees aggressively
|
||||||
|
|
||||||
|
|
||||||
|
skybox work
|
||||||
|
- make it prettier
|
||||||
|
- be able to manage its colors through a clean interface
|
||||||
|
|
||||||
Ray Traced Audio Engine
|
Ray Traced Audio Engine
|
||||||
|
|
||||||
Documentation Pass on as many files as you can stomache
|
Documentation Pass on as many files as you can stomache
|
||||||
@ -186,18 +208,11 @@ Generate Tree Entities
|
|||||||
|
|
||||||
Fix Character creation preview not working
|
Fix Character creation preview not working
|
||||||
|
|
||||||
Marching Cubes Texture Overhaul
|
Fix grass flickering (it's frustum culling being inconsistent, try commenting it out in InstancedActor and see what happens :| )
|
||||||
- Detect opengl max image size
|
|
||||||
- Construct texture atlas of max size
|
|
||||||
- (target 256x256 resolution initially, should give ~1000 types for 8192x8192)
|
|
||||||
- Prebake all textures into atlas
|
|
||||||
- Rewrite marching cubes shader to leverage this atlas
|
|
||||||
|
|
||||||
|
|
||||||
Terrain Interface Positional Access Interface
|
|
||||||
- Ability to get terrain at point for interactions with game world eg placing grass/water collision
|
|
||||||
Foliage Manager upgrades
|
Foliage Manager upgrades
|
||||||
- Place foliage intelligently
|
- Wind system (environment ubi that defines wind that is lookup'd by individual blades)
|
||||||
|
|
||||||
|
|
||||||
Server Micro/Macro transitioning (turning entity into character in macro simulation and vice-versa)
|
Server Micro/Macro transitioning (turning entity into character in macro simulation and vice-versa)
|
||||||
Macro level content tracker
|
Macro level content tracker
|
||||||
@ -222,13 +237,6 @@ Weather tracking
|
|||||||
Foliage Manager upgrades
|
Foliage Manager upgrades
|
||||||
- Add wind simulation if relevant
|
- Add wind simulation if relevant
|
||||||
|
|
||||||
Client Terrain Entity Management (specifically creation/teardown for client)
|
|
||||||
- Also queries for far out chunks to load far away terrain
|
|
||||||
Server Terrain Management (specifically for collision)
|
|
||||||
- Handles communicating far out LOD chunks to client as well
|
|
||||||
Upgrade Terrain Chunk
|
|
||||||
- Implement Transvoxel Algorithm
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Server Content Engine
|
Server Content Engine
|
||||||
|
|||||||
@ -55,7 +55,7 @@ public class ClientFoliageManager {
|
|||||||
//The maximum number of foliage cells
|
//The maximum number of foliage cells
|
||||||
static final int CELL_COUNT_MAX = 100;
|
static final int CELL_COUNT_MAX = 100;
|
||||||
//The target number of foliage to place per cell
|
//The target number of foliage to place per cell
|
||||||
static final int TARGET_FOLIAGE_PER_CELL = 50;
|
static final int TARGET_FOLIAGE_PER_CELL = 200;
|
||||||
//Stores a list of all locations that are currently invalid which map to
|
//Stores a list of all locations that are currently invalid which map to
|
||||||
//the amount of frames that must pass before they are considered valid to evaluate
|
//the amount of frames that must pass before they are considered valid to evaluate
|
||||||
Map<String,Integer> locationEvaluationCooldownMap = new ConcurrentHashMap<String,Integer>();
|
Map<String,Integer> locationEvaluationCooldownMap = new ConcurrentHashMap<String,Integer>();
|
||||||
@ -117,6 +117,15 @@ public class ClientFoliageManager {
|
|||||||
public void update(){
|
public void update(){
|
||||||
if(ready){
|
if(ready){
|
||||||
//TODO: frustum cull at cell level before individual model level
|
//TODO: frustum cull at cell level before individual model level
|
||||||
|
//to be clear, these blades are frustum culled 1-by-1 currently at the InstancedActor level
|
||||||
|
//if we frustum cull at cell level with priority updates around then, we can pack foliage into buffer in chunks
|
||||||
|
//and maintain the size of chunks and location on cpu
|
||||||
|
//then use opengl calls to buffer only occasionally
|
||||||
|
//if we're doing that we can also increase the amount and type of data (would be really nice to include position-in-chunk of foliage
|
||||||
|
//for instance for fancy shaders based on local position (think rainbow grass constantly pulsing))
|
||||||
|
//this will inherit all the difficulty of defragmenting the buffer, turning individual chunks on and off on gpu side, etc
|
||||||
|
//a way to save on sending position buffer to gpu would be to pack voxel pos into a smaller size ie use bitwise operators to store
|
||||||
|
//local coord in 1 * 4 bytes instead of 3 * 4 for a full vector
|
||||||
for(FoliageCell cell : activeCells){
|
for(FoliageCell cell : activeCells){
|
||||||
cell.draw(modelMatrixAttribute);
|
cell.draw(modelMatrixAttribute);
|
||||||
}
|
}
|
||||||
@ -299,22 +308,27 @@ public class ClientFoliageManager {
|
|||||||
String foliageTypeName = foliageTypesSupported.get(placementRandomizer.nextInt() % foliageTypesSupported.size());
|
String foliageTypeName = foliageTypesSupported.get(placementRandomizer.nextInt() % foliageTypesSupported.size());
|
||||||
FoliageType foliageType = Globals.gameConfigCurrent.getFoliageMap().getFoliage(foliageTypeName);
|
FoliageType foliageType = Globals.gameConfigCurrent.getFoliageMap().getFoliage(foliageTypeName);
|
||||||
//get position to place
|
//get position to place
|
||||||
double offsetX = placementRandomizer.nextDouble() * 0.6 + 0.2;
|
double offsetX = placementRandomizer.nextDouble() - 0.5;
|
||||||
double offsetZ = placementRandomizer.nextDouble() * 0.6 + 0.2;
|
double offsetY = 2;
|
||||||
Vector3d absolutePosition = new Vector3d(
|
double offsetZ = placementRandomizer.nextDouble() - 0.5;
|
||||||
|
// double offsetY = placeFoliage(dataToConsider, offsetX, offsetZ, 0.2, 0.5, 0.15, 0.2+0.6);
|
||||||
|
Vector3d testPosition = new Vector3d(
|
||||||
worldPos.x * ChunkData.CHUNK_SIZE + voxelPos.x + offsetX,
|
worldPos.x * ChunkData.CHUNK_SIZE + voxelPos.x + offsetX,
|
||||||
worldPos.y * ChunkData.CHUNK_SIZE + voxelPos.y + data.getWeight(voxelPos) * 0.6,
|
worldPos.y * ChunkData.CHUNK_SIZE + voxelPos.y + offsetY,
|
||||||
worldPos.z * ChunkData.CHUNK_SIZE + voxelPos.z + offsetZ
|
worldPos.z * ChunkData.CHUNK_SIZE + voxelPos.z + offsetZ
|
||||||
);
|
);
|
||||||
//create entity
|
Vector3d placementPos = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(testPosition, new Vector3d(0,-1,0), 2.5);
|
||||||
Entity grassEntity = EntityCreationUtils.createClientSpatialEntity();
|
if(placementPos != null){
|
||||||
makeEntityInstancedFoliage(grassEntity, foliageType.getModelPath(), grassCapacity);
|
//create entity
|
||||||
EntityUtils.getPosition(grassEntity).set(absolutePosition);
|
Entity grassEntity = EntityCreationUtils.createClientSpatialEntity();
|
||||||
EntityUtils.getRotation(grassEntity).set(getNewRotation());
|
makeEntityInstancedFoliage(grassEntity, foliageType.getModelPath(), grassCapacity);
|
||||||
EntityUtils.getScale(grassEntity).set(new Vector3d(2.0, 2.0, 2.0));
|
EntityUtils.getPosition(grassEntity).set(placementPos);
|
||||||
//add ambient foliage behavior tree
|
EntityUtils.getRotation(grassEntity).set(getNewRotation());
|
||||||
AmbientFoliage.attachAmbientFoliageTree(grassEntity, initialGrowthLevel, foliageType.getGrowthModel().getGrowthRate());
|
EntityUtils.getScale(grassEntity).set(new Vector3d(2.0, 2.0, 2.0));
|
||||||
cell.addEntity(grassEntity);
|
//add ambient foliage behavior tree
|
||||||
|
AmbientFoliage.attachAmbientFoliageTree(grassEntity, initialGrowthLevel, foliageType.getGrowthModel().getGrowthRate());
|
||||||
|
cell.addEntity(grassEntity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
activeCells.add(cell);
|
activeCells.add(cell);
|
||||||
locationCellMap.put(getFoliageCellKey(worldPos, voxelPos),cell);
|
locationCellMap.put(getFoliageCellKey(worldPos, voxelPos),cell);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user