Merge pull request #3 from axcap/master

Thanks for the port.
This commit is contained in:
ozkl 2020-11-26 21:07:56 +03:00 committed by GitHub
commit c579afc68c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 219 additions and 0 deletions

View File

@ -27,6 +27,10 @@ I have ported to Windows, X11, and Soso. Just look at (doomgeneric_win.c or doom
Note that X11 port is not efficient since it generates pixmap by XDrawPoint. It can be further improved by using X11 extensions.
## SDL
![SDL](screenshots/sdl.png)
## Windows
![Windows](screenshots/windows.png)

58
doomgeneric/Makefile.sdl Normal file
View File

@ -0,0 +1,58 @@
################################################################
#
# $Id:$
#
# $Log:$
#
ifeq ($(V),1)
VB=''
else
VB=@
endif
SDL_CFLAGS = -D_THREAD_SAFE -I/usr/local/Cellar/sdl2/2.0.10/include/SDL2
SDL_LIBS = -L/usr/local/Cellar/sdl2/2.0.10/lib -lSDL2
CC=gcc # gcc or g++
CFLAGS+=-ggdb3 -Os $(INCLUDES) $(SDL_CFLAGS)
LDFLAGS+=-Wl,-dead_strip
CFLAGS+=-ggdb3 -Wall -DNORMALUNIX -DLINUX -DSNDSERV # -DUSEASM
LIBS+=-lm -lc -lSDL2
# subdirectory for objects
OBJDIR=build
OUTPUT=doomgeneric
SRC_DOOM = i_main.o 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_sdl.o
OBJS += $(addprefix $(OBJDIR)/, $(SRC_DOOM))
all: $(OUTPUT)
clean:
rm -rf $(OBJDIR)
rm -f $(OUTPUT)
rm -f $(OUTPUT).gdb
rm -f $(OUTPUT).map
$(OUTPUT): $(OBJS)
@echo [Linking $@]
$(VB)$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) \
-o $(OUTPUT) $(LIBS) -Wl
@echo [Size]
-$(CROSS_COMPILE)size $(OUTPUT)
$(OBJS): | $(OBJDIR)
$(OBJDIR):
mkdir -p $(OBJDIR)
$(OBJDIR)/%.o: %.c
@echo [Compiling $<]
$(VB)$(CC) $(CFLAGS) -c $< -o $@
print:
@echo OBJS: $(OBJS)

View File

@ -0,0 +1,157 @@
//doomgeneric for soso os
#include "doomkeys.h"
#include "m_argv.h"
#include "doomgeneric.h"
#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <SDL.h>
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
SDL_Texture* texture;
#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(unsigned int key){
switch (key)
{
case SDLK_RETURN:
key = KEY_ENTER;
break;
case SDLK_ESCAPE:
key = KEY_ESCAPE;
break;
case SDLK_LEFT:
key = KEY_LEFTARROW;
break;
case SDLK_RIGHT:
key = KEY_RIGHTARROW;
break;
case SDLK_UP:
key = KEY_UPARROW;
break;
case SDLK_DOWN:
key = KEY_DOWNARROW;
break;
case SDLK_LCTRL:
case SDLK_RCTRL:
key = KEY_FIRE;
break;
case SDLK_SPACE:
key = KEY_USE;
break;
case SDLK_LSHIFT:
case SDLK_RSHIFT:
key = KEY_RSHIFT;
break;
default:
key = tolower(key);
break;
}
return key;
}
static void addKeyToQueue(int pressed, unsigned int keyCode){
unsigned char key = convertToDoomKey(keyCode);
unsigned short keyData = (pressed << 8) | key;
s_KeyQueue[s_KeyQueueWriteIndex] = keyData;
s_KeyQueueWriteIndex++;
s_KeyQueueWriteIndex %= KEYQUEUE_SIZE;
}
static void handleKeyInput(){
SDL_Event e;
while (SDL_PollEvent(&e)){
if (e.type == SDL_QUIT){
puts("Quit requested");
atexit(SDL_Quit);
exit(1);
}
if (e.type == SDL_KEYDOWN) {
//KeySym sym = XKeycodeToKeysym(s_Display, e.xkey.keycode, 0);
//printf("KeyPress:%d sym:%d\n", e.xkey.keycode, sym);
addKeyToQueue(1, e.key.keysym.sym);
} else if (e.type == SDL_KEYUP) {
//KeySym sym = XKeycodeToKeysym(s_Display, e.xkey.keycode, 0);
//printf("KeyRelease:%d sym:%d\n", e.xkey.keycode, sym);
addKeyToQueue(0, e.key.keysym.sym);
}
}
}
void DG_Init(){
window = SDL_CreateWindow("DOOM",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
DOOMGENERIC_RESX,
DOOMGENERIC_RESY,
SDL_WINDOW_SHOWN
);
// Setup renderer
renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);
// Clear winow
SDL_RenderClear( renderer );
// Render the rect to the screen
SDL_RenderPresent(renderer);
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB888, SDL_TEXTUREACCESS_TARGET, DOOMGENERIC_RESX, DOOMGENERIC_RESY);
}
void DG_DrawFrame()
{
SDL_UpdateTexture(texture, NULL, DG_ScreenBuffer, DOOMGENERIC_RESX*sizeof(uint32_t));
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
handleKeyInput();
}
void DG_SleepMs(uint32_t ms)
{
SDL_Delay(ms);
}
uint32_t DG_GetTicksMs()
{
return SDL_GetTicks();
}
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;
}
return 0;
}
void DG_SetWindowTitle(const char * title)
{
if (window != NULL){
SDL_SetWindowTitle(window, title);
}
}

BIN
screenshots/sdl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB