intelligently place foliage
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-03-12 22:55:33 -04:00
parent 7275bd7ec1
commit 15e10ad83e
3 changed files with 61 additions and 39 deletions

View File

@ -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

View File

@ -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

View File

@ -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,23 +308,28 @@ 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
); );
Vector3d placementPos = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(testPosition, new Vector3d(0,-1,0), 2.5);
if(placementPos != null){
//create entity //create entity
Entity grassEntity = EntityCreationUtils.createClientSpatialEntity(); Entity grassEntity = EntityCreationUtils.createClientSpatialEntity();
makeEntityInstancedFoliage(grassEntity, foliageType.getModelPath(), grassCapacity); makeEntityInstancedFoliage(grassEntity, foliageType.getModelPath(), grassCapacity);
EntityUtils.getPosition(grassEntity).set(absolutePosition); EntityUtils.getPosition(grassEntity).set(placementPos);
EntityUtils.getRotation(grassEntity).set(getNewRotation()); EntityUtils.getRotation(grassEntity).set(getNewRotation());
EntityUtils.getScale(grassEntity).set(new Vector3d(2.0, 2.0, 2.0)); EntityUtils.getScale(grassEntity).set(new Vector3d(2.0, 2.0, 2.0));
//add ambient foliage behavior tree //add ambient foliage behavior tree
AmbientFoliage.attachAmbientFoliageTree(grassEntity, initialGrowthLevel, foliageType.getGrowthModel().getGrowthRate()); AmbientFoliage.attachAmbientFoliageTree(grassEntity, initialGrowthLevel, foliageType.getGrowthModel().getGrowthRate());
cell.addEntity(grassEntity); cell.addEntity(grassEntity);
} }
}
activeCells.add(cell); activeCells.add(cell);
locationCellMap.put(getFoliageCellKey(worldPos, voxelPos),cell); locationCellMap.put(getFoliageCellKey(worldPos, voxelPos),cell);
} }