diff --git a/3D_Jason b/3D_Jason
new file mode 100644
index 0000000..13d6122
Binary files /dev/null and b/3D_Jason differ
diff --git a/3D_Jason.c b/3D_Jason.c
new file mode 100644
index 0000000..3918724
--- /dev/null
+++ b/3D_Jason.c
@@ -0,0 +1,172 @@
+/****************************************************************************
+ ** 3D_Jason.c - display a 3D rotating cube **
+ ** Copyright (c) 31/12/2022 Jason Bou-Samra [Paragon] **
+ ** **
+ ** This program is free software: you can redistribute it and/or modify **
+ ** it under the terms of the GNU General Public License as published by **
+ ** the Free Software Foundation, either version 3 of the License, or **
+ ** (at your option) any later version. **
+ ** **
+ ** This program is distributed in the hope that it will be useful, **
+ ** but WITHOUT ANY WARRANTY; without even the implied warranty of **
+ ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the **
+ ** GNU General Public License for more details. **
+ ** **
+ ** You should have received a copy of the GNU General Public License **
+ ** along with this program. If not, see . **
+ ****************************************************************************/
+
+#include
+#include
+#include
+#include
+
+int initSDL(void);
+int shutdownSDL(void);
+int rotate (void);
+int draw (void);
+
+double x[8], y[8], z[8];
+double xt[8], yt[8], zt[8];
+double xu[8], yu[8], zu[8];
+double angle = 0.0;
+bool quit = false;
+
+SDL_Window *window = NULL;
+SDL_Renderer *s;
+SDL_Event event;
+
+/* window paramaters */
+#define WIDTH 640 /* pixels */
+#define HEIGHT 512 /* pixels */
+#define DELAY 3000 /* milliseconds */
+#define TITLE "3Dcube" /* title */
+#define RAD 3.14159265/180
+#define SPEED 3
+
+int main(void)
+{
+ initSDL();
+ SDL_RenderSetScale(s, 2.0, 2.0); /* scale x2 */
+
+while (quit==false){
+
+while (SDL_PollEvent(&event)) {
+ if (event.type==SDL_QUIT || event.type == SDL_WINDOWEVENT_CLOSE) {quit = true;}
+}
+if(quit) {break;}
+
+ rotate();
+ draw();
+
+}
+ shutdownSDL();
+}
+
+/* rotation & projection routine */
+int rotate()
+{
+
+for (int i=7; i>=0; i--){
+
+/* x angle (Roll) */
+ xt[i]=x[i];
+ yt[i]=y[i]*cos(RAD*angle)-z[i]*sin(RAD*angle);
+ zt[i]=y[i]*sin(RAD*angle)+z[i]*cos(RAD*angle);
+
+/* y angle (Pitch) */
+ xu[i]=zt[i]*sin(RAD*angle)+xt[i]*cos(RAD*angle);
+ yu[i]=yt[i];
+ zu[i]=xt[i]*-sin(RAD*angle)+zt[i]*cos(RAD*angle);
+
+/* z angle (Yaw) */
+ xt[i]=xu[i]*cos(RAD*angle)-yu[i]*sin(RAD*angle);
+ yt[i]=xu[i]*sin(RAD*angle)+yu[i]*cos(RAD*angle);
+ zt[i]=zu[i];
+
+/* 2d perspective projection */
+xt[i]=(xt[i]*200)/(zt[i]+800)+160;
+yt[i]=(yt[i]*200)/(zt[i]+800)+128;
+}
+
+angle = angle + SPEED;
+}
+
+/* render cube */
+ int draw()
+ {
+ SDL_SetRenderDrawColor(s, 0x00, 0x00, 0x00, 255); /* background */
+ SDL_RenderClear(s); /* clear screen (black) */
+ SDL_SetRenderDrawColor(s, 0x80, 0x00,0x80,255); /* pen */
+ SDL_RenderDrawLine(s, xt[0], yt[0], xt[1], yt[1]);
+ SDL_RenderDrawLine(s, xt[1], yt[1], xt[2], yt[2]);
+ SDL_RenderDrawLine(s, xt[2], yt[2], xt[3], yt[3]);
+ SDL_RenderDrawLine(s, xt[3], yt[3], xt[0], yt[0]);
+
+ SDL_RenderDrawLine(s, xt[4], yt[4], xt[5], yt[5]);
+ SDL_RenderDrawLine(s, xt[5], yt[5], xt[6], yt[6]);
+ SDL_RenderDrawLine(s, xt[6], yt[6], xt[7], yt[7]);
+ SDL_RenderDrawLine(s, xt[7], yt[7], xt[4], yt[4]);
+
+ SDL_RenderDrawLine(s, xt[0], yt[0], xt[4], yt[4]);
+ SDL_RenderDrawLine(s, xt[1], yt[1], xt[5], yt[5]);
+ SDL_RenderDrawLine(s, xt[2], yt[2], xt[6], yt[6]);
+ SDL_RenderDrawLine(s, xt[3], yt[3], xt[7], yt[7]);
+
+ SDL_RenderPresent(s);
+ }
+
+/* initialise SDL */
+int initSDL(){
+ SDL_Init(SDL_INIT_EVERYTHING);
+
+/* new window */
+ window = SDL_CreateWindow(
+ TITLE, /* title*/
+ SDL_WINDOWPOS_UNDEFINED, /* x pos */
+ SDL_WINDOWPOS_UNDEFINED, /* w pos */
+ WIDTH, /* width */
+ HEIGHT, /* height */
+ 0); /* Additional flag(s) */
+
+ /* deal with errors */
+ if (window == NULL) {
+ fprintf(stderr, "SDL window failed to initialise: %s\n", SDL_GetError());
+ return 1;
+ }
+
+/* create renderer */
+s = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
+
+}
+
+/* shutdown routine */
+int shutdownSDL()
+{
+
+// SDL_Delay(DELAY); /* pause sdl sub-system */
+ SDL_DestroyWindow(window); /* free memory */
+ SDL_Quit(); /* shutdown entire sdl sub-systems */
+ return 0;
+}
+
+/* cube verticies */
+/* x component */
+double x[]={-80.0, 80.0, 80.0, -80.0, -80.0, 80.0, 80.0, -80.0
+};
+
+/* y component */
+double y[]={80.0, 80.0, -80.0, -80.0, 80.0, 80.0, -80.0, -80.0
+};
+
+/* z component */
+double z[]={80.0, 80.0, 80.0, 80.0, -80.0, -80.0, -80.0, -80.0
+};
+
+/* perspective projection table */
+double ProjPos[]={
+};
+
+/* message */
+char author[]={"3d vector graphics demo"};
+const char* text = "c version 1";
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d5467ac
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,7 @@
+#! /bin/make
+# :vim: set noexpandtab:
+
+CFLAGS = -lm `sdl2-config --cflags --libs`
+
+3D_Jason: 3D_Jason.c
+ $(CC) -o 3D_Jason 3D_Jason.c $(CFLAGS)