Files

234 lines
4.0 KiB
C
Raw Permalink Normal View History

2025-11-17 10:28:09 +01:00
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <GL/glx.h>
// Opengl is old
static int DoubleBufferAttributes[] = {
GLX_RGBA,
GLX_RED_SIZE, 1,
GLX_GREEN_SIZE, 1,
GLX_BLUE_SIZE, 1,
GLX_DEPTH_SIZE, 12,
GLX_DOUBLEBUFFER,
None,
};
class opengl{
Display * mainDisplay;
Window mainWindow;
initialize() {
this->mainDisplay = XOpenDisplay( 0 );
int MainScreen = XDefaultScreen( this->mainDisplay );
Window RootWindow = XDefaultRootWindow( this->mainDisplay );
int empty;
int ResultStatus = glXQueryExtension( this->mainDisplay, &empty, &empty );
XVisualInfo* VisualInfo = glXChooseVisual( this->mainDisplay, 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, RootWindow, VisualInfo->visual, AllocNone);
WindowAttributes.background_pixel = 0xffafe9af;
WindowAttributes.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask | PointerMotionMask;
this->mainWindow = XCreateWindow( this->mainDisplay, 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" );
}
printf("opengl version: %s\n\n", glGetString(GL_VERSION) );
this->createShaders();
int IsProgramRunning = 1;
while( IsProgramRunning ) {
while( XPending( this->mainDisplay ) ) {
XEvent GeneralEvent = {};
XNextEvent( this->mainDisplay, &GeneralEvent );
switch( GeneralEvent.type ) {
case ClientMessage:
{
IsProgramRunning = 0;
} break;
}
}
{
this->render();
}
}
}
createShaders() {
const char* vertex_shader =
"#version 400\n"
"in vec3 vp;"
"void main() {"
" gl_Position = vec4(vp, 1.0);"
"}";
const char* fragment_shader =
"#version 400\n"
"out vec4 frag_colour;"
"void main() {"
" frag_colour = vec4(0.5, 0.0, 0.5, 1.0);"
"}";
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertex_shader, NULL);
glCompileShader(vs);
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fragment_shader, NULL);
glCompileShader(fs);
}
render() {
this->clearColor( 0.0, 1.0, 0.6, 1.0 );
this->clear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
this->begin( GL_TRIANGLES );
this->color3f(1.0, 0.0, 0.0);
this->vertex2f(0, 0.9);
this->color3f(0.0, 1.0, 0.0);
this->vertex2f(0.9, -0.9);
this->color3f(1.0, 1.0, 1.0);
this->vertex2f(-0.9, -0.9);
this->end();
this->flush();
}
vertex2f( float x, float y ) {
glVertex2f( x, y );
}
color3f( float r, float g, float b ) {
glColor3f( r, g, b );
}
clear( GLbitfield mask ) {
glClear( mask );
}
clearColor( float r, float g, float b, float a ) {
glClearColor( r, g, b, a );
}
begin( GLenum mode ) {
glBegin( mode );
}
end() {
glEnd();
}
flush() {
glXSwapBuffers( this->mainDisplay, this->mainWindow );
}
}