diff --git a/doomgeneric/Makefile b/doomgeneric/Makefile index 503e0dc..5c44a6d 100644 --- a/doomgeneric/Makefile +++ b/doomgeneric/Makefile @@ -12,17 +12,16 @@ else endif -CC=clang # gcc or g++ -CFLAGS+=-ggdb3 -Os +CC=$(LUNA_ARCH)-luna-gcc LDFLAGS+=-Wl,--gc-sections -CFLAGS+=-ggdb3 -Wall -DNORMALUNIX -DLINUX -DSNDSERV -D_DEFAULT_SOURCE # -DUSEASM -LIBS+=-lm -lc -lX11 +CFLAGS+=-ggdb3 -Os -Wall -fno-omit-frame-pointer -DNORMALUNIX -DLINUX -DSNDSERV -D_DEFAULT_SOURCE # -DUSEASM +LIBS+=-lc -lwind # subdirectory for objects OBJDIR=build OUTPUT=doomgeneric -SRC_DOOM = dummy.o am_map.o doomdef.o doomstat.o dstrings.o d_event.o d_items.o d_iwad.o d_loop.o d_main.o d_mode.o d_net.o f_finale.o f_wipe.o g_game.o hu_lib.o hu_stuff.o info.o i_cdmus.o i_endoom.o i_joystick.o i_scale.o i_sound.o i_system.o i_timer.o memio.o m_argv.o m_bbox.o m_cheat.o m_config.o m_controls.o m_fixed.o m_menu.o m_misc.o m_random.o p_ceilng.o p_doors.o p_enemy.o p_floor.o p_inter.o p_lights.o p_map.o p_maputl.o p_mobj.o p_plats.o p_pspr.o p_saveg.o p_setup.o p_sight.o p_spec.o p_switch.o p_telept.o p_tick.o p_user.o r_bsp.o r_data.o r_draw.o r_main.o r_plane.o r_segs.o r_sky.o r_things.o sha1.o sounds.o statdump.o st_lib.o st_stuff.o s_sound.o tables.o v_video.o wi_stuff.o w_checksum.o w_file.o w_main.o w_wad.o z_zone.o w_file_stdc.o i_input.o i_video.o doomgeneric.o doomgeneric_xlib.o +SRC_DOOM = dummy.o am_map.o doomdef.o doomstat.o dstrings.o d_event.o d_items.o d_iwad.o d_loop.o d_main.o d_mode.o d_net.o f_finale.o f_wipe.o g_game.o hu_lib.o hu_stuff.o info.o i_cdmus.o i_endoom.o i_joystick.o i_scale.o i_sound.o i_system.o i_timer.o memio.o m_argv.o m_bbox.o m_cheat.o m_config.o m_controls.o m_fixed.o m_menu.o m_misc.o m_random.o p_ceilng.o p_doors.o p_enemy.o p_floor.o p_inter.o p_lights.o p_map.o p_maputl.o p_mobj.o p_plats.o p_pspr.o p_saveg.o p_setup.o p_sight.o p_spec.o p_switch.o p_telept.o p_tick.o p_user.o r_bsp.o r_data.o r_draw.o r_main.o r_plane.o r_segs.o r_sky.o r_things.o sha1.o sounds.o statdump.o st_lib.o st_stuff.o s_sound.o tables.o v_video.o wi_stuff.o w_checksum.o w_file.o w_main.o w_wad.o z_zone.o w_file_stdc.o i_input.o i_video.o doomgeneric.o doomgeneric_luna.o OBJS += $(addprefix $(OBJDIR)/, $(SRC_DOOM)) all: $(OUTPUT) @@ -51,4 +50,3 @@ $(OBJDIR)/%.o: %.c print: @echo OBJS: $(OBJS) - diff --git a/doomgeneric/doomgeneric_luna.c b/doomgeneric/doomgeneric_luna.c new file mode 100644 index 0000000..4d37ddc --- /dev/null +++ b/doomgeneric/doomgeneric_luna.c @@ -0,0 +1,160 @@ +#include "doomgeneric.h" +#include "wind.h" +#include +#include +#include +#include +#include +#include "doomkeys.h" + +static wind_client_t g_client; +static wind_window_t g_window; + +#define KEYQUEUE_SIZE 16 + +static unsigned short s_KeyQueue[KEYQUEUE_SIZE]; +static unsigned int s_KeyQueueWriteIndex = 0; +static unsigned int s_KeyQueueReadIndex = 0; + +static unsigned char convertToDoomKey(enum wind_keycode scancode) +{ + unsigned char key = 0; + + switch (scancode) + { + case wind_key_Enter: + key = KEY_ENTER; + break; + case wind_key_Esc: + key = KEY_ESCAPE; + break; + case wind_key_LeftArrow: + key = KEY_LEFTARROW; + break; + case wind_key_RightArrow: + key = KEY_RIGHTARROW; + break; + case wind_key_UpArrow: + key = KEY_UPARROW; + break; + case wind_key_DownArrow: + key = KEY_DOWNARROW; + break; + case wind_key_LeftControl: + key = KEY_FIRE; + break; + case wind_key_RightControl: + key = KEY_USE; + break; + case wind_key_RightShift: + key = KEY_RSHIFT; + break; + case wind_key_CH18: + key = 'y'; + break; + default: + break; + } + + return key; +} + +static void addKeyToQueue(int pressed, enum wind_keycode keyCode) +{ + unsigned char key = convertToDoomKey(keyCode); + + unsigned short keyData = (pressed << 8) | key; + + s_KeyQueue[s_KeyQueueWriteIndex] = keyData; + s_KeyQueueWriteIndex++; + s_KeyQueueWriteIndex %= KEYQUEUE_SIZE; +} + +static int event_handler(wind_client_t*, uint8_t event, void*) +{ + switch (event) + { + case wind_MouseEvent: { + struct wind_mouse_event_request event_data; + wind_read_response(&g_client, event, &event_data, sizeof event_data); + break; + } + case wind_MouseLeave: { + struct wind_mouse_leave_request event_data; + wind_read_response(&g_client, event, &event_data, sizeof event_data); + break; + } + case wind_KeyEvent: { + struct wind_key_event_request event_data; + wind_read_response(&g_client, event, &event_data, sizeof event_data); + addKeyToQueue(event_data.pressed, event_data.code); + break; + } + + default: + break; + } + + return 0; +} + +void DG_Init() { + wind_connect(&g_client, WIND_SOCKET_PATH, 0); + wind_set_handler(&g_client, event_handler, NULL); + + struct wind_rect rect = { + .pos = {0,0}, + .width = DOOMGENERIC_RESX, + .height =DOOMGENERIC_RESY + }; + + int result = wind_create_window(&g_client, &g_window, rect); + if(result < 0) perror("wind_create_window"); +} + +void DG_DrawFrame() { + wind_check_for_messages(&g_client); + + memcpy(g_window.canvas, DG_ScreenBuffer, DOOMGENERIC_RESX*DOOMGENERIC_RESY*4); + wind_invalidate(&g_client, &g_window); +} + +int DG_GetKey(int *pressed, unsigned char *doomKey) { if (s_KeyQueueReadIndex == s_KeyQueueWriteIndex) + { + //key queue is empty + + return 0; + } + else + { + unsigned short keyData = s_KeyQueue[s_KeyQueueReadIndex]; + s_KeyQueueReadIndex++; + s_KeyQueueReadIndex %= KEYQUEUE_SIZE; + + *pressed = keyData >> 8; + *doomKey = keyData & 0xFF; + + return 1; + } } + +void DG_SleepMs(uint32_t ms) { usleep(ms * 1000); } + +void DG_SetWindowTitle(const char *title) { wind_set_window_title(&g_client, &g_window, title); } + +uint32_t DG_GetTicksMs() { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000); +} + +int main(int argc, char **argv) +{ + doomgeneric_Create(argc, argv); + + while (1) + { + doomgeneric_Tick(); + } + + return 0; +}