Advertisement
baryonSasuke

Java shader setup

Jan 7th, 2021
579
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.59 KB | None | 0 0
  1. package Kurama.renderingEngine.ginchan;
  2.  
  3. import Kurama.GUI.Component;
  4. import Kurama.GUI.Rectangle;
  5. import Kurama.Math.Matrix;
  6. import Kurama.Math.Vector;
  7. import Kurama.renderingEngine.*;
  8. import Kurama.shader.ShaderProgram;
  9. import Kurama.utils.Utils;
  10. import org.lwjgl.system.MemoryUtil;
  11.  
  12. import java.nio.FloatBuffer;
  13.  
  14. import static org.lwjgl.opengl.GL13.GL_TEXTURE0;
  15. import static org.lwjgl.opengl.GL13.glActiveTexture;
  16. import static org.lwjgl.opengl.GL15C.*;
  17. import static org.lwjgl.opengl.GL30C.glBindBufferBase;
  18. import static org.lwjgl.opengl.GL31C.GL_UNIFORM_BUFFER;
  19. import static org.lwjgl.opengl.NVMeshShader.glDrawMeshTasksNV;
  20.  
  21. public class RectangleShaderBlock extends RenderBlock {
  22.  
  23.     private ShaderProgram shader;
  24.     int rectangleUniformBuffer;
  25.  
  26.     public static final int FLOAT_SIZE_BYTES = 4;
  27.     public static final int VECTOR4F_SIZE_BYTES = 4 * FLOAT_SIZE_BYTES;
  28.     public static final int MATRIX_SIZE_BYTES = 4 * VECTOR4F_SIZE_BYTES;
  29.  
  30.     public RectangleShaderBlock(String id, RenderPipeline pipeline) {
  31.         super(id, pipeline);
  32.     }
  33.  
  34.     @Override
  35.     public void setup(RenderBlockInput input) {
  36.         shader = new ShaderProgram(Utils.getUniqueID());
  37.  
  38.         try {
  39.             shader.createMeshShader("src/main/java/Kurama/renderingEngine/ginchan/shaders/RectangleMeshShader.glsl");
  40.             shader.createFragmentShader("src/main/java/Kurama/renderingEngine/ginchan/shaders/RectangleFragmentShader.glsl");
  41.             shader.link();
  42.  
  43.             rectangleUniformBuffer = glGenBuffers();
  44.             glBindBuffer(GL_UNIFORM_BUFFER, rectangleUniformBuffer);
  45.  
  46.             var jointsDataInstancedBuffer = MemoryUtil.memAllocFloat(27);
  47.             glBufferData(GL_UNIFORM_BUFFER, jointsDataInstancedBuffer, GL_DYNAMIC_DRAW);
  48.             glBindBufferBase(GL_UNIFORM_BUFFER, 0, rectangleUniformBuffer);
  49.  
  50.             glBindBuffer(GL_UNIFORM_BUFFER, 0);
  51.             MemoryUtil.memFree(jointsDataInstancedBuffer);
  52.  
  53.             shader.createUniform("texture_sampler");
  54.             shader.setUniform("texture_sampler", 0);
  55.         }
  56.         catch (Exception e) {
  57.             e.printStackTrace();
  58.             System.exit(1);
  59.         }
  60.  
  61.     }
  62.  
  63.     public void setupRectangleUniform(Matrix projectionViewMatrix, Vector radius, int width, int height, boolean hasTexture,
  64.                                       Vector color) {
  65.  
  66.         FloatBuffer temp = MemoryUtil.memAllocFloat(27);
  67.         projectionViewMatrix.setValuesToBuffer(temp);
  68.  
  69.         if(radius != null) {
  70.             radius.setValuesToBuffer(temp);
  71.         }
  72.         else {
  73.             temp.put(new float[]{0,0,0,0});
  74.         }
  75.  
  76.         if (color != null) {
  77.             color.setValuesToBuffer(temp);
  78.         }
  79.         else {
  80.             temp.put(new float[]{0,0,0,0});
  81.         }
  82.         temp.put(width);
  83.         temp.put(height);
  84.         temp.put(hasTexture?1f:0f);
  85.         temp.flip();
  86.         glBufferSubData(GL_UNIFORM_BUFFER, 0, temp);
  87.         MemoryUtil.memFree(temp);
  88.     }
  89.  
  90.     @Override
  91.     public RenderBlockOutput render(RenderBlockInput input) {
  92.  
  93.         GUIComponentRenderInput inp = (GUIComponentRenderInput) input;
  94.         var masterComponent = inp.component;
  95.         Matrix ortho = Matrix.buildOrtho2D(0, input.game.getDisplay().windowResolution.get(0),
  96.                 input.game.getDisplay().windowResolution.get(1), 0);
  97.  
  98.         shader.bind();
  99.         glBindBuffer(GL_UNIFORM_BUFFER, rectangleUniformBuffer);
  100.  
  101.         recursiveRender(masterComponent, ortho);
  102.  
  103.         glBindBuffer(GL_UNIFORM_BUFFER, 0);
  104.         shader.unbind();
  105.         return null;
  106.     }
  107.  
  108.     // This only render rectangle components
  109.     public void recursiveRender(Component masterComponent, Matrix ortho) {
  110.  
  111.         if(!masterComponent.shouldRenderGroup) {
  112.             return;
  113.         }
  114.  
  115.         if(masterComponent.isContainerVisible && masterComponent instanceof Rectangle) {
  116.  
  117.             var mat = ortho.matMul(masterComponent.getObjectToWorldMatrix());
  118.             if (masterComponent.texture != null) {
  119.                 glActiveTexture(GL_TEXTURE0);
  120.                 glBindTexture(GL_TEXTURE_2D, masterComponent.texture.getId());
  121.             }
  122.             setupRectangleUniform(mat, ((Rectangle)masterComponent).radii, masterComponent.width, masterComponent.height,
  123.                     masterComponent.texture == null ? false : true, masterComponent.color);
  124.  
  125.             glDrawMeshTasksNV(0, 1);
  126.  
  127.         }
  128.  
  129.         for(var child: masterComponent.children) {
  130.             recursiveRender(child, ortho);
  131.         }
  132.  
  133.     }
  134.  
  135.     @Override
  136.     public void cleanUp() {
  137.         shader.cleanUp();
  138.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement