97 lines
2.5 KiB
C++
97 lines
2.5 KiB
C++
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include "renderer.hpp"
|
|
|
|
#include "sim/world.hpp"
|
|
#include "sim/aircraft.hpp"
|
|
#include "sim/airfield.hpp"
|
|
#include "sim/af_spawner.hpp"
|
|
|
|
static SDL_Window *window;
|
|
static SDL_Renderer *sdl_renderer;
|
|
static int width, height;
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
if (argc > 2)
|
|
{
|
|
printf("Usage: %s [WID]\n", argv[0]);
|
|
exit(1);
|
|
}
|
|
|
|
SDL_Init(SDL_INIT_VIDEO);
|
|
|
|
if (argc == 2)
|
|
{
|
|
int wid = 0;
|
|
sscanf(argv[1], "%d", &wid);
|
|
|
|
SDL_PropertiesID props = SDL_CreateProperties();
|
|
SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER, wid);
|
|
window = SDL_CreateWindowWithProperties(props);
|
|
}
|
|
else
|
|
{
|
|
window = SDL_CreateWindow("dxdesktop", 1024, 1024, SDL_WINDOW_OPENGL);
|
|
}
|
|
|
|
sdl_renderer = SDL_CreateRenderer(window, NULL);
|
|
|
|
SDL_GetWindowSize(window, &width, &height);
|
|
dxd::Renderer renderer = dxd::Renderer(sdl_renderer, width, height);
|
|
|
|
// World init
|
|
dxd::sim::World world = dxd::sim::World();
|
|
world.add_obj(new dxd::sim::AFSpawner());
|
|
|
|
SDL_Event event;
|
|
bool running = true;
|
|
|
|
while (running) {
|
|
while (SDL_PollEvent(&event)) {
|
|
if (event.type == SDL_EVENT_QUIT) running = false;
|
|
if (event.type == SDL_EVENT_KEY_DOWN) {
|
|
if (event.key.key == SDLK_ESCAPE) running = false;
|
|
}
|
|
}
|
|
|
|
const bool *key_states = SDL_GetKeyboardState(NULL);
|
|
|
|
const float move_spd = 1.0f * renderer.get_zoom();
|
|
const float zoom_spd = 0.5f;
|
|
|
|
if (key_states[SDL_SCANCODE_W]) renderer.move_camera(+vec2_unity * move_spd * (1.0f / 60.0f));
|
|
if (key_states[SDL_SCANCODE_S]) renderer.move_camera(-vec2_unity * move_spd * (1.0f / 60.0f));
|
|
if (key_states[SDL_SCANCODE_A]) renderer.move_camera(-vec2_unitx * move_spd * (1.0f / 60.0f));
|
|
if (key_states[SDL_SCANCODE_D]) renderer.move_camera(+vec2_unitx * move_spd * (1.0f / 60.0f));
|
|
if (key_states[SDL_SCANCODE_Q]) renderer.zoom_camera(+zoom_spd * (1.0f / 60.0f));
|
|
if (key_states[SDL_SCANCODE_E]) renderer.zoom_camera(-zoom_spd * (1.0f / 60.0f));
|
|
|
|
// Clear
|
|
renderer.color(0, 0, 0);
|
|
SDL_RenderClear(sdl_renderer);
|
|
|
|
// World draw
|
|
world.draw(&renderer);
|
|
world.tick(1.0f / 60.0f);
|
|
|
|
// World axis
|
|
renderer.color(32, 32, 32);
|
|
renderer.line(-vec2_unity * 2000, vec2_unity * 2000);
|
|
renderer.line(-vec2_unitx * 2000, vec2_unitx * 2000);
|
|
|
|
// Scale and position
|
|
vec2 center = renderer.get_camera_pos();
|
|
float zoom = 100.0f/renderer.get_zoom();
|
|
renderer.color(128, 128, 255);
|
|
renderer.dbg_txt(0, 0, "(%0.1f, %0.1f) @%0.2f", center.x, center.y, zoom);
|
|
|
|
SDL_RenderPresent(sdl_renderer);
|
|
SDL_Delay(1000 / 60);
|
|
}
|
|
}
|