bulk data dump
This commit is contained in:
+172
@@ -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 <https://www.gnu.org/licenses/>. **
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
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";
|
||||||
Reference in New Issue
Block a user