diff --git a/3Dcube_final b/3Dcube_final
new file mode 100644
index 0000000..d62c42d
Binary files /dev/null and b/3Dcube_final differ
diff --git a/3Dcube_final.c b/3Dcube_final.c
new file mode 100644
index 0000000..7537136
--- /dev/null
+++ b/3Dcube_final.c
@@ -0,0 +1,179 @@
+/****************************************************************************
+ ** 3Dcube_final.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 render (void);
+
+double rx, l, fs, c, s;
+double x[8], y[8], z[8]; /* xyz coords */
+double xt, yt, zt; /* temp xyz coords */
+double vx[8], vy[8]; /* vertices */
+bool quit = false; /* quit flag */
+
+SDL_Window *window = NULL;
+SDL_Renderer *sr;
+SDL_Event event;
+
+/* window paramaters */
+#define WIDTH 640 /* pixels */
+#define HEIGHT 512 /* pixels */
+#define TITLE "3Dcube" /* window title */
+#define STEPS .05 /* resolution */
+
+int main (void)
+{
+ initSDL ();
+ SDL_RenderSetScale (sr, 2.0, 2.0); /* scale x2 */
+ rx = -0.1;
+ l = 80;
+ fs = 200; /* scale factor */
+ l = l / 2;
+ while (quit == false)
+ {
+
+ while (SDL_PollEvent (&event))
+ {
+ if (event.type == SDL_QUIT || event.type == SDL_WINDOWEVENT_CLOSE)
+ {
+ quit = true;
+ }
+ }
+ if (quit)
+ {
+ break;
+ }
+
+/* define cube */
+ x[0] = -l; y[0] = -l; z[0] = -l;
+ x[1] = -l; y[1] = l; z[1] = -l;
+ x[2] = l; y[2] = l; z[2] = -l;
+ x[3] = l; y[3] = -l; z[3] = -l;
+ x[4] = -l; y[4] = -l; z[4] = l;
+ x[5] = -l; y[5] = l; z[5] = l;
+ x[6] = l; y[6] = l; z[6] = l;
+ x[7] = l; y[7] = -l; z[7] = l;
+
+ rx = rx + STEPS;
+ c = cos (rx);
+ s = sin (rx);
+
+ rotate ();
+ render ();
+
+// SDL_Delay(50);
+ }
+ shutdownSDL (); /* bye */
+}
+
+/* render */
+int render ()
+{
+ /* foreground & background colours */
+ SDL_SetRenderDrawColor (sr, 0x00, 0x10, 0x00, 255); /* background */
+ SDL_RenderClear (sr); /* clear background */
+ SDL_SetRenderDrawColor (sr, 0x00, 0xF0, 0x00, 255); /* set pen colour*/
+
+ /* draw cube */
+ SDL_RenderDrawLine (sr, vx[0], vy[0], vx[1], vy[1]);
+ SDL_RenderDrawLine (sr, vx[1], vy[1], vx[2], vy[2]);
+ SDL_RenderDrawLine (sr, vx[2], vy[2], vx[3], vy[3]);
+ SDL_RenderDrawLine (sr, vx[3], vy[3], vx[0], vy[0]);
+
+ SDL_RenderDrawLine (sr, vx[4], vy[4], vx[5], vy[5]);
+ SDL_RenderDrawLine (sr, vx[5], vy[5], vx[6], vy[6]);
+ SDL_RenderDrawLine (sr, vx[6], vy[6], vx[7], vy[7]);
+ SDL_RenderDrawLine (sr, vx[7], vy[7], vx[4], vy[4]);
+
+ SDL_RenderDrawLine (sr, vx[0], vy[0], vx[4], vy[4]);
+ SDL_RenderDrawLine (sr, vx[3], vy[3], vx[7], vy[7]);
+ SDL_RenderDrawLine (sr, vx[1], vy[1], vx[5], vy[5]);
+ SDL_RenderDrawLine (sr, vx[2], vy[2], vx[6], vy[6]);
+
+ SDL_RenderPresent (sr);
+}
+
+/* rotation routine */
+int rotate ()
+{
+ for (int np = 0; np < 8; np++)
+ {
+
+/* rotation around x axis */
+ yt = y[np];
+ y[np] = c * yt - s * z[np];
+ z[np] = s * yt + c * z[np];
+
+/* rotation around y axis */
+ xt = x[np];
+ x[np] = c * xt + s * z[np];
+ z[np] = -s * xt + c * z[np];
+
+/* rotation around z axis */
+ xt = x[np];
+ x[np] = c * xt - s * y[np];
+ y[np] = s * xt + c * y[np];
+
+/* now project into 2D */
+ vx[np] = (x[np] * fs) / (z[np] + fs) + 160;
+ vy[np] = (y[np] * fs) / (z[np] + fs) + 128;
+ }
+}
+
+/* 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 error */
+ if (window == NULL)
+ {
+ fprintf (stderr, "SDL window failed to initialise: %s\n",
+ SDL_GetError ());
+ return 1;
+ }
+
+/* creater renderer */
+ sr = SDL_CreateRenderer (window, 0, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
+}
+
+/* shutdown routine */
+int shutdownSDL ()
+{
+ SDL_DestroyWindow (window); /* free memory */
+ SDL_Quit (); /* shutdown entire sdl sub-systems */
+ return 0;
+}
+
+/* message */
+char author[] = { "3d vector graphics demo by jason bou-samra" };
+const char* text = "Amiga by Commodore all the way";
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c846506
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,8 @@
+#! /bin/make
+# :vim: set noexpandtab:
+
+CFLAGS = -lm `sdl2-config --cflags --libs`
+
+3Dcube_final: 3Dcube_final.c
+ $(CC) -o 3Dcube_final 3Dcube_final.c $(CFLAGS)
+
diff --git a/Screenshot from 2024-04-22 19-25-23.png b/Screenshot from 2024-04-22 19-25-23.png
new file mode 100644
index 0000000..ef144c9
Binary files /dev/null and b/Screenshot from 2024-04-22 19-25-23.png differ