summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--sv.c96
1 files changed, 56 insertions, 40 deletions
diff --git a/sv.c b/sv.c
index 7bdc051..d74d7a3 100644
--- a/sv.c
+++ b/sv.c
@@ -15,7 +15,7 @@ int height = 1080;
 GLFWwindow* window;
 GLuint vertex;
 GLuint fragment;
-GLuint shader;
+GLuint shaderProgram;
 GLuint textures[4];
 
 struct param {
@@ -32,6 +32,12 @@ struct image {
 };
 struct image *images  = NULL;
 
+struct shader {
+  char path[40];
+  UT_hash_handle hh;         /* makes this structure hashable */
+};
+struct shader *shaders  = NULL;
+
 static void error_callback(int error, const char* description) { fputs(description, stderr); }
 
 static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
@@ -72,24 +78,24 @@ GLuint compileShader(const char * source, GLenum type) {
 }
 
 GLuint linkShader(GLuint vertex, GLuint fragment) {
-  glDeleteProgram(shader);
-  shader = glCreateProgram();
-  glAttachShader(shader, vertex);
-  glAttachShader(shader, fragment);
-  glLinkProgram(shader);
+  glUseProgram(0);
+  glDeleteProgram(shaderProgram);
+  shaderProgram = glCreateProgram();
+  glAttachShader(shaderProgram, vertex);
+  glAttachShader(shaderProgram, fragment);
+  glLinkProgram(shaderProgram);
   int success;
   char infoLog[512];
-  glGetProgramiv(shader, GL_LINK_STATUS, &success);
+  glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
   if (!success) {
-      glGetProgramInfoLog(shader, 512, NULL, infoLog);
-      fputs("Shader linking failed:\n",stderr);
-      fputs(infoLog,stderr);
+    glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
+    fputs("Shader linking failed:\n",stderr);
+    fputs(infoLog,stderr);
   }
-  glDetachShader(shader, vertex); 
-  glDetachShader(shader, fragment); 
+  glDetachShader(shaderProgram, vertex); 
+  glDetachShader(shaderProgram, fragment); 
   glDeleteShader(vertex);
   glDeleteShader(fragment);
-  glUseProgram(shader);
 }
 
 void createWindow() {
@@ -106,48 +112,40 @@ void createShader(char *vert, char *frag) {
   vertex = compileShader(readShader(vert), GL_VERTEX_SHADER);
   fragment = compileShader(readShader(frag),GL_FRAGMENT_SHADER);
   linkShader(vertex,fragment);
-  unsigned int VAO;
-  glGenVertexArrays(1, &VAO);
-  glBindVertexArray(VAO);
+  glUseProgram(shaderProgram);
 };
 
 void uniform1f(char * var, float f) {
-  int v = glGetUniformLocation(shader, var);
+  int v = glGetUniformLocation(shaderProgram, var);
   glUniform1f(v, f);
 }
 
 void uniform2f(char * var, float f0, float f1) {
-  int v = glGetUniformLocation(shader, var);
+  int v = glGetUniformLocation(shaderProgram, var);
   glUniform2f(v,f0,f1);
 }
 
 void readImage(char *file, int i) {
 
-  glUseProgram(shader);
   char name[4];
   sprintf(name,"img%i",i);
-  glUniform1i(glGetUniformLocation(shader, name), i);
-  //glBindTexture(GL_TEXTURE_2D, 0);
-  //glDeleteTextures(1,&textures[i]);
-  //GLuint tex;
-  //glGenTextures(1, &tex);
-  //textures[i] = tex;
-  glActiveTexture(GL_TEXTURE0+i);
-  glBindTexture(GL_TEXTURE_2D,textures[i]);
-  //glBindTexture(GL_TEXTURE_2D,tex);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
-  //glEnable(GL_TEXTURE_2D);//Only use this if not using shaders.
+  glUniform1i(glGetUniformLocation(shaderProgram, name), i);
 
   int w,h,comp;
   stbi_set_flip_vertically_on_load(1);
   unsigned char* pixels = stbi_load(file, &w, &h, &comp, STBI_rgb_alpha);
-  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+
   char ratio[9];
   sprintf(ratio,"%sratio",name);
   uniform1f(ratio,(float) w/h);
+
+  glActiveTexture(GL_TEXTURE0+i);
+  glBindTexture(GL_TEXTURE_2D,textures[i]);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
   stbi_image_free(pixels);
 }
 
@@ -162,15 +160,18 @@ void *readStdin() {
     utstring_new(name);
     utstring_printf(name, n);
 
-    if (utstring_find(name,0,"img",3) == 0) {
+    if (utstring_find(name,0,"i",1) == 0) {
       struct image *i;
       i = (struct image*)malloc(sizeof(struct image));
-      i->id = str[3]-'0';
+      i->id = str[1]-'0';
       strncpy(i->path, strtok(NULL,"\n"),40);
       HASH_ADD_INT( images, id, i );
     }
-    else if (utstring_find(name,0,"frag",4) == 0) {
-      createShader("shader.vert",strtok(NULL,"\n"));
+    else if (utstring_find(name,0,"f",1) == 0) {
+      struct shader *s;
+      s = (struct shader*)malloc(sizeof(struct shader));
+      strncpy(s->path, strtok(NULL,"\n"),40);
+      HASH_ADD_STR( shaders, path, s );
     }
     else if (utstring_find(name,0,"q",1) == 0) {
       glfwSetWindowShouldClose(window, GL_TRUE);
@@ -190,6 +191,9 @@ int main(int argc, char **argv) {
   createWindow();
   //createShader("shader.vert","cross.frag");
   createShader("shader.vert","shader.frag");
+  unsigned int VAO;
+  glGenVertexArrays(1, &VAO);
+  glBindVertexArray(VAO);
   glGenTextures(4, textures);
   for (int i = 0; i<4; i++) { readImage(argv[i+1],i); }
   uniform2f("resolution", width,height);
@@ -201,21 +205,33 @@ int main(int argc, char **argv) {
     uniform1f("time",glfwGetTime());
     // parameters mutex??
     // see uthash/doc/userguide.txt
+
     struct param *p, *tmp0;
     HASH_ITER(hh, parameters, p, tmp0) {
-      printf("%s %.f\n",p->name,p->value);
+      //printf("%s %.f\n",p->name,p->value);
       uniform1f(p->name,p->value);
       HASH_DEL(parameters, p);
       free(p);
     }
+
     struct image *i, *tmp1;
     HASH_ITER(hh, images, i, tmp1) {
       printf("%i %s\n",i->id,i->path);
-      HASH_DEL(images, i);
       readImage(i->path,i->id);
+      HASH_DEL(images, i);
       free(i);
     }
 
+    struct shader *s, *tmp2;
+    HASH_ITER(hh, shaders, s, tmp2) {
+      //printf("%i %s\n",i->id,i->path);
+      createShader("shader.vert",s->path);
+      HASH_DEL(shaders, s);
+      free(s);
+  for (int i = 0; i<4; i++) { readImage(argv[i+1],i); }
+  uniform2f("resolution", width,height);
+    }
+
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     glfwSwapBuffers(window);
     glfwPollEvents();