Renderer/src/main/java/electrosphere/renderer/RenderPipelineState.java
2024-11-07 13:53:03 -05:00

202 lines
5.7 KiB
Java

package electrosphere.renderer;
import org.joml.FrustumIntersection;
import org.joml.Matrix4d;
import org.joml.Matrix4f;
import electrosphere.renderer.actor.instance.InstanceData;
/**
* Contains all the currently up to date state of how the render pipeline is configured.
* Used in lots of different places to pass information up/down the render pipeline call stack and configure variables for passes.
*/
public class RenderPipelineState {
/**
* Enum of different phases of the pipeline
*/
public static enum RenderPipelineStateEnum {
SHADOW_MAP,
MAIN_OIT,
MAIN_NON_TRANSPARENT,
NORMALS,
COMPOSITE,
}
/**
* Enum of different categories of shaders that can be selected
*/
public static enum SelectedShaderEnum {
PRIMARY,
OIT,
}
//The current phase of the render pipeline
RenderPipelineStateEnum state = RenderPipelineStateEnum.SHADOW_MAP;
//The currently selected category of shader for the current render pipeline phase
SelectedShaderEnum selectedShader = SelectedShaderEnum.PRIMARY;
//Whether to use a mesh's default shader
boolean useMeshShader = false;
//Whether to buffer standard uniforms (model matrix, view matrix, etc)
boolean bufferStandardUniforms = false;
//Whether to buffer any nonstandard uniforms that may be in the mesh uniform map
boolean bufferNonStandardUniforms = false;
//Whether to use the material attached to the mesh or not
boolean useMaterial = false;
//Whether to use the shadow map or not
boolean useShadowMap = false;
//Whether to update and use bones
boolean useBones = false;
//Whether to use the light buffer or not
boolean useLight = false;
//Whether the current rendering call is of an instanced object
boolean instanced = false;
//The instance data for rendering an instanced object
InstanceData instanceData;
//the number of instances to draw
int instanceCount = 0;
//The pointer to the current shader program bound
int currentShaderPointer;
//Should actors frustum check (should be turned off in instancing for instance)
boolean frustumCheck = true;
//JOML-provided object to perform frustum culling
FrustumIntersection frustumInt = new FrustumIntersection();
public boolean getUseMeshShader(){
return this.useMeshShader;
}
public void setUseMeshShader(boolean useMeshShader){
this.useMeshShader = useMeshShader;
}
public boolean getBufferStandardUniforms(){
return this.bufferStandardUniforms;
}
public void setBufferStandardUniforms(boolean bufferStandardUniforms){
this.bufferStandardUniforms = bufferStandardUniforms;
}
public boolean getBufferNonStandardUniforms(){
return this.bufferNonStandardUniforms;
}
public void setBufferNonStandardUniforms(boolean bufferNonStandardUniforms){
this.bufferNonStandardUniforms = bufferNonStandardUniforms;
}
public boolean getUseMaterial(){
return this.useMaterial;
}
public void setUseMaterial(boolean useMaterial){
this.useMaterial = useMaterial;
}
public boolean getUseShadowMap(){
return this.useShadowMap;
}
public void setUseShadowMap(boolean useShadowMap){
this.useShadowMap = useShadowMap;
}
public boolean getUseBones(){
return useBones;
}
public void setUseBones(boolean useBones){
this.useBones = useBones;
}
public boolean getUseLight(){
return this.useLight;
}
public void setUseLight(boolean useLight){
this.useLight = useLight;
}
public SelectedShaderEnum getSelectedShader(){
return selectedShader;
}
public void setSelectedShader(SelectedShaderEnum selectedShader){
this.selectedShader = selectedShader;
}
public boolean getInstanced(){
return this.instanced;
}
public void setInstanced(boolean instanced){
this.instanced = instanced;
}
public InstanceData getInstanceData(){
return this.instanceData;
}
public void setInstanceData(InstanceData instanceData){
this.instanceData = instanceData;
}
public void setInstanceCount(int count){
this.instanceCount = count;
}
public int getInstanceCount(){
return this.instanceCount;
}
public int getCurrentShaderPointer(){
return currentShaderPointer;
}
public void setCurrentShaderPointer(int currentShaderPointer){
this.currentShaderPointer = currentShaderPointer;
}
/**
* Updates the frustum intersection with the provided projection and view matrices
* @param projectionMatrix the projection matrix
* @param viewMatrix the view matrix
*/
public void updateFrustumIntersection(Matrix4d projectionMatrix, Matrix4f viewMatrix){
Matrix4f projectionViewMatrix = new Matrix4f();
projectionViewMatrix.set(projectionMatrix);
projectionViewMatrix.mul(viewMatrix);
this.frustumInt.set(projectionViewMatrix);
}
/**
* Gets the current render pipeline's frustum intersection object
* @return The frustum intersection object
*/
public FrustumIntersection getFrustumIntersection(){
return frustumInt;
}
/**
* Sets whether actors should frustum check or not
* @param frustumCheck if true, will frustum check, otherwise will not
*/
public void setFrustumCheck(boolean frustumCheck){
this.frustumCheck = frustumCheck;
}
/**
* Returns whether actors should frustum check or not
* @return If true, frustum check, otherwise do not
*/
public boolean shouldFrustumCheck(){
return this.frustumCheck;
}
}