summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--shader.frag21
-rw-r--r--sv.c83
2 files changed, 65 insertions, 39 deletions
diff --git a/shader.frag b/shader.frag
index bba52a5..71a7141 100644
--- a/shader.frag
+++ b/shader.frag
@@ -1,4 +1,4 @@
-#version 330 core
+#version 440 core
 #ifdef GL_ES
 precision mediump float;
 #endif
@@ -12,21 +12,24 @@ uniform sampler2D img0;
 uniform sampler2D img1;
 uniform sampler2D img2;
 uniform sampler2D img3;
-//uniform vec2 u_tex0Resolution;
+uniform float img0ratio;
+uniform float img1ratio;
+uniform float img2ratio;
+uniform float img3ratio;
 
+out vec4 fragColor;
 float random (in float x) {
     return fract(sin(x)*43758.5453123)-0.5;
 }
 
 void main (void) {
 	vec2 st = gl_FragCoord.xy/resolution.xy;
-  vec4 i1 = texture2D(img0,st*0.8);
-  vec4 i2 = texture2D(img1,st);
-  vec4 i3 = texture2D(img2,st*1.2);
-  vec4 i4 = texture2D(img3,st);
+  vec4 i1 = texture2D(img0,st*vec2(img0ratio,1.));
+  vec4 i2 = texture2D(img1,st*vec2(img1ratio,1.));
+  vec4 i3 = texture2D(img2,st*vec2(img2ratio,1.));
+  vec4 i4 = texture2D(img3,st*vec2(img3ratio,1.));
 	i1 = mix(i1,i2,sin(time));
 	i2 = mix(i3,i4,cos(time));
-	gl_FragColor = mix(i1,i2,0.5);
-	//gl_FragColor = i2;
-  //gl_FragColor = texture2D(image1,st*sin(time*2.));
+	fragColor = mix(i1,i2,0.5);
+	//gl_FragColor = i1;
 }
diff --git a/sv.c b/sv.c
index b1e6941..7bdc051 100644
--- a/sv.c
+++ b/sv.c
@@ -16,6 +16,7 @@ GLFWwindow* window;
 GLuint vertex;
 GLuint fragment;
 GLuint shader;
+GLuint textures[4];
 
 struct param {
   char name[10];
@@ -24,6 +25,13 @@ struct param {
 };
 struct param *parameters  = NULL;
 
+struct image {
+  int id;
+  char path[40];
+  UT_hash_handle hh;         /* makes this structure hashable */
+};
+struct image *images  = 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) {
@@ -64,6 +72,7 @@ GLuint compileShader(const char * source, GLenum type) {
 }
 
 GLuint linkShader(GLuint vertex, GLuint fragment) {
+  glDeleteProgram(shader);
   shader = glCreateProgram();
   glAttachShader(shader, vertex);
   glAttachShader(shader, fragment);
@@ -102,44 +111,46 @@ void createShader(char *vert, char *frag) {
   glBindVertexArray(VAO);
 };
 
+void uniform1f(char * var, float f) {
+  int v = glGetUniformLocation(shader, var);
+  glUniform1f(v, f);
+}
+
+void uniform2f(char * var, float f0, float f1) {
+  int v = glGetUniformLocation(shader, var);
+  glUniform2f(v,f0,f1);
+}
 
 void readImage(char *file, int i) {
 
-  GLuint tex;
-  glGenTextures(1, &tex);
+  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,tex);
+  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_REPEAT);
-  //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   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);
+  //glEnable(GL_TEXTURE_2D);//Only use this if not using shaders.
 
-  char name[4];
-  sprintf(name,"img%i",i);
-  printf("%s: %s\n",name,file);
-  GLint v = glGetUniformLocation(shader, name);
-  glUniform1i(v, i);
-
-  int comp;
+  int w,h,comp;
   stbi_set_flip_vertically_on_load(1);
-  unsigned char* pixels = stbi_load(file, &width, &height, &comp, STBI_rgb_alpha);
-  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+  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);
   stbi_image_free(pixels);
 }
 
-void uniform1f(char * var, float f) {
-  int v = glGetUniformLocation(shader, var);
-  glUniform1f(v, f);
-}
-
-void uniform2f(char * var, float f0, float f1) {
-  int v = glGetUniformLocation(shader, var);
-  glUniform2f(v,f0,f1);
-}
-
 void *readStdin() {
   while (1) {
 
@@ -152,7 +163,11 @@ void *readStdin() {
     utstring_printf(name, n);
 
     if (utstring_find(name,0,"img",3) == 0) {
-      readImage(strtok(NULL,"\n"),str[3]-'0');
+      struct image *i;
+      i = (struct image*)malloc(sizeof(struct image));
+      i->id = str[3]-'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"));
@@ -173,7 +188,9 @@ void *readStdin() {
 int main(int argc, char **argv) {
 
   createWindow();
+  //createShader("shader.vert","cross.frag");
   createShader("shader.vert","shader.frag");
+  glGenTextures(4, textures);
   for (int i = 0; i<4; i++) { readImage(argv[i+1],i); }
   uniform2f("resolution", width,height);
   
@@ -184,21 +201,27 @@ int main(int argc, char **argv) {
     uniform1f("time",glfwGetTime());
     // parameters mutex??
     // see uthash/doc/userguide.txt
-    struct param *p, *tmp;
-    HASH_ITER(hh, parameters, p, tmp) {
+    struct param *p, *tmp0;
+    HASH_ITER(hh, parameters, p, tmp0) {
       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);
+      free(i);
+    }
 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     glfwSwapBuffers(window);
     glfwPollEvents();
   }
 
-  //pthread_join(tid, NULL);
-  //printf("After Thread\n");
+  pthread_cancel(tid);
   glfwDestroyWindow(window);
   glfwTerminate();