-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
118 lines (105 loc) · 3.22 KB
/
Copy pathmain.cpp
File metadata and controls
118 lines (105 loc) · 3.22 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
#include "graphics_structs.h"
#include "render.h"
#include "scene.h"
#include "SDL3/SDL_main.h"
static int gDone;
SDL_Window* gSDLWindow;
SDL_Renderer* gSDLRenderer;
SDL_Texture* gSDLTexture;
/*global variable scene*/
Scene_t rendererScene;
/*global vec3d user input, i hate this*/
Vec3d_t userInput;
int sensitivity = 5;
/*
TODO
30fps -> 90fps
use bitshifts for colour mult
better early rejection for h_segment where its all 1.0
occulision culling
shading
textures
*/
bool update()
{
SDL_Event e;
if (SDL_PollEvent(&e))
{
if (e.type == SDL_EVENT_QUIT)
{
return false;
}
if (e.type == SDL_EVENT_KEY_UP && e.key.key == SDLK_ESCAPE) { return false; }
if (e.type == SDL_EVENT_KEY_DOWN && e.key.key == SDLK_A) { userInput.x += sensitivity; }
if (e.type == SDL_EVENT_KEY_DOWN && e.key.key == SDLK_LCTRL) { userInput.y += sensitivity; }
if (e.type == SDL_EVENT_KEY_DOWN && e.key.key == SDLK_D) { userInput.x += -sensitivity; }
if (e.type == SDL_EVENT_KEY_DOWN && e.key.key == SDLK_SPACE) { userInput.y += -sensitivity; }
if (e.type == SDL_EVENT_KEY_DOWN && e.key.key == SDLK_W) { userInput.z += sensitivity; }
if (e.type == SDL_EVENT_KEY_DOWN && e.key.key == SDLK_S) { userInput.z += -sensitivity; }
}
char* pix;
int pitch;
SDL_LockTexture(gSDLTexture, NULL, (void**)&pix, &pitch);
for (int i = 0, sp = 0, dp = 0; i < WINDOW_HEIGHT; i++, dp += WINDOW_WIDTH, sp += pitch)
memcpy(pix + sp, gFrameBuffer + dp, WINDOW_WIDTH * 4);
SDL_UnlockTexture(gSDLTexture);
SDL_RenderTexture(gSDLRenderer, gSDLTexture, NULL, NULL);
SDL_RenderPresent(gSDLRenderer);
SDL_RenderClear(gSDLRenderer);
//SDL_Delay(1);//this eats 7 frames per second : (
return true;
}
void render(Uint64 aTicks)/*does the funny rendering*/
{
rendererScene.meshInstances[0].rot.x += (float).01;
rendererScene.meshInstances[0].rot.y += (float).01;
rendererScene.meshInstances[0].rot.z += (float).01;
rendererScene.camera.position.x -= userInput.x;
rendererScene.camera.position.y -= userInput.y;
rendererScene.camera.position.z -= userInput.z;
render_scene(rendererScene);
userInput.x = 0.0;
userInput.y = 0.0;
userInput.z = 0.0;
}
void loop()
{
if (!update())
{
gDone = 1;
#ifdef __EMSCRIPTEN__
emscripten_cancel_main_loop();
#endif
}
else
{
render(SDL_GetTicks());
}
}
int main(int argc, char** argv)
{
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS))
{
return -1;
}
gSDLWindow = SDL_CreateWindow("SDL3 window", WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_FULLSCREEN);
gSDLRenderer = SDL_CreateRenderer(gSDLWindow, NULL);
gSDLTexture = SDL_CreateTexture(gSDLRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, WINDOW_WIDTH, WINDOW_HEIGHT);
if (!gFrameBuffer || !gSDLWindow || !gSDLRenderer || !gSDLTexture)
return -1;
gDone = 0;
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(loop, 0, 1);
#else
setup_scene(rendererScene);
while (!gDone)
{
loop();
}
#endif
SDL_DestroyTexture(gSDLTexture);
SDL_DestroyRenderer(gSDLRenderer);
SDL_DestroyWindow(gSDLWindow);
SDL_Quit();
return 0;
}