103 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
package electrosphere.renderer.pipelines.debug;
 | 
						|
 | 
						|
import org.joml.Matrix4d;
 | 
						|
import org.joml.Quaterniond;
 | 
						|
import org.joml.Vector3d;
 | 
						|
import org.lwjgl.opengl.GL40;
 | 
						|
 | 
						|
import electrosphere.client.entity.camera.CameraEntityUtils;
 | 
						|
import electrosphere.engine.Globals;
 | 
						|
import electrosphere.engine.assetmanager.AssetDataStrings;
 | 
						|
import electrosphere.entity.Entity;
 | 
						|
import electrosphere.entity.EntityUtils;
 | 
						|
import electrosphere.renderer.OpenGLState;
 | 
						|
import electrosphere.renderer.RenderPipelineState;
 | 
						|
import electrosphere.renderer.RenderingEngine;
 | 
						|
import electrosphere.renderer.actor.Actor;
 | 
						|
import electrosphere.renderer.model.Bone;
 | 
						|
import electrosphere.renderer.model.Model;
 | 
						|
import electrosphere.renderer.pipelines.RenderPipeline;
 | 
						|
import electrosphere.util.math.MathBones;
 | 
						|
 | 
						|
/**
 | 
						|
 * Renders the bones for a given mesh
 | 
						|
 */
 | 
						|
public class DebugBonesPipeline implements RenderPipeline {
 | 
						|
 | 
						|
    //The scale vector
 | 
						|
    static final Vector3d scale = new Vector3d(1);
 | 
						|
 | 
						|
    /**
 | 
						|
     * The entity to render bones for
 | 
						|
     */
 | 
						|
    Entity targetEntity;
 | 
						|
 | 
						|
    @Override
 | 
						|
    public void render(OpenGLState openGLState, RenderPipelineState renderPipelineState) {
 | 
						|
        Globals.profiler.beginCpuSample("DebugBonesPipeline.render");
 | 
						|
 | 
						|
        if(targetEntity != null){
 | 
						|
            //bind screen fbo
 | 
						|
            RenderingEngine.screenFramebuffer.bind(openGLState);
 | 
						|
            openGLState.glDepthTest(true);
 | 
						|
            openGLState.glDepthFunc(GL40.GL_LESS);
 | 
						|
            GL40.glDepthMask(true);
 | 
						|
            openGLState.glBlend(false);
 | 
						|
            openGLState.glViewport(Globals.userSettings.getRenderResolutionX(), Globals.userSettings.getRenderResolutionY());
 | 
						|
            
 | 
						|
            ///
 | 
						|
            ///     R E N D E R I N G      S T U F F
 | 
						|
            ///
 | 
						|
            //Sets the background color.
 | 
						|
 | 
						|
 | 
						|
            //
 | 
						|
            // Set render pipeline state
 | 
						|
            //
 | 
						|
            renderPipelineState.setUseMeshShader(false);
 | 
						|
            renderPipelineState.setBufferStandardUniforms(true);
 | 
						|
            renderPipelineState.setBufferNonStandardUniforms(false);
 | 
						|
            renderPipelineState.setUseMaterial(true);
 | 
						|
            renderPipelineState.setUseShadowMap(true);
 | 
						|
            renderPipelineState.setUseBones(true);
 | 
						|
            renderPipelineState.setUseLight(true);
 | 
						|
 | 
						|
            Matrix4d modelTransformMatrix = new Matrix4d();
 | 
						|
 | 
						|
            //
 | 
						|
            //Get target data
 | 
						|
            //
 | 
						|
            Actor targetActor = EntityUtils.getActor(targetEntity);
 | 
						|
            Model boneModel = Globals.assetManager.fetchModel(AssetDataStrings.UNITCYLINDER);
 | 
						|
            boneModel.getMaterials().get(0).setDiffuse(Globals.textureDiffuseDefault);
 | 
						|
            for(Bone bone : targetActor.getBoneValues()){
 | 
						|
                Vector3d bonePos = MathBones.getBoneWorldPosition(targetEntity, bone.boneID);
 | 
						|
                Quaterniond boneRot = MathBones.getBoneWorldRotation(targetEntity, bone.boneID);
 | 
						|
 | 
						|
                //put pos + rot into model
 | 
						|
                Vector3d cameraModifiedPosition = new Vector3d(bonePos).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
 | 
						|
                modelTransformMatrix.identity();
 | 
						|
                modelTransformMatrix.translate(cameraModifiedPosition);
 | 
						|
                modelTransformMatrix.rotate(boneRot);
 | 
						|
                modelTransformMatrix.scale(scale);
 | 
						|
                boneModel.setModelMatrix(modelTransformMatrix);
 | 
						|
 | 
						|
                //draw
 | 
						|
                boneModel.draw(renderPipelineState,openGLState);
 | 
						|
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        Globals.profiler.endCpuSample();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Sets the entity that should be drawn in this pipeline
 | 
						|
     * @param entity The entity to draw bones for
 | 
						|
     */
 | 
						|
    public void setEntity(Entity entity){
 | 
						|
        this.targetEntity = entity;
 | 
						|
    }
 | 
						|
    
 | 
						|
}
 |