Last active
April 11, 2020 22:42
-
-
Save s-ol/bb072ce53376efbcf7de5c1c70a2ee1e to your computer and use it in GitHub Desktop.
program interpreting random parts of itself as textures for a cube
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// $ gcc -o glitch_cube glitch_cube.c -lglfw -lGL -lGLU | |
#include <GLFW/glfw3.h> | |
#include <GL/gl.h> | |
#include <GL/glu.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <math.h> | |
void cubeFaceX(float side) { | |
glNormal3f(side, 0.0f, 0.0f); | |
glTexCoord2f(0.0f, 0.0f); glVertex3f(side, -1.0f, -1.0f); | |
glTexCoord2f(1.0f, 0.0f); glVertex3f(side, 1.0f, -1.0f); | |
glTexCoord2f(1.0f, 1.0f); glVertex3f(side, 1.0f, 1.0f); | |
glTexCoord2f(0.0f, 1.0f); glVertex3f(side, -1.0f, 1.0f); | |
} | |
void cubeFaceY(float side) { | |
glNormal3f(0.0f, side, 0.0f); | |
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, side, -1.0f); | |
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, side, -1.0f); | |
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, side, 1.0f); | |
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, side, 1.0f); | |
} | |
void cubeFaceZ(float side) { | |
glNormal3f(0.0f, 0.0f, side); | |
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, side); | |
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, side); | |
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, side); | |
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, side); | |
} | |
int main(int argc, const char** argv) { | |
if (!glfwInit()) exit(1); | |
glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE); | |
glfwWindowHint(GLFW_FLOATING, GLFW_TRUE); | |
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); | |
glfwWindowHint(GLFW_RED_BITS, 8); | |
glfwWindowHint(GLFW_BLUE_BITS, 8); | |
glfwWindowHint(GLFW_GREEN_BITS, 8); | |
glfwWindowHint(GLFW_ALPHA_BITS, 0); | |
glfwWindowHint(GLFW_STENCIL_BITS, 0); | |
glfwWindowHint(GLFW_DEPTH_BITS, 16); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); | |
GLFWwindow* window = glfwCreateWindow(640, 480, "glitch_cube", NULL, NULL); | |
glfwMakeContextCurrent(window); | |
glClearDepth(1.0); | |
glEnable(GL_DEPTH_TEST); | |
glEnable(GL_TEXTURE_2D); | |
glDisable(GL_CULL_FACE); | |
glMatrixMode(GL_PROJECTION); | |
GLfloat aspect = (GLfloat) 640 / 480; | |
gluPerspective(45.0, aspect, 3.0, 1000.0); | |
glMatrixMode(GL_MODELVIEW); | |
/* load texture */ | |
GLuint texture; | |
glGenTextures(1, &texture); | |
glBindTexture(GL_TEXTURE_2D, texture); | |
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_MAG_FILTER, GL_LINEAR); | |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |
int width = 64; | |
int height = 64; | |
FILE* file = fopen(argv[0], "rb"); | |
fseek(file, 0L, SEEK_END); | |
int size = ftell(file); | |
rewind(file); | |
GLubyte* data = (GLubyte*) malloc(size); | |
fread(data, 1, size, file); | |
fclose(file); | |
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data); | |
int frameCount = 0; | |
while (!glfwWindowShouldClose(window)) { | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
glPushMatrix(); | |
glTranslatef(0.0f, 0.0f, -30.0f); | |
glRotatef(glfwGetTime() * 180.0f, 0.3f, 1.0f, 0.0f); | |
glRotatef(glfwGetTime() * 79.0f, 0.7f, 0.0f, 1.7f); | |
float scale = 6.0f - ((frameCount % 30) / 15.0f); | |
glScalef(scale, scale, scale); | |
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); | |
glBindTexture(GL_TEXTURE_2D, texture); | |
if (frameCount % 30 == 0) { | |
const GLuint formats[] = { | |
GL_LUMINANCE, | |
GL_RGBA, | |
GL_RGB, | |
}; | |
const GLuint bytes[] = { | |
GL_UNSIGNED_BYTE, | |
GL_UNSIGNED_SHORT, | |
GL_BYTE, | |
GL_UNSIGNED_BYTE_3_3_2, | |
GL_FLOAT, | |
}; | |
const GLuint filters[] = { | |
GL_NEAREST, | |
GL_NEAREST, | |
}; | |
GLuint fmt = formats[rand() % 3]; | |
GLubyte* ptr = data + (rand() % size); | |
GLuint byt = bytes[rand() % 5]; | |
GLuint fil = filters[rand() % 2]; | |
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, fmt, byt, ptr); | |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, fil); | |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, fil); | |
} | |
glColor3f(1.0, 1.0, 1.0); | |
glBegin(GL_QUADS); | |
cubeFaceX( 1.0f); | |
cubeFaceY( 1.0f); | |
cubeFaceZ( 1.0f); | |
cubeFaceX(-1.0f); | |
cubeFaceY(-1.0f); | |
cubeFaceZ(-1.0f); | |
glEnd(); | |
glPopMatrix(); | |
glfwSwapBuffers(window); | |
glfwPollEvents(); | |
frameCount++; | |
} | |
free(data); | |
glfwDestroyWindow(window); | |
glfwTerminate(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment