Initial commit

This commit is contained in:
Shinovon 2026-04-22 07:30:27 +05:00
commit 77cdaaf97e
827 changed files with 418745 additions and 0 deletions

425
src/skel/crossplatform.cpp Normal file
View file

@ -0,0 +1,425 @@
#include "common.h"
#include "crossplatform.h"
// Codes compatible with Windows and Linux
#ifndef _WIN32
// For internal use
// wMilliseconds is not needed
void tmToSystemTime(const tm *tm, SYSTEMTIME *out) {
out->wYear = tm->tm_year + 1900;
out->wMonth = tm->tm_mon + 1;
out->wDayOfWeek = tm->tm_wday;
out->wDay = tm->tm_mday;
out->wHour = tm->tm_hour;
out->wMinute = tm->tm_min;
out->wSecond = tm->tm_sec;
}
void GetLocalTime_CP(SYSTEMTIME *out) {
time_t timestamp = time(nil);
tm *localTm = localtime(&timestamp);
tmToSystemTime(localTm, out);
}
#endif
// Compatible with Linux/POSIX and MinGW on Windows
#ifndef _WIN32
HANDLE FindFirstFile(const char* pathname, WIN32_FIND_DATA* firstfile) {
char pathCopy[MAX_PATH];
strcpy(pathCopy, pathname);
char *folder = strtok(pathCopy, "*");
char *extension = strtok(NULL, "*");
// because I remember like strtok might not return NULL for last delimiter
if (extension && extension - folder == strlen(pathname))
extension = nil;
// Case-sensitivity and backslashes...
// Will be freed at the bottom
char *realFolder = casepath(folder);
if (realFolder) {
folder = realFolder;
}
strncpy(firstfile->folder, folder, sizeof(firstfile->folder));
if (extension)
strncpy(firstfile->extension, extension, sizeof(firstfile->extension));
else
firstfile->extension[0] = '\0';
if (realFolder)
free(realFolder);
HANDLE d;
if ((d = (HANDLE)opendir(firstfile->folder)) == NULL || !FindNextFile(d, firstfile))
return NULL;
return d;
}
bool FindNextFile(HANDLE d, WIN32_FIND_DATA* finddata) {
dirent *file;
static struct stat fileStats;
static char path[PATH_MAX], relativepath[NAME_MAX + sizeof(finddata->folder) + 1];
int extensionLen = strlen(finddata->extension);
while ((file = readdir((DIR*)d)) != NULL) {
// We only want "DT_REG"ular Files, but reportedly some FS and OSes gives DT_UNKNOWN as type.
if ((file->d_type == DT_UNKNOWN || file->d_type == DT_REG || file->d_type == DT_LNK) &&
(extensionLen == 0 || strncasecmp(&file->d_name[strlen(file->d_name) - extensionLen], finddata->extension, extensionLen) == 0)) {
sprintf(relativepath, "%s/%s", finddata->folder, file->d_name);
realpath(relativepath, path);
stat(path, &fileStats);
strncpy(finddata->cFileName, file->d_name, sizeof(finddata->cFileName));
finddata->ftLastWriteTime = fileStats.st_mtime;
return true;
}
}
return false;
}
void GetDateFormat(int unused1, int unused2, SYSTEMTIME* in, int unused3, char* out, int size) {
tm linuxTime;
linuxTime.tm_year = in->wYear - 1900;
linuxTime.tm_mon = in->wMonth - 1;
linuxTime.tm_wday = in->wDayOfWeek;
linuxTime.tm_mday = in->wDay;
linuxTime.tm_hour = in->wHour;
linuxTime.tm_min = in->wMinute;
linuxTime.tm_sec = in->wSecond;
strftime(out, size, nl_langinfo(D_FMT), &linuxTime);
}
void FileTimeToSystemTime(time_t* writeTime, SYSTEMTIME* out) {
tm *ptm = gmtime(writeTime);
tmToSystemTime(ptm, out);
}
#endif
// Because wchar length differs between platforms.
wchar*
AllocUnicode(const char* src)
{
wchar *dst = (wchar*)malloc(strlen(src)*2 + 2);
wchar *i = dst;
while((*i++ = (unsigned char)*src++) != '\0');
return dst;
}
// Funcs/features from Windows that we need on other platforms
#ifndef _WIN32
char *strupr(char *s) {
char* tmp = s;
for (;*tmp;++tmp) {
*tmp = toupper((unsigned char) *tmp);
}
return s;
}
char *strlwr(char *s) {
char* tmp = s;
for (;*tmp;++tmp) {
*tmp = tolower((unsigned char) *tmp);
}
return s;
}
char *trim(char *s) {
char *ptr;
if (!s)
return NULL; // handle NULL string
if (!*s)
return s; // handle empty string
for (ptr = s + strlen(s) - 1; (ptr >= s) && isspace(*ptr); --ptr);
ptr[1] = '\0';
return s;
}
FILE* _fcaseopen(char const* filename, char const* mode)
{
FILE* result;
char* real = casepath(filename);
if (!real)
result = fopen(filename, mode);
else {
result = fopen(real, mode);
free(real);
}
return result;
}
int _caserename(const char *old_filename, const char *new_filename)
{
int result;
char *real_old = casepath(old_filename);
char *real_new = casepath(new_filename);
// hack so we don't even try to rename it to new_filename if it already exists
if (!real_new) {
free(real_old);
return -1;
}
if (!real_old)
result = rename(old_filename, real_new);
else
result = rename(real_old, real_new);
free(real_old);
free(real_new);
return result;
}
// Case-insensitivity on linux (from https://github.com/OneSadCookie/fcaseopen)
// Returned string should freed manually (if exists)
char* casepath(char const* path, bool checkPathFirst)
{
if (checkPathFirst && access(path, F_OK) != -1) {
// File path is correct
return nil;
}
size_t l = strlen(path);
char* p = (char*)alloca(l + 1);
char* out = (char*)malloc(l + 3); // for extra ./
strcpy(p, path);
// my addon: linux doesn't handle filenames with spaces at the end nicely
p = trim(p);
size_t rl = 0;
DIR* d;
char* c;
#if defined(__SWITCH__) || defined(PSP2)
if( (c = strstr(p, ":/")) != NULL) // scheme used by some environments, eg. switch, vita
{
size_t deviceNameOffset = c - p + 3;
char* deviceNamePath = (char*)alloca(deviceNameOffset + 1);
strlcpy(deviceNamePath, p, deviceNameOffset);
deviceNamePath[deviceNameOffset] = 0;
d = opendir(deviceNamePath);
p = c + 1;
}
else
#endif
if (p[0] == '/' || p[0] == '\\')
{
d = opendir("/");
}
else
{
d = opendir(".");
out[0] = '.';
out[1] = 0;
rl = 1;
}
bool cantProceed = false; // just convert slashes in what's left in string, don't correct case of letters(because we can't)
bool mayBeTrailingSlash = false;
while (c = strsep(&p, "/\\"))
{
// May be trailing slash(allow), slash at the start(avoid), or multiple slashes(avoid)
if (*c == '\0')
{
mayBeTrailingSlash = true;
continue;
} else {
mayBeTrailingSlash = false;
}
out[rl] = '/';
rl += 1;
out[rl] = 0;
if (cantProceed)
{
strcpy(out + rl, c);
rl += strlen(c);
continue;
}
struct dirent* e;
while (e = readdir(d))
{
if (strcasecmp(c, e->d_name) == 0)
{
strcpy(out + rl, e->d_name);
int reportedLen = (int)strlen(e->d_name);
rl += reportedLen;
assert(reportedLen == strlen(c) && "casepath: This is not good at all");
closedir(d);
d = opendir(out);
// Either it wasn't a folder, or permission error, I/O error etc.
if (!d) {
cantProceed = true;
}
break;
}
}
if (!e)
{
printf("casepath couldn't find dir/file \"%s\", full path was %s\n", c, path);
// No match, add original name and continue converting further slashes.
strcpy(out + rl, c);
rl += strlen(c);
cantProceed = true;
}
}
if (d) closedir(d);
if (mayBeTrailingSlash) {
out[rl] = '/'; rl += 1;
out[rl] = '\0';
}
if (rl > l + 2) {
printf("\n\ncasepath: Corrected path length is longer then original+2:\n\tOriginal: %s (%zu chars)\n\tCorrected: %s (%zu chars)\n\n", path, l, out, rl);
}
return out;
}
#endif
#ifdef __SWITCH__
/* Taken from glibc */
char *realpath(const char *name, char *resolved)
{
char *rpath, *dest = NULL;
const char *start, *end, *rpath_limit;
long int path_max;
/* As per Single Unix Specification V2 we must return an error if
either parameter is a null pointer. We extend this to allow
the RESOLVED parameter to be NULL in case the we are expected to
allocate the room for the return value. */
if (!name)
return NULL;
/* As per Single Unix Specification V2 we must return an error if
the name argument points to an empty string. */
if (name[0] == '\0')
return NULL;
#ifdef PATH_MAX
path_max = PATH_MAX;
#else
path_max = pathconf(name, _PC_PATH_MAX);
if (path_max <= 0)
path_max = 1024;
#endif
if (!resolved)
{
rpath = (char*)malloc(path_max);
if (!rpath)
return NULL;
}
else
rpath = resolved;
rpath_limit = rpath + path_max;
if (name[0] != '/')
{
if (!getcwd(rpath, path_max))
{
rpath[0] = '\0';
goto error;
}
dest = (char*)memchr(rpath, '\0', path_max);
}
else
{
rpath[0] = '/';
dest = rpath + 1;
}
for (start = end = name; *start; start = end)
{
/* Skip sequence of multiple path-separators. */
while (*start == '/')
++start;
/* Find end of path component. */
for (end = start; *end && *end != '/'; ++end)
/* Nothing. */;
if (end - start == 0)
break;
else if (end - start == 1 && start[0] == '.')
/* nothing */;
else if (end - start == 2 && start[0] == '.' && start[1] == '.')
{
/* Back up to previous component, ignore if at root already. */
if (dest > rpath + 1)
while ((--dest)[-1] != '/')
;
}
else
{
size_t new_size;
if (dest[-1] != '/')
*dest++ = '/';
if (dest + (end - start) >= rpath_limit)
{
ptrdiff_t dest_offset = dest - rpath;
char *new_rpath;
if (resolved)
{
if (dest > rpath + 1)
dest--;
*dest = '\0';
goto error;
}
new_size = rpath_limit - rpath;
if (end - start + 1 > path_max)
new_size += end - start + 1;
else
new_size += path_max;
new_rpath = (char *)realloc(rpath, new_size);
if (!new_rpath)
goto error;
rpath = new_rpath;
rpath_limit = rpath + new_size;
dest = rpath + dest_offset;
}
dest = (char*)memcpy(dest, start, end - start);
*dest = '\0';
}
}
if (dest > rpath + 1 && dest[-1] == '/')
--dest;
*dest = '\0';
return rpath;
error:
if (!resolved)
free(rpath);
return NULL;
}
ssize_t readlink (const char * __path, char * __buf, size_t __buflen)
{
errno = ENOSYS;
return -1;
}
#endif

184
src/skel/crossplatform.h Normal file
View file

@ -0,0 +1,184 @@
#include <time.h>
#include <limits.h>
// This is the common include for platform/renderer specific skeletons(glfw.cpp, win.cpp etc.) and using cross platform things (like Windows directories wrapper, platform specific global arrays etc.)
// Functions that's different on glfw and win but have same signature, should be located on platform.h.
enum eWinVersion
{
OS_WIN95 = 0,
OS_WIN98,
OS_WINNT,
OS_WIN2000,
OS_WINXP,
};
#ifdef _WIN32
// As long as WITHWINDOWS isn't defined / <Windows.h> isn't included, we only need type definitions so let's include <IntSafe.h>.
// NOTE: It's perfectly fine to include <Windows.h> here, but it can increase build size and time in *some* conditions, and maybe substantially in future if we'll use crossplatform.h more.
#ifndef _INC_WINDOWS
#ifndef __MWERKS__
#include <IntSafe.h>
#else
#include <Windows.h>
#endif
#endif
#if defined RW_D3D9 || defined RWLIBS
#include "win.h"
#endif
extern DWORD _dwOperatingSystemVersion;
#define fcaseopen fopen
#define caserename rename
#else
char *strupr(char *str);
char *strlwr(char *str);
enum {
LANG_OTHER,
LANG_GERMAN,
LANG_FRENCH,
LANG_ENGLISH,
LANG_ITALIAN,
LANG_SPANISH,
};
enum {
SUBLANG_OTHER,
SUBLANG_ENGLISH_AUS
};
extern long _dwOperatingSystemVersion;
char *casepath(char const *path, bool checkPathFirst = true);
FILE *_fcaseopen(char const *filename, char const *mode);
#define fcaseopen _fcaseopen
int _caserename(const char *old_filename, const char *new_filename);
#define caserename _caserename
#endif
#ifdef RW_GL3
typedef struct
{
GLFWwindow* window;
RwBool fullScreen;
RwV2d lastMousePos;
double mouseWheel; // glfw doesn't cache it
bool cursorIsInWindow;
RwInt8 joy1id;
RwInt8 joy2id;
}
psGlobalType;
#define PSGLOBAL(var) (((psGlobalType *)(RsGlobal.ps))->var)
void CapturePad(RwInt32 padID);
void joysChangeCB(int jid, int event);
#endif
#ifdef DETECT_JOYSTICK_MENU
extern char gSelectedJoystickName[128];
#endif
enum eGameState
{
GS_START_UP = 0,
GS_INIT_LOGO_MPEG,
GS_LOGO_MPEG,
GS_INIT_INTRO_MPEG,
GS_INTRO_MPEG,
GS_INIT_ONCE,
GS_INIT_FRONTEND,
GS_FRONTEND,
GS_INIT_PLAYING_GAME,
GS_PLAYING_GAME,
};
extern RwUInt32 gGameState;
RwBool IsForegroundApp();
#ifndef MAX_PATH
#if !defined _WIN32 || defined __MINGW32__
#define MAX_PATH PATH_MAX
#else
#define MAX_PATH 260
#endif
#endif
// Codes compatible with Windows and Linux
#ifndef _WIN32
#define DeleteFile unlink
// Needed for save games
struct SYSTEMTIME {
RwUInt16 wYear;
RwUInt16 wMonth;
RwUInt16 wDayOfWeek;
RwUInt16 wDay;
RwUInt16 wHour;
RwUInt16 wMinute;
RwUInt16 wSecond;
RwUInt16 wMilliseconds;
};
void GetLocalTime_CP(SYSTEMTIME* out);
#define GetLocalTime GetLocalTime_CP
#define OutputDebugString(s) re3_debug("[DBG-2]: %s\n",s)
#endif
// Compatible with Linux/POSIX and MinGW on Windows
#ifndef _WIN32
#include <iostream>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <langinfo.h>
#include <unistd.h>
typedef void* HANDLE;
#define INVALID_HANDLE_VALUE NULL
#define FindClose(h) \
do { \
if (h != nil) \
closedir((DIR*)h); \
} while(0)
#define LOCALE_USER_DEFAULT 0
#define DATE_SHORTDATE 0
struct WIN32_FIND_DATA {
char extension[32]; // for searching
char folder[MAX_PATH]; // for searching
char cFileName[256]; // because tSkinInfo has it 256
time_t ftLastWriteTime;
};
HANDLE FindFirstFile(const char*, WIN32_FIND_DATA*);
bool FindNextFile(HANDLE, WIN32_FIND_DATA*);
void FileTimeToSystemTime(time_t*, SYSTEMTIME*);
void GetDateFormat(int, int, SYSTEMTIME*, int, char*, int);
#endif
#ifdef __SWITCH__
// tweak glfw values for switch to match expected pc bindings
#ifdef GLFW_GAMEPAD_BUTTON_A
#undef GLFW_GAMEPAD_BUTTON_A
#endif
#define GLFW_GAMEPAD_BUTTON_A 1
#ifdef GLFW_GAMEPAD_BUTTON_B
#undef GLFW_GAMEPAD_BUTTON_B
#endif
#define GLFW_GAMEPAD_BUTTON_B 0
#ifdef GLFW_GAMEPAD_BUTTON_X
#undef GLFW_GAMEPAD_BUTTON_X
#endif
#define GLFW_GAMEPAD_BUTTON_X 3
#ifdef GLFW_GAMEPAD_BUTTON_Y
#undef GLFW_GAMEPAD_BUTTON_Y
#endif
#define GLFW_GAMEPAD_BUTTON_Y 2
#endif

831
src/skel/events.cpp Normal file
View file

@ -0,0 +1,831 @@
#include "common.h"
#include "Pad.h"
#include "ControllerConfig.h"
#include "Frontend.h"
#include "Camera.h"
#include "rwcore.h"
#include "skeleton.h"
#include "events.h"
/*
*****************************************************************************
*/
static RsEventStatus
HandleKeyDown(RsKeyStatus *keyStatus)
{
CPad *pad0 = CPad::GetPad(0);
CPad *pad1 = CPad::GetPad(1);
RwInt32 c = keyStatus->keyCharCode;
if ( c != rsNULL )
{
switch (c)
{
case rsESC:
{
CPad::TempKeyState.ESC = 255;
break;
}
case rsINS:
{
CPad::TempKeyState.INS = 255;
break;
}
case rsDEL:
{
CPad::TempKeyState.DEL = 255;
break;
}
case rsHOME:
{
CPad::TempKeyState.HOME = 255;
break;
}
case rsEND:
{
CPad::TempKeyState.END = 255;
break;
}
case rsPGUP:
{
CPad::TempKeyState.PGUP = 255;
break;
}
case rsPGDN:
{
CPad::TempKeyState.PGDN = 255;
break;
}
case rsUP:
{
CPad::TempKeyState.UP = 255;
break;
}
case rsDOWN:
{
CPad::TempKeyState.DOWN = 255;
break;
}
case rsLEFT:
{
CPad::TempKeyState.LEFT = 255;
break;
}
case rsRIGHT:
{
CPad::TempKeyState.RIGHT = 255;
break;
}
case rsNUMLOCK:
{
CPad::TempKeyState.NUMLOCK = 255;
break;
}
case rsPADDEL:
{
CPad::TempKeyState.DECIMAL = 255;
break;
}
case rsPADEND:
{
CPad::TempKeyState.NUM1 = 255;
break;
}
case rsPADDOWN:
{
CPad::TempKeyState.NUM2 = 255;
break;
}
case rsPADPGDN:
{
CPad::TempKeyState.NUM3 = 255;
break;
}
case rsPADLEFT:
{
CPad::TempKeyState.NUM4 = 255;
break;
}
case rsPAD5:
{
CPad::TempKeyState.NUM5 = 255;
break;
}
case rsPADRIGHT:
{
CPad::TempKeyState.NUM6 = 255;
break;
}
case rsPADHOME:
{
CPad::TempKeyState.NUM7 = 255;
break;
}
case rsPADUP:
{
CPad::TempKeyState.NUM8 = 255;
break;
}
case rsPADPGUP:
{
CPad::TempKeyState.NUM9 = 255;
break;
}
case rsPADINS:
{
CPad::TempKeyState.NUM0 = 255;
break;
}
case rsDIVIDE:
{
CPad::TempKeyState.DIV = 255;
break;
}
case rsTIMES:
{
CPad::TempKeyState.MUL = 255;
break;
}
case rsMINUS:
{
CPad::TempKeyState.SUB = 255;
break;
}
case rsPADENTER:
{
CPad::TempKeyState.ENTER = 255;
break;
}
case rsPLUS:
{
CPad::TempKeyState.ADD = 255;
break;
}
case rsENTER:
{
CPad::TempKeyState.EXTENTER = 255;
break;
}
case rsSCROLL:
{
CPad::TempKeyState.SCROLLLOCK = 255;
break;
}
case rsPAUSE:
{
CPad::TempKeyState.PAUSE = 255;
break;
}
case rsBACKSP:
{
CPad::TempKeyState.BACKSP = 255;
break;
}
case rsTAB:
{
CPad::TempKeyState.TAB = 255;
break;
}
case rsCAPSLK:
{
CPad::TempKeyState.CAPSLOCK = 255;
break;
}
case rsLSHIFT:
{
CPad::TempKeyState.LSHIFT = 255;
break;
}
case rsSHIFT:
{
CPad::TempKeyState.SHIFT = 255;
break;
}
case rsRSHIFT:
{
CPad::TempKeyState.RSHIFT = 255;
break;
}
case rsLCTRL:
{
CPad::TempKeyState.LCTRL = 255;
break;
}
case rsRCTRL:
{
CPad::TempKeyState.RCTRL = 255;
break;
}
case rsLALT:
{
CPad::TempKeyState.LALT = 255;
break;
}
case rsRALT:
{
CPad::TempKeyState.RALT = 255;
break;
}
case rsLWIN:
{
CPad::TempKeyState.LWIN = 255;
break;
}
case rsRWIN:
{
CPad::TempKeyState.RWIN = 255;
break;
}
case rsAPPS:
{
CPad::TempKeyState.APPS = 255;
break;
}
case rsF1:
case rsF2:
case rsF3:
case rsF4:
case rsF5:
case rsF6:
case rsF7:
case rsF8:
case rsF9:
case rsF10:
case rsF11:
case rsF12:
{
CPad::TempKeyState.F[c - rsF1] = 255;
break;
}
default:
{
if ( c < 255 )
{
CPad::TempKeyState.VK_KEYS[c] = 255;
pad0->AddToPCCheatString(c);
}
break;
}
}
if ( CPad::m_bMapPadOneToPadTwo )
{
if ( c == 'D' ) pad1->PCTempKeyState.LeftStickX = 128;
if ( c == 'A' ) pad1->PCTempKeyState.LeftStickX = -128;
if ( c == 'W' ) pad1->PCTempKeyState.LeftStickY = 128;
if ( c == 'S' ) pad1->PCTempKeyState.LeftStickY = -128;
if ( c == 'J' ) pad1->PCTempKeyState.RightStickX = 128;
if ( c == 'G' ) pad1->PCTempKeyState.RightStickX = -128;
if ( c == 'Y' ) pad1->PCTempKeyState.RightStickY = 128;
if ( c == 'H' ) pad1->PCTempKeyState.RightStickY = -128;
if ( c == 'Z' ) pad1->PCTempKeyState.LeftShoulder1 = 255;
if ( c == 'X' ) pad1->PCTempKeyState.LeftShoulder2 = 255;
if ( c == 'C' ) pad1->PCTempKeyState.RightShoulder1 = 255;
if ( c == 'V' ) pad1->PCTempKeyState.RightShoulder2 = 255;
if ( c == 'O' ) pad1->PCTempKeyState.DPadUp = 255;
if ( c == 'L' ) pad1->PCTempKeyState.DPadDown = 255;
if ( c == 'K' ) pad1->PCTempKeyState.DPadLeft = 255;
if ( c == ';' ) pad1->PCTempKeyState.DPadRight = 255;
if ( c == 'B' ) pad1->PCTempKeyState.Start = 255;
if ( c == 'N' ) pad1->PCTempKeyState.Select = 255;
if ( c == 'M' ) pad1->PCTempKeyState.Square = 255;
if ( c == ',' ) pad1->PCTempKeyState.Triangle = 255;
if ( c == '.' ) pad1->PCTempKeyState.Cross = 255;
if ( c == '/' ) pad1->PCTempKeyState.Circle = 255;
if ( c == rsRSHIFT ) pad1->PCTempKeyState.LeftShock = 255;
if ( c == rsRCTRL ) pad1->PCTempKeyState.RightShock = 255;
}
}
return rsEVENTPROCESSED;
}
static RsEventStatus
HandleKeyUp(RsKeyStatus *keyStatus)
{
CPad *pad0 = CPad::GetPad(0);
CPad *pad1 = CPad::GetPad(1);
RwInt32 c = keyStatus->keyCharCode;
if ( c != rsNULL )
{
switch (c)
{
case rsESC:
{
CPad::TempKeyState.ESC = 0;
break;
}
case rsINS:
{
CPad::TempKeyState.INS = 0;
break;
}
case rsDEL:
{
CPad::TempKeyState.DEL = 0;
break;
}
case rsHOME:
{
CPad::TempKeyState.HOME = 0;
break;
}
case rsEND:
{
CPad::TempKeyState.END = 0;
break;
}
case rsPGUP:
{
CPad::TempKeyState.PGUP = 0;
break;
}
case rsPGDN:
{
CPad::TempKeyState.PGDN = 0;
break;
}
case rsUP:
{
CPad::TempKeyState.UP = 0;
break;
}
case rsDOWN:
{
CPad::TempKeyState.DOWN = 0;
break;
}
case rsLEFT:
{
CPad::TempKeyState.LEFT = 0;
break;
}
case rsRIGHT:
{
CPad::TempKeyState.RIGHT = 0;
break;
}
case rsNUMLOCK:
{
CPad::TempKeyState.NUMLOCK = 0;
break;
}
case rsPADDEL:
{
CPad::TempKeyState.DECIMAL = 0;
break;
}
case rsPADEND:
{
CPad::TempKeyState.NUM1 = 0;
break;
}
case rsPADDOWN:
{
CPad::TempKeyState.NUM2 = 0;
break;
}
case rsPADPGDN:
{
CPad::TempKeyState.NUM3 = 0;
break;
}
case rsPADLEFT:
{
CPad::TempKeyState.NUM4 = 0;
break;
}
case rsPAD5:
{
CPad::TempKeyState.NUM5 = 0;
break;
}
case rsPADRIGHT:
{
CPad::TempKeyState.NUM6 = 0;
break;
}
case rsPADHOME:
{
CPad::TempKeyState.NUM7 = 0;
break;
}
case rsPADUP:
{
CPad::TempKeyState.NUM8 = 0;
break;
}
case rsPADPGUP:
{
CPad::TempKeyState.NUM9 = 0;
break;
}
case rsPADINS:
{
CPad::TempKeyState.NUM0 = 0;
break;
}
case rsDIVIDE:
{
CPad::TempKeyState.DIV = 0;
break;
}
case rsTIMES:
{
CPad::TempKeyState.MUL = 0;
break;
}
case rsMINUS:
{
CPad::TempKeyState.SUB = 0;
break;
}
case rsPADENTER:
{
CPad::TempKeyState.ENTER = 0;
break;
}
case rsPLUS:
{
CPad::TempKeyState.ADD = 0;
break;
}
case rsENTER:
{
CPad::TempKeyState.EXTENTER = 0;
break;
}
case rsSCROLL:
{
CPad::TempKeyState.SCROLLLOCK = 0;
break;
}
case rsPAUSE:
{
CPad::TempKeyState.PAUSE = 0;
break;
}
case rsBACKSP:
{
CPad::TempKeyState.BACKSP = 0;
break;
}
case rsTAB:
{
CPad::TempKeyState.TAB = 0;
break;
}
case rsCAPSLK:
{
CPad::TempKeyState.CAPSLOCK = 0;
break;
}
case rsLSHIFT:
{
CPad::TempKeyState.LSHIFT = 0;
break;
}
case rsSHIFT:
{
CPad::TempKeyState.SHIFT = 0;
break;
}
case rsRSHIFT:
{
CPad::TempKeyState.RSHIFT = 0;
break;
}
case rsLCTRL:
{
CPad::TempKeyState.LCTRL = 0;
break;
}
case rsRCTRL:
{
CPad::TempKeyState.RCTRL = 0;
break;
}
case rsLALT:
{
CPad::TempKeyState.LALT = 0;
break;
}
case rsRALT:
{
CPad::TempKeyState.RALT = 0;
break;
}
case rsLWIN:
{
CPad::TempKeyState.LWIN = 0;
break;
}
case rsRWIN:
{
CPad::TempKeyState.RWIN = 0;
break;
}
case rsAPPS:
{
CPad::TempKeyState.APPS = 0;
break;
}
case rsF1:
case rsF2:
case rsF3:
case rsF4:
case rsF5:
case rsF6:
case rsF7:
case rsF8:
case rsF9:
case rsF10:
case rsF11:
case rsF12:
{
CPad::TempKeyState.F[c - rsF1] = 0;
break;
}
default:
{
if ( c < 255 )
{
CPad::TempKeyState.VK_KEYS[c] = 0;
}
break;
}
}
if ( CPad::m_bMapPadOneToPadTwo )
{
if ( c == 'D' ) pad1->PCTempKeyState.LeftStickX = 0;
if ( c == 'A' ) pad1->PCTempKeyState.LeftStickX = 0;
if ( c == 'W' ) pad1->PCTempKeyState.LeftStickY = 0;
if ( c == 'S' ) pad1->PCTempKeyState.LeftStickY = 0;
if ( c == 'J' ) pad1->PCTempKeyState.RightStickX = 0;
if ( c == 'G' ) pad1->PCTempKeyState.RightStickX = 0;
if ( c == 'Y' ) pad1->PCTempKeyState.RightStickY = 0;
if ( c == 'H' ) pad1->PCTempKeyState.RightStickY = 0;
if ( c == 'Z' ) pad1->PCTempKeyState.LeftShoulder1 = 0;
if ( c == 'X' ) pad1->PCTempKeyState.LeftShoulder2 = 0;
if ( c == 'C' ) pad1->PCTempKeyState.RightShoulder1 = 0;
if ( c == 'V' ) pad1->PCTempKeyState.RightShoulder2 = 0;
if ( c == 'O' ) pad1->PCTempKeyState.DPadUp = 0;
if ( c == 'L' ) pad1->PCTempKeyState.DPadDown = 0;
if ( c == 'K' ) pad1->PCTempKeyState.DPadLeft = 0;
if ( c == ';' ) pad1->PCTempKeyState.DPadRight = 0;
if ( c == 'B' ) pad1->PCTempKeyState.Start = 0;
if ( c == 'N' ) pad1->PCTempKeyState.Select = 0;
if ( c == 'M' ) pad1->PCTempKeyState.Square = 0;
if ( c == ',' ) pad1->PCTempKeyState.Triangle = 0;
if ( c == '.' ) pad1->PCTempKeyState.Cross = 0;
if ( c == '/' ) pad1->PCTempKeyState.Circle = 0;
if ( c == rsRSHIFT ) pad1->PCTempKeyState.LeftShock = 0;
if ( c == rsRCTRL ) pad1->PCTempKeyState.RightShock = 0;
}
}
return rsEVENTPROCESSED;
}
/*
*****************************************************************************
*/
static RsEventStatus
KeyboardHandler(RsEvent event, void *param)
{
/*
* ...then the application events, if necessary...
*/
switch( event )
{
case rsKEYDOWN:
{
return HandleKeyDown((RsKeyStatus *)param);
}
case rsKEYUP:
{
return HandleKeyUp((RsKeyStatus *)param);
}
default:
{
return rsEVENTNOTPROCESSED;
}
}
}
/*
*****************************************************************************
*/
static RsEventStatus
HandlePadButtonDown(RsPadButtonStatus *padButtonStatus)
{
bool bPadTwo = false;
int32 padNumber = padButtonStatus->padID;
CPad *pad = CPad::GetPad(padNumber);
if ( CPad::m_bMapPadOneToPadTwo )
padNumber = 1;
if ( padNumber == 1 )
bPadTwo = true;
ControlsManager.UpdateJoyButtonState(padNumber);
for ( int32 i = 0; i < _TODOCONST(16); i++ )
{
RsPadButtons btn = rsPADNULL;
if ( ControlsManager.m_aButtonStates[i] == TRUE )
btn = (RsPadButtons)(i + 1);
if ( FrontEndMenuManager.m_bMenuActive || bPadTwo )
ControlsManager.UpdateJoyInConfigMenus_ButtonDown(btn, padNumber);
else
ControlsManager.AffectControllerStateOn_ButtonDown(btn, JOYSTICK);
}
return rsEVENTPROCESSED;
}
/*
*****************************************************************************
*/
static RsEventStatus
HandlePadButtonUp(RsPadButtonStatus *padButtonStatus)
{
bool bPadTwo = false;
int32 padNumber = padButtonStatus->padID;
CPad *pad = CPad::GetPad(padNumber);
if ( CPad::m_bMapPadOneToPadTwo )
padNumber = 1;
if ( padNumber == 1 )
bPadTwo = true;
bool bCam = false;
int16 mode = TheCamera.Cams[TheCamera.ActiveCam].Mode;
if ( mode == CCam::MODE_FLYBY || mode == CCam::MODE_FIXED )
bCam = true;
ControlsManager.UpdateJoyButtonState(padNumber);
for ( int32 i = 1; i < _TODOCONST(16); i++ )
{
RsPadButtons btn = rsPADNULL;
if ( ControlsManager.m_aButtonStates[i] == FALSE )
btn = (RsPadButtons)(i + 1); // bug ?, cycle begins from 1(not zero), 1+1==2==rsPADBUTTON2, so we skip rsPADBUTTON1, right ?
if ( FrontEndMenuManager.m_bMenuActive || bPadTwo || bCam )
ControlsManager.UpdateJoyInConfigMenus_ButtonUp(btn, padNumber);
else
ControlsManager.AffectControllerStateOn_ButtonUp(btn, JOYSTICK);
}
return rsEVENTPROCESSED;
}
/*
*****************************************************************************
*/
static RsEventStatus
PadHandler(RsEvent event, void *param)
{
switch( event )
{
case rsPADBUTTONDOWN:
{
return HandlePadButtonDown((RsPadButtonStatus *)param);
}
case rsPADBUTTONUP:
{
return HandlePadButtonUp((RsPadButtonStatus *)param);
}
default:
{
return rsEVENTNOTPROCESSED;
}
}
}
/*
*****************************************************************************
*/
RwBool
AttachInputDevices(void)
{
#ifndef IGNORE_MOUSE_KEYBOARD
RsInputDeviceAttach(rsKEYBOARD, KeyboardHandler);
#endif
RsInputDeviceAttach(rsPAD, PadHandler);
return TRUE;
}

7
src/skel/events.h Normal file
View file

@ -0,0 +1,7 @@
#ifndef EVENTS_H
#define EVENTS_H
#include <rwcore.h>
#include "skeleton.h"
#endif /* EVENTS_H */

2572
src/skel/glfw/glfw.cpp Normal file

File diff suppressed because it is too large Load diff

59
src/skel/platform.h Normal file
View file

@ -0,0 +1,59 @@
#ifndef PLATFORM_H
#define PLATFORM_H
// Functions that's different on glfw/win etc. but have same signature (but if a function only used in win.cpp you can keep in win.h)
#include "rwcore.h"
#include "skeleton.h"
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
#ifdef _WIN32
extern RwUInt32 psTimer(void);
#else
extern double psTimer(void);
#endif
extern RwBool psInitialize(void);
extern void psTerminate(void);
extern void psCameraShowRaster(RwCamera *camera);
extern RwBool psCameraBeginUpdate(RwCamera *camera);
extern RwImage *psGrabScreen(RwCamera *camera);
extern void psMouseSetPos(RwV2d *pos);
extern RwBool psSelectDevice();
extern RwMemoryFunctions *psGetMemoryFunctions(void);
/* install the platform specific file system */
extern RwBool psInstallFileSystem(void);
/* Handle native texture support */
extern RwBool psNativeTextureSupport(void);
extern void _InputTranslateShiftKeyUpDown(RsKeyCodes* rs);
extern long _InputInitialiseMouse(); // returns HRESULT on Windows actually
extern void _InputInitialiseJoys();
extern void HandleExit();
extern void _psSelectScreenVM(RwInt32 videoMode);
extern void InitialiseLanguage();
extern RwBool _psSetVideoMode(RwInt32 subSystem, RwInt32 videoMode);
extern RwChar** _psGetVideoModeList();
extern RwInt32 _psGetNumVideModes();
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* PLATFORM_H */

432
src/skel/skeleton.cpp Normal file
View file

@ -0,0 +1,432 @@
#include "common.h"
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#include "rwcore.h"
#include "skeleton.h"
#include "platform.h"
#include "main.h"
#include "MemoryHeap.h"
static RwBool DefaultVideoMode = TRUE;
RsGlobalType RsGlobal;
#ifdef _WIN32
RwUInt32
#else
double
#endif
RsTimer(void)
{
return psTimer();
}
/*
*****************************************************************************
*/
void
RsCameraShowRaster(RwCamera * camera)
{
psCameraShowRaster(camera);
return;
}
/*
*****************************************************************************
*/
RwBool
RsCameraBeginUpdate(RwCamera * camera)
{
return psCameraBeginUpdate(camera);
}
/*
*****************************************************************************
*/
RwImage*
RsGrabScreen(RwCamera *camera)
{
return psGrabScreen(camera);
}
/*
*****************************************************************************
*/
RwBool
RsRegisterImageLoader(void)
{
return TRUE;
}
/*
*****************************************************************************
*/
static RwBool
RsSetDebug(void)
{
return TRUE;
}
/*
*****************************************************************************
*/
void
RsMouseSetPos(RwV2d * pos)
{
psMouseSetPos(pos);
return;
}
/*
*****************************************************************************
*/
RwBool
RsSelectDevice(void)
{
return psSelectDevice();
}
/*
*****************************************************************************
*/
RwBool
RsInputDeviceAttach(RsInputDeviceType inputDevice,
RsInputEventHandler inputEventHandler)
{
switch (inputDevice)
{
case rsKEYBOARD:
{
RsGlobal.keyboard.inputEventHandler = inputEventHandler;
RsGlobal.keyboard.used = TRUE;
break;
}
case rsMOUSE:
{
RsGlobal.mouse.inputEventHandler = inputEventHandler;
RsGlobal.mouse.used = TRUE;
break;
}
case rsPAD:
{
RsGlobal.pad.inputEventHandler = inputEventHandler;
RsGlobal.pad.used = TRUE;
break;
}
default:
{
return FALSE;
}
}
return TRUE;
}
/*
*****************************************************************************
*/
static RwBool
rsCommandLine(RwChar *arg)
{
RsEventHandler(rsFILELOAD, arg);
return TRUE;
}
/*
*****************************************************************************
*/
static RwBool
rsPreInitCommandLine(RwChar *arg)
{
if( !strcmp(arg, RWSTRING("-vms")) )
{
DefaultVideoMode = FALSE;
return TRUE;
}
#ifndef MASTER
if (!strcmp(arg, RWSTRING("-animviewer")))
{
gbModelViewer = TRUE;
return TRUE;
}
#endif
return FALSE;
}
/*
*****************************************************************************
*/
RsEventStatus
RsKeyboardEventHandler(RsEvent event, void *param)
{
if (RsGlobal.keyboard.used)
{
return RsGlobal.keyboard.inputEventHandler(event, param);
}
return rsEVENTNOTPROCESSED;
}
/*
*****************************************************************************
*/
RsEventStatus
RsPadEventHandler(RsEvent event, void *param)
{
if (RsGlobal.pad.used)
{
return RsGlobal.pad.inputEventHandler(event, param);
}
return rsEVENTNOTPROCESSED;
}
/*
*****************************************************************************
*/
RsEventStatus
RsEventHandler(RsEvent event, void *param)
{
RsEventStatus result;
RsEventStatus es;
/*
* Give the application an opportunity to override any events...
*/
es = AppEventHandler(event, param);
/*
* We never allow the app to replace the quit behaviour,
* only to intercept...
*/
if (event == rsQUITAPP)
{
/*
* Set the flag which causes the event loop to exit...
*/
RsGlobal.quit = TRUE;
}
if (es == rsEVENTNOTPROCESSED)
{
switch (event)
{
case rsSELECTDEVICE:
result =
(RsSelectDevice()? rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsCOMMANDLINE:
result = (rsCommandLine((RwChar *) param) ?
rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsPREINITCOMMANDLINE:
result = (rsPreInitCommandLine((RwChar *) param) ?
rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsINITDEBUG:
result =
(RsSetDebug()? rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsREGISTERIMAGELOADER:
result = (RsRegisterImageLoader()?
rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsRWTERMINATE:
RsRwTerminate();
result = (rsEVENTPROCESSED);
break;
case rsRWINITIALIZE:
result = (RsRwInitialize(param) ?
rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsTERMINATE:
RsTerminate();
result = (rsEVENTPROCESSED);
break;
case rsINITIALIZE:
result =
(RsInitialize()? rsEVENTPROCESSED : rsEVENTERROR);
break;
default:
result = (es);
break;
}
}
else
{
result = (es);
}
return result;
}
/*
*****************************************************************************
*/
void
RsRwTerminate(void)
{
/* Close RenderWare */
RwEngineStop();
RwEngineClose();
RwEngineTerm();
return;
}
/*
*****************************************************************************
*/
RwBool
RsRwInitialize(void *displayID)
{
RwEngineOpenParams openParams;
PUSH_MEMID(MEMID_RENDER); // NB: not popped on failed return
/*
* Start RenderWare...
*/
if (!RwEngineInit(psGetMemoryFunctions(), 0, rsRESOURCESDEFAULTARENASIZE))
{
return (FALSE);
}
/*
* Install any platform specific file systems...
*/
psInstallFileSystem();
/*
* Initialize debug message handling...
*/
RsEventHandler(rsINITDEBUG, nil);
/*
* Attach all plugins...
*/
if (RsEventHandler(rsPLUGINATTACH, nil) == rsEVENTERROR)
{
return (FALSE);
}
/*
* Attach input devices...
*/
if (RsEventHandler(rsINPUTDEVICEATTACH, nil) == rsEVENTERROR)
{
return (FALSE);
}
openParams.displayID = displayID;
if (!RwEngineOpen(&openParams))
{
RwEngineTerm();
return (FALSE);
}
if (RsEventHandler(rsSELECTDEVICE, displayID) == rsEVENTERROR)
{
RwEngineClose();
RwEngineTerm();
return (FALSE);
}
if (!RwEngineStart())
{
RwEngineClose();
RwEngineTerm();
return (FALSE);
}
/*
* Register loaders for an image with a particular file extension...
*/
RsEventHandler(rsREGISTERIMAGELOADER, nil);
psNativeTextureSupport();
RwTextureSetMipmapping(FALSE);
RwTextureSetAutoMipmapping(FALSE);
POP_MEMID();
return TRUE;
}
/*
*****************************************************************************
*/
void
RsTerminate(void)
{
psTerminate();
return;
}
/*
*****************************************************************************
*/
RwBool
RsInitialize(void)
{
/*
* Initialize Platform independent data...
*/
RwBool result;
RsGlobal.appName = RWSTRING("GTA3");
RsGlobal.maximumWidth = DEFAULT_SCREEN_WIDTH;
RsGlobal.maximumHeight = DEFAULT_SCREEN_HEIGHT;
RsGlobal.width = DEFAULT_SCREEN_WIDTH;
RsGlobal.height = DEFAULT_SCREEN_HEIGHT;
RsGlobal.maxFPS = 30;
RsGlobal.quit = FALSE;
/* setup the keyboard */
RsGlobal.keyboard.inputDeviceType = rsKEYBOARD;
RsGlobal.keyboard.inputEventHandler = nil;
RsGlobal.keyboard.used = FALSE;
/* setup the mouse */
RsGlobal.mouse.inputDeviceType = rsMOUSE;
RsGlobal.mouse.inputEventHandler = nil;
RsGlobal.mouse.used = FALSE;
/* setup the pad */
RsGlobal.pad.inputDeviceType = rsPAD;
RsGlobal.pad.inputEventHandler = nil;
RsGlobal.pad.used = FALSE;
result = psInitialize();
return result;
}

290
src/skel/skeleton.h Normal file
View file

@ -0,0 +1,290 @@
#ifndef SKELETON_H
#define SKELETON_H
#include "rwcore.h"
/* Default arena size depending on platform. */
#define rsRESOURCESDEFAULTARENASIZE (1 << 20)
#if (!defined(RsSprintf))
#define RsSprintf rwsprintf
#endif /* (!defined(RsSprintf)) */
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
#if (!defined(RSASSERT))
#define RSASSERT(_condition) /* No-op */
#endif /* (!defined(RSASSERT)) */
#define RSASSERTISTYPE(_f, _t) \
RSASSERT( (!(_f)) || ((((const RwObject *)(_f))->type)==(_t)) )
enum RsInputDeviceType
{
rsKEYBOARD,
rsMOUSE,
rsPAD
};
typedef enum RsInputDeviceType RsInputDeviceType;
enum RsEventStatus
{
rsEVENTERROR,
rsEVENTPROCESSED,
rsEVENTNOTPROCESSED
};
typedef enum RsEventStatus RsEventStatus;
enum RsEvent
{
rsCAMERASIZE,
rsCOMMANDLINE,
rsFILELOAD,
rsINITDEBUG,
rsINPUTDEVICEATTACH,
rsLEFTBUTTONDOWN,
rsLEFTBUTTONUP,
rsMOUSEMOVE,
rsMOUSEWHEELMOVE,
rsPLUGINATTACH,
rsREGISTERIMAGELOADER,
rsRIGHTBUTTONDOWN,
rsRIGHTBUTTONUP,
_rs_13,
_rs_14,
_rs_15,
_rs_16,
_rs_17,
_rs_18,
_rs_19,
_rs_20,
rsRWINITIALIZE,
rsRWTERMINATE,
rsSELECTDEVICE,
rsINITIALIZE,
rsTERMINATE,
rsIDLE,
rsFRONTENDIDLE,
rsKEYDOWN,
rsKEYUP,
rsQUITAPP,
rsPADBUTTONDOWN,
rsPADBUTTONUP,
rsPADANALOGUELEFT,
rsPADANALOGUELEFTRESET,
rsPADANALOGUERIGHT,
rsPADANALOGUERIGHTRESET,
rsPREINITCOMMANDLINE,
rsACTIVATE,
};
typedef enum RsEvent RsEvent;
typedef RsEventStatus (*RsInputEventHandler)(RsEvent event, void *param);
typedef struct RsInputDevice RsInputDevice;
struct RsInputDevice
{
RsInputDeviceType inputDeviceType;
RwBool used;
RsInputEventHandler inputEventHandler;
};
typedef struct RsGlobalType RsGlobalType;
struct RsGlobalType
{
const RwChar *appName;
RwInt32 width;
RwInt32 height;
RwInt32 maximumWidth;
RwInt32 maximumHeight;
RwInt32 maxFPS;
RwBool quit;
void *ps; /* platform specific data */
RsInputDevice keyboard;
RsInputDevice mouse;
RsInputDevice pad;
};
enum RsKeyCodes
{
rsESC = 1000,
rsF1 = 1001,
rsF2 = 1002,
rsF3 = 1003,
rsF4 = 1004,
rsF5 = 1005,
rsF6 = 1006,
rsF7 = 1007,
rsF8 = 1008,
rsF9 = 1009,
rsF10 = 1010,
rsF11 = 1011,
rsF12 = 1012,
rsINS = 1013,
rsDEL = 1014,
rsHOME = 1015,
rsEND = 1016,
rsPGUP = 1017,
rsPGDN = 1018,
rsUP = 1019,
rsDOWN = 1020,
rsLEFT = 1021,
rsRIGHT = 1022,
rsDIVIDE = 1023,
rsTIMES = 1024,
rsPLUS = 1025,
rsMINUS = 1026,
rsPADDEL = 1027,
rsPADEND = 1028,
rsPADDOWN = 1029,
rsPADPGDN = 1030,
rsPADLEFT = 1031,
rsPAD5 = 1032,
rsNUMLOCK = 1033,
rsPADRIGHT = 1034,
rsPADHOME = 1035,
rsPADUP = 1036,
rsPADPGUP = 1037,
rsPADINS = 1038,
rsPADENTER = 1039,
rsSCROLL = 1040,
rsPAUSE = 1041,
rsBACKSP = 1042,
rsTAB = 1043,
rsCAPSLK = 1044,
rsENTER = 1045,
rsLSHIFT = 1046,
rsRSHIFT = 1047,
rsSHIFT = 1048,
rsLCTRL = 1049,
rsRCTRL = 1050,
rsLALT = 1051,
rsRALT = 1052,
rsLWIN = 1053,
rsRWIN = 1054,
rsAPPS = 1055,
rsNULL = 1056,
rsMOUSELEFTBUTTON = 1,
rsMOUSMIDDLEBUTTON = 2,
rsMOUSERIGHTBUTTON = 3,
rsMOUSEWHEELUPBUTTON = 4,
rsMOUSEWHEELDOWNBUTTON = 5,
rsMOUSEX1BUTTON = 6,
rsMOUSEX2BUTTON = 7,
};
typedef enum RsKeyCodes RsKeyCodes;
typedef struct RsKeyStatus RsKeyStatus;
struct RsKeyStatus
{
RwInt32 keyCharCode;
};
typedef struct RsPadButtonStatus RsPadButtonStatus;
struct RsPadButtonStatus
{
RwInt32 padID;
};
enum RsPadButtons
{
rsPADNULL = 0,
rsPADBUTTON1 = 1,
rsPADBUTTON2 = 2,
rsPADBUTTON3 = 3,
rsPADBUTTON4 = 4,
rsPADBUTTON5 = 5,
rsPADBUTTON6 = 6,
rsPADBUTTON7 = 7,
rsPADBUTTON8 = 8,
rsPADSELECT = 9,
rsPADBUTTONA1 = 10,
rsPADBUTTONA2 = 11,
rsPADSTART = 12,
rsPADDPADUP = 13,
rsPADDPADRIGHT = 14,
rsPADDPADDOWN = 15,
rsPADDPADLEFT = 16,
};
typedef enum RsPadButtons RsPadButtons;
extern RsGlobalType RsGlobal;
extern RsEventStatus AppEventHandler(RsEvent event, void *param);
extern RwBool AttachInputDevices(void);
extern RsEventStatus RsEventHandler(RsEvent event, void *param);
extern RsEventStatus RsKeyboardEventHandler(RsEvent event, void *param);
extern RsEventStatus RsPadEventHandler(RsEvent event, void *param);
extern RwBool
RsInitialize(void);
extern RwBool
RsRegisterImageLoader(void);
extern RwBool
RsRwInitialize(void *param);
extern RwBool
RsSelectDevice(void);
extern RwBool
RsInputDeviceAttach(RsInputDeviceType inputDevice,
RsInputEventHandler inputEventHandler);
#ifdef _WIN32
extern RwUInt32
#else
extern double
#endif
RsTimer(void);
extern void
RsCameraShowRaster(RwCamera *camera);
extern RwBool
RsCameraBeginUpdate(RwCamera *camera);
//TODO
//extern void
//RsMouseSetVisibility(RwBool visible);
extern RwImage*
RsGrabScreen(RwCamera *camera);
extern void
RsMouseSetPos(RwV2d *pos);
extern void
RsRwTerminate(void);
extern void
RsTerminate(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* SKELETON_H */

BIN
src/skel/win/gta3.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

21
src/skel/win/resource.h Normal file
View file

@ -0,0 +1,21 @@
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by dungeon.rc
//
#define IDD_DIALOG1 104
#define IDC_DEVICESEL 1000
#define IDC_VIDMODE 1001
#define IDEXIT 1002
#define IDC_SELECTDEVICE 1005
#define IDI_MAIN_ICON 1042
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

3432
src/skel/win/win.cpp Normal file

File diff suppressed because it is too large Load diff

91
src/skel/win/win.h Normal file
View file

@ -0,0 +1,91 @@
// DON'T include directly. crossplatform.h includes this if you're using D3D9 backend(win.cpp).
#if (!defined(_PLATFORM_WIN_H))
#define _PLATFORM_WIN_H
#if (!defined(RSREGSETBREAKALLOC))
#define RSREGSETBREAKALLOC(_name) /* No op */
#endif /* (!defined(RSREGSETBREAKALLOC)) */
#ifdef __DINPUT_INCLUDED__
/* platform specfic global data */
typedef struct
{
HWND window;
HINSTANCE instance;
RwBool fullScreen;
RwV2d lastMousePos;
DWORD field_14;
LPDIRECTINPUT8 dinterface;
LPDIRECTINPUTDEVICE8 mouse;
LPDIRECTINPUTDEVICE8 joy1;
LPDIRECTINPUTDEVICE8 joy2;
}
psGlobalType;
#define PSGLOBAL(var) (((psGlobalType *)(RsGlobal.ps))->var)
enum eJoypads
{
JOYSTICK1 = 0,
JOYSTICK2,
MAX_JOYSTICKS
};
enum eJoypadState
{
JOYPAD_UNUSED,
JOYPAD_ATTACHED,
};
struct tJoy
{
eJoypadState m_State;
bool m_bInitialised;
bool m_bHasAxisZ;
bool m_bHasAxisR;
int m_nVendorID;
int m_nProductID;
};
class CJoySticks
{
public:
tJoy m_aJoys[MAX_JOYSTICKS];
CJoySticks();
void ClearJoyInfo(int joyID);
};
extern CJoySticks AllValidWinJoys;
#endif
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
#ifdef __DINPUT_INCLUDED__
HRESULT _InputInitialise();
HRESULT CapturePad(RwInt32 padID);
void _InputAddJoyStick(LPDIRECTINPUTDEVICE8 lpDevice, INT num);
HRESULT _InputAddJoys();
HRESULT _InputGetMouseState(DIMOUSESTATE2 *state);
void _InputShutdown();
BOOL CALLBACK _InputEnumDevicesCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext );
BOOL _InputTranslateKey(RsKeyCodes *rs, UINT flag, UINT key);
BOOL _InputTranslateShiftKey(RsKeyCodes *rs, UINT key, BOOLEAN bDown);
BOOL _InputIsExtended(INT flag);
#endif
void CenterVideo(void);
void CloseClip(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* (!defined(_PLATFORM_WIN_H)) */

47
src/skel/win/win.rc Normal file
View file

@ -0,0 +1,47 @@
#include "resource.h"
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
//#if !defined(__GNU_C__)
//#include "afxres.h"
//#else
#include "winresrc.h"
//#endif /* !defined(__GNU_C__) */
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 90
STYLE DS_MODALFRAME | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "Device Selection"
FONT 8, "MS Sans Serif"
BEGIN
COMBOBOX IDC_DEVICESEL,7,25,172,33,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
COMBOBOX IDC_VIDMODE,7,46,172,74,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
DEFPUSHBUTTON "EXIT",IDEXIT,103,69,52,14
DEFPUSHBUTTON "OK",IDOK,28,69,50,14
LTEXT "Please select the Device To Use:",IDC_SELECTDEVICE,7,7,
137,8
END
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_MAIN_ICON ICON DISCARDABLE "gta3.ico"
/////////////////////////////////////////////////////////////////////////////