/* * This file is automaticaly generated, Please dont edit this file! */ #include static int DoubleBufferAttributes[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DEPTH_SIZE, 12, GLX_DOUBLEBUFFER, None, }; void opengl_initialize( opengl * this ) { opengl_setupWindow( this ); opengl_showVersion( this ); opengl_createShaders( this ); opengl_createQuad( this ); opengl_setupTime( this ); opengl_setupRenderLoop( this ); } void opengl_showVersion( opengl * this ) { printf("opengl version : %s\n\n", glGetString(GL_VERSION) ); } void opengl_setupTime( opengl * this ) { clock_gettime( CLOCK_REALTIME, &this->startTime ); } void opengl_setupWindow( opengl * this ) { this->mainDisplay = XOpenDisplay( 0 ); this->MainScreen = XDefaultScreen( this->mainDisplay ); this->RootWindow = XDefaultRootWindow( this->mainDisplay ); int empty; int ResultStatus = glXQueryExtension( this->mainDisplay, &empty, &empty ); XVisualInfo* VisualInfo = glXChooseVisual( this->mainDisplay, this->MainScreen, DoubleBufferAttributes ); GLXContext ShareList = None; int IsDirectRendering = True; GLXContext OpenGLContext = glXCreateContext( this->mainDisplay, VisualInfo, ShareList, IsDirectRendering ); int WindowX = 0; int WindowY = 0; int WindowWidth = 800; int WindowHeight = 600; int BorderWidth = 0; int WindowClass = InputOutput; int WindowDepth = VisualInfo->depth; Visual* WindowVisual = VisualInfo->visual; int AttributeValueMask = CWBackPixel | CWEventMask | CWColormap; XSetWindowAttributes WindowAttributes = {}; WindowAttributes.colormap = XCreateColormap( this->mainDisplay, this->RootWindow, VisualInfo->visual, AllocNone); WindowAttributes.background_pixel = 0xffafe9af; WindowAttributes.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask | PointerMotionMask; this->mainWindow = XCreateWindow( this->mainDisplay, this->RootWindow, WindowX, WindowY, WindowWidth, WindowHeight, BorderWidth, WindowDepth, WindowClass, WindowVisual, AttributeValueMask, &WindowAttributes); XStoreName( this->mainDisplay, this->mainWindow, "Opengl: Fixed function pipeline" ); glXMakeCurrent( this->mainDisplay, this->mainWindow, OpenGLContext ); XMapWindow( this->mainDisplay, this->mainWindow ); Atom WM_DELETE_WINDOW = XInternAtom( this->mainDisplay, "WM_DELETE_WINDOW", False ); if( !XSetWMProtocols( this->mainDisplay, this->mainWindow, &WM_DELETE_WINDOW, 1) ) { printf( "Couldn't register WM_DELETE_WINDOW\n" ); } } void opengl_setupRenderLoop( opengl * this ) { int IsProgramRunning = 1; while( IsProgramRunning ) { while( XPending( this->mainDisplay ) ) { XEvent GeneralEvent = {}; XNextEvent( this->mainDisplay, &GeneralEvent ); switch( GeneralEvent.type ) { case ClientMessage: { IsProgramRunning = 0; } break; } } { opengl_render( this ); } } } void opengl_createShaders( opengl * this ) { shader * currentShader = shader_newPointer(); shader_createFromFile( currentShader, "assets/shaders/color.vertex", "assets/shaders/color.fragment" ); vector3 * diffuseColor = vector3_newPointer( 0.0, 1.0, 0.0 ); shader_setUniform( currentShader, "diffuse", diffuseColor ); vector2 * position = vector2_newPointer( 1.0, 0.0 ); shader_setUniform( currentShader, "position", position ); this->currentShader = currentShader; } void opengl_createQuad( opengl * this ) { this->quads = mesh_newPointer(); mesh_createBuffers( this->quads ); } double opengl_clockToMilliseconds( opengl * this, clock_t ticks ) { return ( ticks / ( double ) CLOCKS_PER_SEC ); } void opengl_render( opengl * this ) { Window qRoot; Window qChild; unsigned int qMask; int childX; int childY; int mouseX; int mouseY; int child; int windowX = 0; int windowY = 0; int windowWidth = 0; int windowHeight = 0; XWindowAttributes window; if( XGetWindowAttributes( this->mainDisplay, this->mainWindow, &window ) ) { } if( XQueryPointer( this->mainDisplay, this->RootWindow, &qRoot, &qChild, &mouseX, &mouseY, &childX, &childY, &qMask ) ) { mouseX -= window.x; mouseY -= window.y; for(int i = 0; i < sizeof(int) * 8; i++) { int mask = 1 << sizeof(int) * 8 - i - 1; if(mask & qMask) { } else { } } if( qMask == Button1MotionMask ) { printf("LeftMouse\n"); } if( qMask == Button2MotionMask ) { printf("Button2MotionMask\n"); } if( qMask == Button3MotionMask ) { printf("RightMouse\n"); } if( qMask == Button4MotionMask ) { printf("Button2MotionMask\n"); } if( qMask == Button5MotionMask ) { printf("Button2MotionMask\n"); } if( qMask == ShiftMask ) { printf("Pressed shift\n"); } if( qMask == ControlMask ) { printf("Pressed control\n"); } if( qMask == EnterWindowMask ) { } XEvent event; int keyboardEventCount = XPending( this->mainDisplay ); while( XPending( this->mainDisplay ) ) { XNextEvent( this->mainDisplay, &event ); switch ( event.type ) { case KeyPress: printf("key has been pressed. %i\n\n", event.xkey.keycode); break; case KeyRelease: printf("key has been released. %i\n\n", event.xkey.keycode); break; case Expose: break; default: } } } opengl_clearColor( this, 0.0, 1.0, 0.6, 1.0 ); opengl_clear( this, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); float number = (float)(this->frameCount & 1000) / 1000; shader * currentShader = this->currentShader; vector2 * windowSize = vector2_newPointer( window.width, window.height ); vector2 * mouse = vector2_newPointer( mouseX, mouseY ); shader_setUniform( currentShader, "window", windowSize ); shader_setUniform( currentShader, "mouse", mouse ); int itemSize; glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glEnableVertexAttribArray( 0 ); glEnableVertexAttribArray( 1 ); glEnableVertexAttribArray( 3 ); itemSize = 3; glBindBuffer( GL_ARRAY_BUFFER, this->quads->vertexbuffer ); glVertexAttribPointer( 0, itemSize, GL_FLOAT, GL_FALSE, 0, ( void * ) 0 ); itemSize = 2; glBindBuffer( GL_ARRAY_BUFFER, this->quads->textureCoordinateBuffer ); glVertexAttribPointer( 1, itemSize, GL_FLOAT, GL_FALSE, 0, ( void * ) 0 ); itemSize = 1; glBindBuffer( GL_ARRAY_BUFFER, this->quads->meshIndexBuffer ); glVertexAttribPointer( 2, itemSize, GL_FLOAT, GL_FALSE, 0, ( void * ) 0 ); int numItems = 10000; glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, this->quads->indexBuffer ); glDrawElements( GL_TRIANGLES, numItems, GL_UNSIGNED_INT, ( void * ) 0 ); glDisableVertexAttribArray( 0 ); glDisableVertexAttribArray( 1 ); opengl_end( this ); opengl_flush( this ); } void opengl_displayFPS( opengl * this ) { struct timespec now; clock_gettime( CLOCK_REALTIME, &now ); this->frameCount++; int elapsedTime = now.tv_sec - this->startTime.tv_sec; if( elapsedTime != this->lastTime ) { printf("%i fps.\n\n", this->frameCount ); this->lastTime = elapsedTime; this->frameCount = 0; } } void opengl_vertex2f( opengl * this, float x, float y ) { glVertex2f( x, y ); } void opengl_color3f( opengl * this, float r, float g, float b ) { glColor3f( r, g, b ); } void opengl_clear( opengl * this, GLbitfield mask ) { glClear( mask ); } void opengl_clearColor( opengl * this, float r, float g, float b, float a ) { glClearColor( r, g, b, a ); } void opengl_begin( opengl * this, GLenum mode ) { glBegin( mode ); } void opengl_end( opengl * this ) { glEnd(); } void opengl_flush( opengl * this ) { PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT; PFNGLXSWAPINTERVALMESAPROC glXSwapIntervalMESA; PFNGLXSWAPINTERVALSGIPROC glXSwapIntervalSGI; glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glXGetProcAddress( (const GLubyte*)"glXSwapIntervalEXT"); if (glXSwapIntervalEXT != NULL) { glXSwapIntervalEXT(this->mainDisplay, this->mainWindow, 0); } else { glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glXGetProcAddress( (const GLubyte*)"glXSwapIntervalMESA"); if ( glXSwapIntervalMESA != NULL ) { glXSwapIntervalMESA(0); } else { glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glXGetProcAddress( (const GLubyte*)"glXSwapIntervalSGI"); if ( glXSwapIntervalSGI != NULL ) { glXSwapIntervalSGI(0); } } } glXSwapBuffers( this->mainDisplay, this->mainWindow ); } opengl opengl_new() { opengl instance; instance.__classIndex = 0; instance.lastTime = clock(); instance.deltaTime = 0; instance.frameCount = 0; return instance; } opengl * opengl_newPointer() { struct opengl * pointer = malloc( sizeof ( struct opengl ) ); pointer->__classIndex = 0; pointer->lastTime = clock(); pointer->deltaTime = 0; pointer->frameCount = 0; return pointer; }