mirror of
https://github.com/id-Software/DOOM-iOS.git
synced 2024-11-10 06:31:53 +00:00
364 lines
8.2 KiB
C
364 lines
8.2 KiB
C
/*
|
|
* prboomInterface.c
|
|
* doom
|
|
*
|
|
* Created by John Carmack on 4/14/09.
|
|
* Copyright 2009 Id Software. All rights reserved.
|
|
*
|
|
* Stuff to get prboom to compile without SDL
|
|
*/
|
|
/*
|
|
|
|
Copyright (C) 2009 Id Software, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
#include "../doomiphone.h"
|
|
|
|
int desired_fullscreen;
|
|
int usejoystick;
|
|
int joyright;
|
|
int joyleft;
|
|
int joydown;
|
|
int joyup;
|
|
int gl_colorbuffer_bits;
|
|
int gl_depthbuffer_bits;
|
|
int snd_card;
|
|
int mus_card;
|
|
int endoom_mode;
|
|
int use_fullscreen;
|
|
int snd_samplerate;
|
|
int ms_to_next_tick;
|
|
int realtic_clock_rate;
|
|
|
|
|
|
/* I_SafeExit
|
|
* This function is called instead of exit() by functions that might be called
|
|
* during the exit process (i.e. after exit() has already been called)
|
|
* Prevent infinitely recursive exits -- killough
|
|
*
|
|
* JDC: we don't do any atexit() calls on iphone, so this shouldn't be necessary
|
|
*/
|
|
void I_SafeExit(int rc) {
|
|
static int has_exited;
|
|
if (!has_exited) {
|
|
has_exited=rc ? 2 : 1;
|
|
exit(rc);
|
|
}
|
|
}
|
|
|
|
void I_uSleep( unsigned long usec ) {
|
|
usleep( usec );
|
|
}
|
|
|
|
/*
|
|
* HasTrailingSlash
|
|
*
|
|
* cphipps - simple test for trailing slash on dir names
|
|
*/
|
|
|
|
boolean HasTrailingSlash(const char* dn)
|
|
{
|
|
return ( (dn[strlen(dn)-1] == '/') );
|
|
}
|
|
|
|
char* I_FindFile(const char* wfname, const char* ext)
|
|
{
|
|
char *p = malloc( 1024 );
|
|
|
|
sprintf( p, "%s/base/%s", SysIphoneGetAppDir(), wfname );
|
|
if (access(p,F_OK))
|
|
strcat(p, ext); // try adding the extension
|
|
if (!access(p,F_OK)) {
|
|
lprintf(LO_INFO, " found %s\n", p);
|
|
return p;
|
|
}
|
|
free( p );
|
|
return NULL;
|
|
#if 0
|
|
// lookup table of directories to search
|
|
static const struct {
|
|
const char *dir; // directory
|
|
const char *sub; // subdirectory
|
|
const char *env; // environment variable
|
|
const char *(*func)(void); // for I_DoomExeDir
|
|
} search[] = {
|
|
{NULL}, // current working directory
|
|
{NULL, NULL, "DOOMWADDIR"}, // run-time $DOOMWADDIR
|
|
{DOOMWADDIR}, // build-time configured DOOMWADDIR
|
|
{NULL, "doom", "HOME"}, // ~/doom
|
|
{NULL, NULL, "HOME"}, // ~
|
|
{NULL, NULL, NULL, I_DoomExeDir}, // config directory
|
|
{"/usr/local/share/games/doom"},
|
|
{"/usr/share/games/doom"},
|
|
{"/usr/local/share/doom"},
|
|
{"/usr/share/doom"},
|
|
};
|
|
|
|
int i;
|
|
/* Precalculate a length we will need in the loop */
|
|
size_t pl = strlen(wfname) + strlen(ext) + 4;
|
|
|
|
for (i = 0; i < sizeof(search)/sizeof(*search); i++) {
|
|
char * p;
|
|
const char * d = NULL;
|
|
const char * s = NULL;
|
|
/* Each entry in the switch sets d to the directory to look in,
|
|
* and optionally s to a subdirectory of d */
|
|
// switch replaced with lookup table
|
|
if (search[i].env) {
|
|
if (!(d = getenv(search[i].env)))
|
|
continue;
|
|
} else if (search[i].func)
|
|
d = search[i].func();
|
|
else
|
|
d = search[i].dir;
|
|
s = search[i].sub;
|
|
|
|
p = malloc((d ? strlen(d) : 0) + (s ? strlen(s) : 0) + pl);
|
|
sprintf(p, "%s%s%s%s%s", d ? d : "", (d && !HasTrailingSlash(d)) ? "/" : "",
|
|
s ? s : "", (s && !HasTrailingSlash(s)) ? "/" : "",
|
|
wfname);
|
|
|
|
if (access(p,F_OK))
|
|
strcat(p, ext);
|
|
if (!access(p,F_OK)) {
|
|
lprintf(LO_INFO, " found %s\n", p);
|
|
return p;
|
|
}
|
|
free(p);
|
|
}
|
|
|
|
return NULL;
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
boolean I_StartDisplay(void) {
|
|
return true;
|
|
}
|
|
|
|
void I_EndDisplay(void) {}
|
|
int I_GetTime_RealTime(void) { return 0; }
|
|
fixed_t I_GetTimeFrac (void) { return 0; }
|
|
void I_GetTime_SaveMS(void) {}
|
|
unsigned long I_GetRandomTimeSeed(void) { return 0; }
|
|
|
|
//const char* I_GetVersionString(char* buf, size_t sz);
|
|
//const char* I_SigString(char* buf, size_t sz, int signum);
|
|
|
|
const char *I_DoomExeDir(void) { return SysIphoneGetAppDir(); }
|
|
|
|
//void I_SetAffinityMask(void);
|
|
|
|
|
|
/*
|
|
* I_Read
|
|
*
|
|
* cph 2001/11/18 - wrapper for read(2) which handles partial reads and aborts
|
|
* on error.
|
|
*/
|
|
void I_Read(int fd, void* vbuf, size_t sz)
|
|
{
|
|
unsigned char* buf = vbuf;
|
|
|
|
while (sz) {
|
|
int rc = read(fd,buf,sz);
|
|
if (rc <= 0) {
|
|
I_Error("I_Read: read failed: %s", rc ? strerror(errno) : "EOF");
|
|
}
|
|
sz -= rc; buf += rc;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* I_Filelength
|
|
*
|
|
* Return length of an open file.
|
|
*/
|
|
|
|
int I_Filelength(int handle)
|
|
{
|
|
struct stat fileinfo;
|
|
if (fstat(handle,&fileinfo) == -1)
|
|
I_Error("I_Filelength: %s",strerror(errno));
|
|
return fileinfo.st_size;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// MUSIC I/O
|
|
//
|
|
void I_InitMusic(void) {}
|
|
void I_ShutdownMusic(void) {}
|
|
|
|
void I_UpdateMusic(void) {}
|
|
|
|
// Volume.
|
|
void I_SetMusicVolume(int volume) {}
|
|
|
|
// PAUSE game handling.
|
|
void I_PauseSong(int handle) {}
|
|
void I_ResumeSong(int handle) {}
|
|
|
|
// Registers a song handle to song data.
|
|
int I_RegisterSong(const void *data, size_t len) {
|
|
return 0;
|
|
}
|
|
|
|
// cournia - tries to load a music file
|
|
int I_RegisterMusic( const char* filename, musicinfo_t *music ) {
|
|
return 0;
|
|
}
|
|
|
|
// Called by anything that wishes to start music.
|
|
// plays a song, and when the song is done,
|
|
// starts playing it again in an endless loop.
|
|
// Horrible thing to do, considering.
|
|
void I_PlaySong(int handle, int looping) {
|
|
}
|
|
|
|
// Stops a song over 3 seconds.
|
|
void I_StopSong(int handle) {
|
|
}
|
|
|
|
// See above (register), then think backwards
|
|
void I_UnRegisterSong(int handle) {
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void I_PreInitGraphics(void){}
|
|
void I_CalculateRes(unsigned int width, unsigned int height){}
|
|
void I_ShutdownGraphics(void){}
|
|
void I_SetPalette(int pal){}
|
|
void I_UpdateNoBlit (void){}
|
|
void I_FinishUpdate (void){}
|
|
int I_ScreenShot (const char *fname){return 0;}
|
|
|
|
|
|
// CPhipps -
|
|
// I_SetRes
|
|
// Sets the screen resolution
|
|
void I_SetRes(void)
|
|
{
|
|
int i;
|
|
|
|
I_CalculateRes(SCREENWIDTH, SCREENHEIGHT);
|
|
|
|
// set first three to standard values
|
|
for (i=0; i<3; i++) {
|
|
screens[i].width = SCREENWIDTH;
|
|
screens[i].height = SCREENHEIGHT;
|
|
screens[i].byte_pitch = SCREENPITCH;
|
|
screens[i].short_pitch = SCREENPITCH / V_GetModePixelDepth(VID_MODE16);
|
|
screens[i].int_pitch = SCREENPITCH / V_GetModePixelDepth(VID_MODE32);
|
|
}
|
|
|
|
// statusbar
|
|
screens[4].width = SCREENWIDTH;
|
|
screens[4].height = (ST_SCALED_HEIGHT+1);
|
|
screens[4].byte_pitch = SCREENPITCH;
|
|
screens[4].short_pitch = SCREENPITCH / V_GetModePixelDepth(VID_MODE16);
|
|
screens[4].int_pitch = SCREENPITCH / V_GetModePixelDepth(VID_MODE32);
|
|
|
|
lprintf(LO_INFO,"I_SetRes: Using resolution %dx%d\n", SCREENWIDTH, SCREENHEIGHT);
|
|
}
|
|
|
|
void I_UpdateVideoMode(void)
|
|
{
|
|
lprintf(LO_INFO, "I_UpdateVideoMode: %dx%d\n", SCREENWIDTH, SCREENHEIGHT );
|
|
|
|
V_InitMode(VID_MODEGL);
|
|
I_SetRes();
|
|
#if 0
|
|
screens[0].not_on_heap = true;
|
|
screens[0].data = NULL;
|
|
screens[0].byte_pitch = screen->pitch;
|
|
screens[0].short_pitch = screen->pitch / V_GetModePixelDepth(VID_MODE16);
|
|
screens[0].int_pitch = screen->pitch / V_GetModePixelDepth(VID_MODE32);
|
|
#endif
|
|
|
|
V_AllocScreens();
|
|
|
|
R_InitBuffer(SCREENWIDTH, SCREENHEIGHT);
|
|
gld_Init(SCREENWIDTH, SCREENHEIGHT);
|
|
}
|
|
|
|
void I_InitGraphics(void)
|
|
{
|
|
char titlebuffer[2048];
|
|
static int firsttime=1;
|
|
|
|
SCREENWIDTH = 480;
|
|
SCREENHEIGHT = 320;
|
|
|
|
if (firsttime)
|
|
{
|
|
firsttime = 0;
|
|
|
|
atexit(I_ShutdownGraphics);
|
|
lprintf(LO_INFO, "I_InitGraphics: %dx%d\n", SCREENWIDTH, SCREENHEIGHT);
|
|
|
|
/* Set the video mode */
|
|
I_UpdateVideoMode();
|
|
|
|
/* Setup the window title */
|
|
strcpy(titlebuffer,PACKAGE);
|
|
strcat(titlebuffer," ");
|
|
strcat(titlebuffer,VERSION);
|
|
// SDL_WM_SetCaption(titlebuffer, titlebuffer);
|
|
|
|
/* Initialize the input system */
|
|
// I_InitInputs();
|
|
}
|
|
}
|
|
|
|
|
|
/* I_StartTic
|
|
* Called by D_DoomLoop,
|
|
* called before processing each tic in a frame.
|
|
* Quick syncronous operations are performed here.
|
|
* Can call D_PostEvent.
|
|
*/
|
|
void I_StartTic (void){}
|
|
|
|
/* I_StartFrame
|
|
* Called by D_DoomLoop,
|
|
* called before processing any tics in a frame
|
|
* (just after displaying a frame).
|
|
* Time consuming syncronous operations
|
|
* are performed here (joystick reading).
|
|
* Can call D_PostEvent.
|
|
*/
|
|
|
|
void I_StartFrame (void){}
|
|
|
|
|
|
void I_Init(){}
|
|
|
|
unsigned int SDL_GetTicks() { return 0; };
|
|
|
|
int (*I_GetTime)(void) = I_GetTime_RealTime;
|
|
|