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)