reorder main content draw calls
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2025-06-04 17:53:53 -04:00
parent f9d8ad0adb
commit 0cbec44ab5
2 changed files with 54 additions and 42 deletions

View File

@ -2111,6 +2111,7 @@ Fix physics performance issues
(06/04/2025) (06/04/2025)
ServerGroundMovementTree actually moves collidable-based entities ServerGroundMovementTree actually moves collidable-based entities
Client uses non-rigid-body collidables for farther away entities (via client LOD tree) Client uses non-rigid-body collidables for farther away entities (via client LOD tree)
Reorder main content draw calls to support non-OIT transparencies better

View File

@ -95,50 +95,10 @@ public class MainContentPipeline implements RenderPipeline {
Vector3d positionVec = new Vector3d(); Vector3d positionVec = new Vector3d();
Vector3d scaleVec = new Vector3d(); Vector3d scaleVec = new Vector3d();
Vector3d cameraCenterVec = CameraEntityUtils.getCameraCenter(Globals.clientState.playerCamera); Vector3d cameraCenterVec = CameraEntityUtils.getCameraCenter(Globals.clientState.playerCamera);
for(Entity currentEntity : this.standardDrawCall){
Vector3d position = EntityUtils.getPosition(currentEntity);
if(
currentEntity.getData(EntityDataStrings.DATA_STRING_DRAW)!=null
){
//fetch actor
Actor currentActor = EntityUtils.getActor(currentEntity);
//calculate camera-modified vector3d
Vector3d cameraCenter = scaleVec.set(cameraCenterVec);
Vector3d cameraModifiedPosition = positionVec.set(position).sub(cameraCenter);
//calculate and apply model transform
modelTransformMatrix = modelTransformMatrix.identity();
modelTransformMatrix.translate(cameraModifiedPosition);
modelTransformMatrix.rotate(EntityUtils.getRotation(currentEntity));
modelTransformMatrix.scale(scaleVec.set(EntityUtils.getScale(currentEntity)));
currentActor.applySpatialData(modelTransformMatrix,position);
//draw
currentActor.draw(renderPipelineState,openGLState);
//tracking //
if(currentEntity.containsKey(EntityDataStrings.TERRAIN_IS_TERRAIN)){ //Draw terrain (guarantees partial transparencies have terrain behind them at least)
this.terrainChunks++;
}
}
}
renderPipelineState.setUseBones(false); renderPipelineState.setUseBones(false);
for(ModelAccumulatorData accumulator : this.drawTargetAccumulator.getCalls()){
Model model = Globals.assetManager.fetchModel(accumulator.getModelPath());
if(model != null){
int count = accumulator.getCount();
List<Matrix4d> transforms = accumulator.getTransforms();
List<Vector3d> positions = accumulator.getPositions();
model.setMeshMask(null);
for(int meshIndex = 0; meshIndex < model.getMeshCount(); meshIndex++){
for(int i = 0; i < count; i++){
Vector3d position = positions.get(i);
Matrix4d transform = transforms.get(i);
model.setWorldPos(position);
model.setModelMatrix(transform);
model.drawMesh(renderPipelineState, openGLState, meshIndex);
}
}
}
}
for(Entity currentEntity : this.drawTargetAccumulator.getTerrainEntities()){ for(Entity currentEntity : this.drawTargetAccumulator.getTerrainEntities()){
Vector3d position = EntityUtils.getPosition(currentEntity); Vector3d position = EntityUtils.getPosition(currentEntity);
if( if(
@ -186,6 +146,57 @@ public class MainContentPipeline implements RenderPipeline {
} }
} }
renderPipelineState.setUseBones(true); renderPipelineState.setUseBones(true);
//
//draw main models
for(Entity currentEntity : this.standardDrawCall){
Vector3d position = EntityUtils.getPosition(currentEntity);
if(
currentEntity.getData(EntityDataStrings.DATA_STRING_DRAW)!=null
){
//fetch actor
Actor currentActor = EntityUtils.getActor(currentEntity);
//calculate camera-modified vector3d
Vector3d cameraCenter = scaleVec.set(cameraCenterVec);
Vector3d cameraModifiedPosition = positionVec.set(position).sub(cameraCenter);
//calculate and apply model transform
modelTransformMatrix = modelTransformMatrix.identity();
modelTransformMatrix.translate(cameraModifiedPosition);
modelTransformMatrix.rotate(EntityUtils.getRotation(currentEntity));
modelTransformMatrix.scale(scaleVec.set(EntityUtils.getScale(currentEntity)));
currentActor.applySpatialData(modelTransformMatrix,position);
//draw
currentActor.draw(renderPipelineState,openGLState);
//tracking
if(currentEntity.containsKey(EntityDataStrings.TERRAIN_IS_TERRAIN)){
this.terrainChunks++;
}
}
}
//
//draw low-LOD non-terrain models
renderPipelineState.setUseBones(false);
for(ModelAccumulatorData accumulator : this.drawTargetAccumulator.getCalls()){
Model model = Globals.assetManager.fetchModel(accumulator.getModelPath());
if(model != null){
int count = accumulator.getCount();
List<Matrix4d> transforms = accumulator.getTransforms();
List<Vector3d> positions = accumulator.getPositions();
model.setMeshMask(null);
for(int meshIndex = 0; meshIndex < model.getMeshCount(); meshIndex++){
for(int i = 0; i < count; i++){
Vector3d position = positions.get(i);
Matrix4d transform = transforms.get(i);
model.setWorldPos(position);
model.setModelMatrix(transform);
model.drawMesh(renderPipelineState, openGLState, meshIndex);
}
}
}
}
renderPipelineState.setUseBones(true);
Globals.profiler.endCpuSample(); Globals.profiler.endCpuSample();
Globals.profiler.beginCpuSample("MainContentPipeline.render - Solids Foliage"); Globals.profiler.beginCpuSample("MainContentPipeline.render - Solids Foliage");
Globals.renderingEngine.getFoliagePipeline().render(openGLState, renderPipelineState); Globals.renderingEngine.getFoliagePipeline().render(openGLState, renderPipelineState);