Difference between revisions of "Link"
Line 9: | Line 9: | ||
<pre> | <pre> | ||
struct LinkedMem { | struct LinkedMem { | ||
− | + | #ifdef WIN32 | |
+ | UINT32 uiVersion; | ||
DWORD dwTick; | DWORD dwTick; | ||
+ | #else | ||
+ | uint32_t uiVersion; | ||
+ | uint64_t ui64Tick; | ||
+ | #endif | ||
float fPosition[3]; | float fPosition[3]; | ||
float fFront[3]; | float fFront[3]; | ||
Line 17: | Line 22: | ||
}; | }; | ||
− | |||
LinkedMem *lm = NULL; | LinkedMem *lm = NULL; | ||
+ | #ifdef WIN32 | ||
+ | static HANDLE hMapObject = NULL; | ||
void initMumble() { | void initMumble() { | ||
hMapObject = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink"); | hMapObject = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink"); | ||
Line 33: | Line 39: | ||
wcscpy_s(lm->name, 256, L"MyGameName"); | wcscpy_s(lm->name, 256, L"MyGameName"); | ||
} | } | ||
+ | #else | ||
+ | static int shmfd = -1; | ||
+ | void initMumble() { | ||
+ | shmfd = shm_open("/MumbleLink", O_RDWR, S_IRUSR | S_IWUSR); | ||
+ | |||
+ | if(shmfd < 0) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | lm = (LinkedMem *) (mmap(NULL, sizeof(struct LinkedMem), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd,0)); | ||
+ | |||
+ | if (lm == (void *) (-1)) { | ||
+ | lm = NULL; | ||
+ | } | ||
+ | } | ||
+ | #endif | ||
+ | |||
</pre> | </pre> | ||
Line 41: | Line 64: | ||
if (! lm) | if (! lm) | ||
return; | return; | ||
− | lm-> | + | |
+ | // Fill lm->fPosition, fTop and fFront | ||
+ | |||
+ | lm->uiVersion = 1; | ||
+ | #ifdef WIN32 | ||
lm->dwTick = GetTickCount(); | lm->dwTick = GetTickCount(); | ||
− | + | #else | |
+ | lm->ui64Tick = clock(); | ||
+ | #endif | ||
} | } | ||
</pre> | </pre> |
Revision as of 13:37, 4 April 2008
Linking a game to Mumble
The "best" way to link a game to mumble is to write your own plugin. However, that may be a lot of work, so we have an alternative method.
Initialization
Somewhere in your game initalization, add these lines of code:
struct LinkedMem { #ifdef WIN32 UINT32 uiVersion; DWORD dwTick; #else uint32_t uiVersion; uint64_t ui64Tick; #endif float fPosition[3]; float fFront[3]; float fTop[3]; wchar_t name[256]; }; LinkedMem *lm = NULL; #ifdef WIN32 static HANDLE hMapObject = NULL; void initMumble() { hMapObject = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink"); if (hMapObject == NULL) return; lm = (LinkedMem *) MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(LinkedMem)); if (lm == NULL) { CloseHandle(hMapObject); hMapObject = NULL; return; } wcscpy_s(lm->name, 256, L"MyGameName"); } #else static int shmfd = -1; void initMumble() { shmfd = shm_open("/MumbleLink", O_RDWR, S_IRUSR | S_IWUSR); if(shmfd < 0) { return; } lm = (LinkedMem *) (mmap(NULL, sizeof(struct LinkedMem), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd,0)); if (lm == (void *) (-1)) { lm = NULL; } } #endif
Then, for each frame, do the following:
void updateMumble() { if (! lm) return; // Fill lm->fPosition, fTop and fFront lm->uiVersion = 1; #ifdef WIN32 lm->dwTick = GetTickCount(); #else lm->ui64Tick = clock(); #endif }
fPosition should be the player position in 3D space. fTop and fFront should be the orientation. The coordinate system is a left-handed one, and the units are in meters.
Mumble fetches these values 50 times a second, so please update them every frame.