Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.61 KB | None | 0 0
  1. package southgrove.droidgl;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.Reader;
  8. import java.io.StringWriter;
  9. import java.io.UnsupportedEncodingException;
  10. import java.io.Writer;
  11. import java.util.HashMap;
  12.  
  13. import android.content.Context;
  14. import android.opengl.GLES20;
  15. import android.util.Log;
  16.  
  17. public class Shaders
  18. {
  19.  
  20.     private static HashMap<String, Integer> programMap;
  21.     private static String[]                 names;
  22.     private static int[]                    programIds;
  23.  
  24.     @SuppressWarnings("unused")
  25.     private static Boolean                  initialized = initialize();
  26.  
  27.     private static Boolean initialize()
  28.     {
  29.         programMap = new HashMap<String, Integer>();
  30.         programIds = new int[0];
  31.         names = new String[0];
  32.  
  33.         return true;
  34.     }
  35.  
  36.     private static String loadSource(Context context, int resourceId)
  37.     {
  38.         InputStream inputStream = context.getResources().openRawResource(resourceId);
  39.  
  40.         if (inputStream == null)
  41.             throw new RuntimeException("Could not get resource.");
  42.  
  43.         char[] buffer = new char[1024];
  44.         Writer writer = new StringWriter();
  45.  
  46.         try
  47.         {
  48.             Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
  49.             try
  50.             {
  51.                 int n;
  52.                 while ((n = reader.read(buffer)) != -1)
  53.                     writer.write(buffer, 0, n);
  54.             } catch (IOException e)
  55.             {
  56.                 Log.e("SHADER", "IO Error", e);
  57.             }
  58.         } catch (UnsupportedEncodingException e)
  59.         {
  60.             Log.e("SHADER", "Encoding Error", e);
  61.         }
  62.  
  63.         try
  64.         {
  65.             inputStream.close();
  66.         } catch (IOException e)
  67.         {
  68.             Log.e("SHADER", "IO Error", e);
  69.         }
  70.  
  71.         // Log.v("SHADER", "Shader source:");
  72.         // Log.v("SHADER", writer.toString());
  73.         // Log.v("SHADER", "---- end of shader source ----");
  74.  
  75.         return writer.toString();
  76.     }
  77.  
  78.     private static int compileShader(int shaderType, String source)
  79.     {
  80.         int shader = GLES20.glCreateShader(shaderType);
  81.         if (shader != 0)
  82.         {
  83.             GLES20.glShaderSource(shader, source);
  84.             GLES20.glCompileShader(shader);
  85.  
  86.             int[] compileStatus = new int[1];
  87.             GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
  88.             if (compileStatus[0] == 0)
  89.             {
  90.                 Log.e("SHADER", "Shader compilation failed. " + shaderType + ':');
  91.                 Log.e("SHADER", GLES20.glGetShaderInfoLog(shader));
  92.                 GLES20.glDeleteShader(shader);
  93.                 shader = 0;
  94.             }
  95.         }
  96.         return shader;
  97.     }
  98.  
  99.     private static void checkGLError(String op)
  100.     {
  101.         int error;
  102.         if ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR)
  103.         {
  104.             Log.e("SHADER", op + ": glError " + error);
  105.             throw new RuntimeException(op + ": glError " + error);
  106.         }
  107.     }
  108.  
  109.     private static void addNameProgramPair(String name, int programId)
  110.     {
  111.         // add new texture id
  112.         String[] newNames = new String[names.length + 1];
  113.         for (int i = 0; i < names.length; i++)
  114.             newNames[i] = names[i];
  115.         newNames[names.length] = name;
  116.         names = newNames;
  117.  
  118.         // add new resource id
  119.         int[] newProgramIds = new int[programIds.length + 1];
  120.         for (int i = 0; i < programIds.length; i++)
  121.             newProgramIds[i] = programIds[i];
  122.         newProgramIds[programIds.length] = programId;
  123.         programIds = newProgramIds;
  124.  
  125.         programMap.put(name, programId);
  126.     }
  127.  
  128.     public static void createProgram(Context context, String name, int vertexShaderResourceId, int fragmentShaderResourceId)
  129.     {
  130.         String vertexShaderSource = loadSource(context, vertexShaderResourceId);
  131.         String fragmentShaderSource = loadSource(context, fragmentShaderResourceId);
  132.  
  133.         int vertexShader = compileShader(GLES20.GL_VERTEX_SHADER, vertexShaderSource);
  134.         int fragmentShader = compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderSource);
  135.  
  136.         if (vertexShader == 0 || fragmentShader == 0)
  137.             throw new RuntimeException("Could not compile shaders.");
  138.  
  139.         int program = GLES20.glCreateProgram();
  140.         if (program != 0)
  141.         {
  142.             GLES20.glAttachShader(program, vertexShader);
  143.             checkGLError("glAttachShader");
  144.  
  145.             GLES20.glAttachShader(program, fragmentShader);
  146.             checkGLError("glAttachShader");
  147.  
  148.             GLES20.glLinkProgram(program);
  149.  
  150.             int[] linkStatus = new int[1];
  151.             GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
  152.             if (linkStatus[0] != GLES20.GL_TRUE)
  153.             {
  154.                 Log.e("SHADER", "Could not link program:");
  155.                 Log.e("SHADER", GLES20.glGetProgramInfoLog(program));
  156.                 GLES20.glDeleteProgram(program);
  157.                 program = 0;
  158.             }
  159.         }
  160.  
  161.         if (program == 0)
  162.             throw new RuntimeException("Could not link shader program.");
  163.  
  164.         addNameProgramPair(name, program);
  165.  
  166.         Log.v("SHADER", "Added program \"" + name + "\" with handle " + Integer.toString(program));
  167.     }
  168.  
  169.     public static int getProgram(String name)
  170.     {
  171.         return programMap.get(name);
  172.     }
  173.  
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement