-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.c
More file actions
148 lines (123 loc) · 4.05 KB
/
main.c
File metadata and controls
148 lines (123 loc) · 4.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <SDL3/SDL.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "structs.h"
#include "manipulation.h"
#include "rendering.h"
#define WINDOW_HEIGHT 1200
#define WINDOW_WIDTH 900
#define FPS 60
#define MAX_ANGULAR_SPEED 0.04
SDL_Window *window;
SDL_Surface *surface;
SDL_Renderer *renderer;
Point2D project_3d_to_2d(const Point3D *point_3d, float focal_length)
{
float x_2d = (point_3d->x / point_3d->z) * focal_length + WINDOW_WIDTH / 2;
float y_2d = (point_3d->y / point_3d->z) * focal_length + WINDOW_HEIGHT / 2;
Point2D point_2d = {x_2d, y_2d};
return point_2d;
}
float random_range(float min, float max)
{
return min + ((float)rand() / RAND_MAX) * (max - min);
}
int main(void)
{
srand(time(NULL));
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("SDL could not initialize! %s\n", SDL_GetError());
return 1;
}
window = SDL_CreateWindow("Hello SDL3!", WINDOW_WIDTH, WINDOW_HEIGHT, 0);
renderer = SDL_CreateRenderer(window, NULL);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
float focal_length = 300.0;
Point3D cube_3d[] = {
{-1, -1, 2}, {1, -1, 2}, {1, 1, 2}, {-1, 1, 2}, {-1, -1, 4}, {1, -1, 4}, {1, 1, 4}, {-1, 1, 4}};
int cube_edges[12][2] = {
{0, 1}, {1, 2}, {2, 3}, {3, 0}, {4, 5}, {5, 6}, {6, 7}, {7, 4}, {0, 4}, {1, 5}, {2, 6}, {3, 7}};
Point2D cube_2d[8];
float angular_speed_x = 0.0, angular_speed_y = 0.0, angular_speed_z = 0.0;
float angular_accel_x = 0.0, angular_accel_y = 0.0, angular_accel_z = 0.0;
int frame = 0;
SDL_Event event;
int running = 1;
while (running)
{
// Handle events
while (SDL_PollEvent(&event))
{
if (event.type == SDL_EVENT_QUIT)
{
running = 0;
}
}
if (frame % 30 == 0)
{
angular_accel_x = random_range(-0.0005f, 0.0005f);
angular_accel_y = random_range(-0.0005f, 0.0005f);
angular_accel_z = random_range(-0.0005f, 0.0005f);
}
if (angular_speed_x > MAX_ANGULAR_SPEED)
angular_accel_x = -fabs(angular_accel_x);
if (angular_speed_x < -MAX_ANGULAR_SPEED)
angular_accel_x = fabs(angular_accel_x);
if (angular_speed_y > MAX_ANGULAR_SPEED)
angular_accel_y = -fabs(angular_accel_y);
if (angular_speed_y < -MAX_ANGULAR_SPEED)
angular_accel_y = fabs(angular_accel_y);
if (angular_speed_z > MAX_ANGULAR_SPEED)
angular_accel_z = -fabs(angular_accel_z);
if (angular_speed_z < -MAX_ANGULAR_SPEED)
angular_accel_z = fabs(angular_accel_z);
Point3D center = {0, 0, 0};
for (int i = 0; i < 8; i++)
{
center.x += cube_3d[i].x;
center.y += cube_3d[i].y;
center.z += cube_3d[i].z;
}
center.x /= 8.0f;
center.y /= 8.0f;
center.z /= 8.0f;
for (int i = 0; i < 8; i++)
{
cube_3d[i].x -= center.x;
cube_3d[i].y -= center.y;
cube_3d[i].z -= center.z;
}
rotate_x(cube_3d, 8, angular_speed_x);
rotate_y(cube_3d, 8, angular_speed_y);
rotate_z(cube_3d, 8, angular_speed_z);
angular_speed_x += angular_accel_x;
angular_speed_y += angular_accel_y;
angular_speed_z += angular_accel_z;
for (int i = 0; i < 8; i++)
{
cube_3d[i].x += center.x;
cube_3d[i].y += center.y;
cube_3d[i].z += center.z;
}
for (int i = 0; i < 8; i++)
{
Point3D p = cube_3d[i];
Point2D p_2d = project_3d_to_2d(&p, focal_length);
cube_2d[i] = p_2d;
}
for (int i = 0; i < 12; i++)
{
draw_line(&cube_2d[cube_edges[i][0]], &cube_2d[cube_edges[i][1]], renderer);
}
SDL_RenderPresent(renderer);
SDL_Delay(1000 / FPS);
display_clear(renderer);
frame++;
}
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}