mirror of
https://github.com/DrBeef/ioq3quest.git
synced 2024-11-29 23:32:23 +00:00
Major Mulltiplayer Support changes
- Multiplayer support - Updated weapon offsets with SkillFur's latest values - APK contains and copies the glsl shader files now (no need to copy them separately)
This commit is contained in:
parent
3678133c67
commit
2926e73185
23 changed files with 172 additions and 118 deletions
|
@ -16,7 +16,7 @@ BUILD_GAME_QVM=0
|
||||||
BUILD_GAME_SO=1
|
BUILD_GAME_SO=1
|
||||||
BUILD_MISSIONPACK=0
|
BUILD_MISSIONPACK=0
|
||||||
BUILD_SERVER=0
|
BUILD_SERVER=0
|
||||||
BUILD_STANDALONE=1
|
BUILD_STANDALONE=0
|
||||||
GENERATE_DEPENDENCIES=0
|
GENERATE_DEPENDENCIES=0
|
||||||
USE_CODEC_VORBIS=0
|
USE_CODEC_VORBIS=0
|
||||||
USE_CURL=0
|
USE_CURL=0
|
||||||
|
|
|
@ -2,14 +2,14 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.drbeef.ioq3quest"
|
package="com.drbeef.ioq3quest"
|
||||||
android:installLocation="preferExternal"
|
android:installLocation="preferExternal"
|
||||||
android:versionCode="11"
|
android:versionCode="12"
|
||||||
android:versionName="0.7.1">
|
android:versionName="0.8.0">
|
||||||
<uses-feature android:name="android.hardware.vr.headtracking" android:version="1" android:required="true" />
|
<uses-feature android:name="android.hardware.vr.headtracking" android:version="1" android:required="true" />
|
||||||
<uses-feature android:glEsVersion="0x00030001" />
|
<uses-feature android:glEsVersion="0x00030001" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ int main(int argc, char* argv[]) {
|
||||||
engine_t* engine = nullptr;
|
engine_t* engine = nullptr;
|
||||||
engine = VR_Init(java);
|
engine = VR_Init(java);
|
||||||
|
|
||||||
//sleep(30);
|
//sleep(40);
|
||||||
|
|
||||||
//First set up resolution cached values
|
//First set up resolution cached values
|
||||||
int width, height;
|
int width, height;
|
||||||
|
@ -76,6 +76,7 @@ int main(int argc, char* argv[]) {
|
||||||
char *args = (char*)getenv("commandline");
|
char *args = (char*)getenv("commandline");
|
||||||
|
|
||||||
Com_Init(args);
|
Com_Init(args);
|
||||||
|
NET_Init( );
|
||||||
|
|
||||||
VR_InitRenderer(engine);
|
VR_InitRenderer(engine);
|
||||||
|
|
||||||
|
|
|
@ -12,14 +12,18 @@ import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
import org.libsdl.app.SDLActivity;
|
import org.libsdl.app.SDLActivity;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
import static android.system.Os.setenv;
|
import static android.system.Os.setenv;
|
||||||
|
|
||||||
|
@ -35,12 +39,14 @@ public class MainActivity extends SDLActivity
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
Log.i(TAG,"onCreate called");
|
Log.i(TAG,"onCreate called");
|
||||||
|
try {
|
||||||
checkPermissionsAndInitialize();
|
checkPermissionsAndInitialize();
|
||||||
|
} catch (Exception e) {}
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Initializes the Activity only if the permission has been granted. */
|
/** Initializes the Activity only if the permission has been granted. */
|
||||||
private void checkPermissionsAndInitialize() {
|
private void checkPermissionsAndInitialize() throws IOException {
|
||||||
// Boilerplate for checking runtime permissions in Android.
|
// Boilerplate for checking runtime permissions in Android.
|
||||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||||
!= PackageManager.PERMISSION_GRANTED){
|
!= PackageManager.PERMISSION_GRANTED){
|
||||||
|
@ -65,19 +71,49 @@ public class MainActivity extends SDLActivity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void create() {
|
public static void unzip(File zipFile, File targetDirectory) throws IOException {
|
||||||
Log.d(TAG, "making dirs");
|
ZipInputStream zis = new ZipInputStream(
|
||||||
//Make the directories
|
new BufferedInputStream(new FileInputStream(zipFile)));
|
||||||
new File("/sdcard/ioquake3Quest/").mkdirs();
|
try {
|
||||||
|
ZipEntry ze;
|
||||||
|
int count;
|
||||||
|
byte[] buffer = new byte[8192];
|
||||||
|
while ((ze = zis.getNextEntry()) != null) {
|
||||||
|
File file = new File(targetDirectory, ze.getName());
|
||||||
|
File dir = ze.isDirectory() ? file : file.getParentFile();
|
||||||
|
if (!dir.isDirectory() && !dir.mkdirs())
|
||||||
|
throw new FileNotFoundException("Failed to ensure directory: " +
|
||||||
|
dir.getAbsolutePath());
|
||||||
|
if (ze.isDirectory())
|
||||||
|
continue;
|
||||||
|
FileOutputStream fout = new FileOutputStream(file);
|
||||||
|
try {
|
||||||
|
while ((count = zis.read(buffer)) != -1)
|
||||||
|
fout.write(buffer, 0, count);
|
||||||
|
} finally {
|
||||||
|
fout.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
zis.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void create() throws IOException {
|
||||||
|
//Make the directories
|
||||||
|
new File("/sdcard/ioquake3Quest/baseq3").mkdirs();
|
||||||
|
|
||||||
Log.d(TAG, "copying commandline.txt");
|
|
||||||
//Copy the command line params file
|
//Copy the command line params file
|
||||||
copy_asset("/sdcard/ioquake3Quest", "commandline.txt", false);
|
copy_asset("/sdcard/ioquake3Quest", "commandline.txt", false);
|
||||||
|
|
||||||
|
//glsl
|
||||||
|
copy_asset("/sdcard/ioquake3Quest", "glsl.zip", true);
|
||||||
|
new File("/sdcard/ioquake3Quest/baseq3/glsl").mkdirs();
|
||||||
|
unzip(new File("/sdcard/ioquake3Quest/glsl.zip"), new File("/sdcard/ioquake3Quest/baseq3/glsl"));
|
||||||
|
|
||||||
//Read these from a file and pass through
|
//Read these from a file and pass through
|
||||||
commandLineParams = new String();
|
commandLineParams = new String();
|
||||||
|
|
||||||
Log.d(TAG, "reading commandline.txt");
|
|
||||||
//See if user is trying to use command line params
|
//See if user is trying to use command line params
|
||||||
if (new File("/sdcard/ioquake3Quest/commandline.txt").exists())
|
if (new File("/sdcard/ioquake3Quest/commandline.txt").exists())
|
||||||
{
|
{
|
||||||
|
|
|
@ -2674,9 +2674,11 @@ void CG_DrawActive( stereoFrame_t stereoView ) {
|
||||||
VectorCopy( cg.refdef.vieworg, baseOrg );
|
VectorCopy( cg.refdef.vieworg, baseOrg );
|
||||||
|
|
||||||
float worldscale = trap_Cvar_VariableValue("vr_worldscale") *
|
float worldscale = trap_Cvar_VariableValue("vr_worldscale") *
|
||||||
(( cg.snap->ps.stats[STAT_HEALTH] <= 0 ) ? DEATH_WORLDSCALE_MULTIPLIER : 1.0f);
|
(( cg.snap->ps.stats[STAT_HEALTH] <= 0 ) &&
|
||||||
|
( cg.snap->ps.pm_type != PM_INTERMISSION ) ? DEATH_WORLDSCALE_MULTIPLIER : 1.0f);
|
||||||
|
|
||||||
float ipd = 0.065f;
|
|
||||||
|
float ipd = trap_Cvar_VariableValue("r_stereoSeparation") / 1000.0f;
|
||||||
float separation = stereoView == STEREO_LEFT ?
|
float separation = stereoView == STEREO_LEFT ?
|
||||||
worldscale * (-ipd / 2) : //left
|
worldscale * (-ipd / 2) : //left
|
||||||
worldscale * (ipd / 2); // right
|
worldscale * (ipd / 2); // right
|
||||||
|
|
|
@ -50,8 +50,11 @@ This must be the very first function compiled into the .q3vm file
|
||||||
Q_EXPORT intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11 ) {
|
Q_EXPORT intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11 ) {
|
||||||
|
|
||||||
switch ( command ) {
|
switch ( command ) {
|
||||||
case CG_INIT:
|
case CG_INIT: {
|
||||||
|
int ptr[2] = {arg3, arg4};
|
||||||
|
cgVR = (vr_clientinfo_t *) (*(long *) (ptr));
|
||||||
CG_Init(arg0, arg1, arg2);
|
CG_Init(arg0, arg1, arg2);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
case CG_SHUTDOWN:
|
case CG_SHUTDOWN:
|
||||||
CG_Shutdown();
|
CG_Shutdown();
|
||||||
|
@ -78,11 +81,6 @@ Q_EXPORT intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, i
|
||||||
case CG_EVENT_HANDLING:
|
case CG_EVENT_HANDLING:
|
||||||
CG_EventHandling(arg0);
|
CG_EventHandling(arg0);
|
||||||
return 0;
|
return 0;
|
||||||
case CG_SET_VR_CLIENT_INFO: {
|
|
||||||
int ptr[2] = {arg0, arg1};
|
|
||||||
cgVR = (vr_clientinfo_t *) (*(long*)(ptr));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
CG_Error( "vmMain: unknown command %i", command );
|
CG_Error( "vmMain: unknown command %i", command );
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -231,11 +231,9 @@ typedef enum {
|
||||||
|
|
||||||
CG_MOUSE_EVENT,
|
CG_MOUSE_EVENT,
|
||||||
// void (*CG_MouseEvent)( int dx, int dy );
|
// void (*CG_MouseEvent)( int dx, int dy );
|
||||||
CG_EVENT_HANDLING,
|
CG_EVENT_HANDLING
|
||||||
// void (*CG_EventHandling)(int type);
|
// void (*CG_EventHandling)(int type);
|
||||||
|
|
||||||
CG_SET_VR_CLIENT_INFO
|
|
||||||
|
|
||||||
} cgameExport_t;
|
} cgameExport_t;
|
||||||
|
|
||||||
//----------------------------------------------
|
//----------------------------------------------
|
||||||
|
|
|
@ -633,20 +633,12 @@ static int CG_CalcViewValues( void ) {
|
||||||
CG_CalcVrect();
|
CG_CalcVrect();
|
||||||
|
|
||||||
ps = &cg.predictedPlayerState;
|
ps = &cg.predictedPlayerState;
|
||||||
/*
|
|
||||||
if (cg.cameraMode) {
|
//HACK!! - should change this to a renderer function call
|
||||||
vec3_t origin, angles;
|
//Indicate to renderer whether we are in deathcam mode, We don't want sky in death cam mode
|
||||||
if (trap_getCameraInfo(cg.time, &origin, &angles)) {
|
trap_Cvar_Set( "r_deathCam", ((ps->stats[STAT_HEALTH] <= 0) &&
|
||||||
VectorCopy(origin, cg.refdef.vieworg);
|
( ps->pm_type != PM_INTERMISSION )) ? "1" : "0" );
|
||||||
angles[ROLL] = 0;
|
|
||||||
VectorCopy(angles, cg.refdefViewAngles);
|
|
||||||
AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis );
|
|
||||||
return CG_CalcFov();
|
|
||||||
} else {
|
|
||||||
cg.cameraMode = qfalse;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// intermission view
|
// intermission view
|
||||||
static float hmdYaw = 0;
|
static float hmdYaw = 0;
|
||||||
if ( ps->pm_type == PM_INTERMISSION ) {
|
if ( ps->pm_type == PM_INTERMISSION ) {
|
||||||
|
@ -665,6 +657,7 @@ static int CG_CalcViewValues( void ) {
|
||||||
VectorCopy(cgVR->hmdorientation, cg.refdefViewAngles);
|
VectorCopy(cgVR->hmdorientation, cg.refdefViewAngles);
|
||||||
cg.refdefViewAngles[YAW] += (ps->viewangles[YAW] - hmdYaw);
|
cg.refdefViewAngles[YAW] += (ps->viewangles[YAW] - hmdYaw);
|
||||||
AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis );
|
AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis );
|
||||||
|
|
||||||
return CG_CalcFov();
|
return CG_CalcFov();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,12 +703,19 @@ static int CG_CalcViewValues( void ) {
|
||||||
CG_OffsetFirstPersonView();
|
CG_OffsetFirstPersonView();
|
||||||
}
|
}
|
||||||
|
|
||||||
//HACK!! - should change this to a renderer function call
|
|
||||||
//Indicate to renderer whether we are in deathcam mode, We don't want sky in death cam mode
|
|
||||||
trap_Cvar_Set( "r_deathCam", (cg.snap->ps.stats[STAT_HEALTH] <= 0) ? "1" : "0" );
|
|
||||||
|
|
||||||
// position eye relative to origin
|
// position eye relative to origin
|
||||||
|
float sv_running = trap_Cvar_VariableValue("sv_running");
|
||||||
|
if (sv_running == 0.0f )
|
||||||
|
{
|
||||||
|
//We are connected to a multiplayer server, so make the appropriate adjustment to the view
|
||||||
|
//angles as we send orientation to the server that includes the weapon angles
|
||||||
|
vec3_t angles;
|
||||||
|
VectorCopy(cgVR->hmdorientation, angles);
|
||||||
|
angles[YAW] = (cg.refdefViewAngles[YAW] + cgVR->hmdorientation[YAW]) - cgVR->weaponangles[YAW];
|
||||||
|
AnglesToAxis( angles, cg.refdef.viewaxis );
|
||||||
|
} else {
|
||||||
AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis );
|
AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis );
|
||||||
|
}
|
||||||
|
|
||||||
if ( cg.hyperspace ) {
|
if ( cg.hyperspace ) {
|
||||||
cg.refdef.rdflags |= RDF_NOWORLDMODEL | RDF_HYPERSPACE;
|
cg.refdef.rdflags |= RDF_NOWORLDMODEL | RDF_HYPERSPACE;
|
||||||
|
|
|
@ -230,7 +230,16 @@ void CG_ConvertFromVR(vec3_t in, vec3_t offset, vec3_t out)
|
||||||
VectorSet(vrSpace, in[2], in[0], in[1] );
|
VectorSet(vrSpace, in[2], in[0], in[1] );
|
||||||
|
|
||||||
vec2_t r;
|
vec2_t r;
|
||||||
|
float sv_running = trap_Cvar_VariableValue("sv_running");
|
||||||
|
if (sv_running == 0.0f )
|
||||||
|
{
|
||||||
|
//We are connected to a multiplayer server, so make the appropriate adjustment to the view
|
||||||
|
//angles as we send orientation to the server that includes the weapon angles
|
||||||
|
rotateAboutOrigin(vrSpace[0], vrSpace[1], cg.refdefViewAngles[YAW] - cgVR->weaponangles[YAW], r);
|
||||||
|
} else {
|
||||||
rotateAboutOrigin(vrSpace[0], vrSpace[1], cg.refdefViewAngles[YAW] - cgVR->hmdorientation[YAW], r);
|
rotateAboutOrigin(vrSpace[0], vrSpace[1], cg.refdefViewAngles[YAW] - cgVR->hmdorientation[YAW], r);
|
||||||
|
}
|
||||||
|
|
||||||
vrSpace[0] = -r[0];
|
vrSpace[0] = -r[0];
|
||||||
vrSpace[1] = -r[1];
|
vrSpace[1] = -r[1];
|
||||||
|
|
||||||
|
@ -255,8 +264,17 @@ void CG_CalculateVRWeaponPosition( vec3_t origin, vec3_t angles )
|
||||||
|
|
||||||
VectorCopy(cgVR->weaponangles, angles);
|
VectorCopy(cgVR->weaponangles, angles);
|
||||||
|
|
||||||
|
float sv_running = trap_Cvar_VariableValue("sv_running");
|
||||||
|
if (sv_running == 0.0f )
|
||||||
|
{
|
||||||
|
//take player state angles provided by server
|
||||||
|
angles[YAW] = cg.snap->ps.viewangles[YAW];
|
||||||
|
angles[PITCH] = cg.snap->ps.viewangles[PITCH];
|
||||||
|
} else
|
||||||
|
{
|
||||||
angles[YAW] += (cg.refdefViewAngles[YAW] - cgVR->hmdorientation[YAW]);
|
angles[YAW] += (cg.refdefViewAngles[YAW] - cgVR->hmdorientation[YAW]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==========================
|
==========================
|
||||||
|
|
|
@ -55,17 +55,6 @@ void CL_GetGlconfig( glconfig_t *glconfig ) {
|
||||||
*glconfig = cls.glconfig;
|
*glconfig = cls.glconfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
=====================
|
|
||||||
CL_CGameRendering
|
|
||||||
=====================
|
|
||||||
*/
|
|
||||||
void CL_CGameSetVRClientInfo() {
|
|
||||||
long val = (long)(&vr);
|
|
||||||
int *ptr = (int*)(&val); //HACK!!
|
|
||||||
VM_Call( cgvm, CG_SET_VR_CLIENT_INFO, ptr[0], ptr[1] );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
====================
|
====================
|
||||||
CL_GetUserCmd
|
CL_GetUserCmd
|
||||||
|
@ -751,10 +740,14 @@ void CL_InitCGame( void ) {
|
||||||
}
|
}
|
||||||
clc.state = CA_LOADING;
|
clc.state = CA_LOADING;
|
||||||
|
|
||||||
|
//Pass the vr client info in on the init
|
||||||
|
long val = (long)(&vr);
|
||||||
|
int *ptr = (int*)(&val); //HACK!!
|
||||||
|
|
||||||
// init for this gamestate
|
// init for this gamestate
|
||||||
// use the lastExecutedServerCommand instead of the serverCommandSequence
|
// use the lastExecutedServerCommand instead of the serverCommandSequence
|
||||||
// otherwise server commands sent just before a gamestate are dropped
|
// otherwise server commands sent just before a gamestate are dropped
|
||||||
VM_Call( cgvm, CG_INIT, clc.serverMessageSequence, clc.lastExecutedServerCommand, clc.clientNum );
|
VM_Call( cgvm, CG_INIT, clc.serverMessageSequence, clc.lastExecutedServerCommand, clc.clientNum, ptr[0], ptr[1] );
|
||||||
|
|
||||||
// reset any CVAR_CHEAT cvars registered by cgame
|
// reset any CVAR_CHEAT cvars registered by cgame
|
||||||
if ( !clc.demoplaying && !cl_connectedToCheatServer )
|
if ( !clc.demoplaying && !cl_connectedToCheatServer )
|
||||||
|
|
|
@ -598,13 +598,13 @@ void CL_FinishMove( usercmd_t *cmd ) {
|
||||||
{
|
{
|
||||||
vec3_t angles;
|
vec3_t angles;
|
||||||
VectorCopy(vr.weaponangles, angles);
|
VectorCopy(vr.weaponangles, angles);
|
||||||
angles[YAW] += cl.viewangles[YAW];
|
angles[YAW] += (cl.viewangles[YAW] - vr.hmdorientation[YAW]);
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
cmd->angles[i] = ANGLE2SHORT(angles[i]);
|
cmd->angles[i] = ANGLE2SHORT(angles[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3_t out;
|
vec3_t out;
|
||||||
rotateAboutOrigin(cmd->rightmove, cmd->forwardmove, cl.viewangles[YAW], out);
|
rotateAboutOrigin(cmd->rightmove, cmd->forwardmove, -vr.weaponangles[YAW], out);
|
||||||
cmd->rightmove = out[0];
|
cmd->rightmove = out[0];
|
||||||
cmd->forwardmove = out[1];
|
cmd->forwardmove = out[1];
|
||||||
}
|
}
|
||||||
|
|
|
@ -538,7 +538,6 @@ void SCR_DrawScreenField( stereoFrame_t stereoFrame ) {
|
||||||
break;
|
break;
|
||||||
case CA_LOADING:
|
case CA_LOADING:
|
||||||
case CA_PRIMED:
|
case CA_PRIMED:
|
||||||
CL_CGameSetVRClientInfo();
|
|
||||||
// draw the game information screen and loading progress
|
// draw the game information screen and loading progress
|
||||||
CL_CGameRendering(stereoFrame);
|
CL_CGameRendering(stereoFrame);
|
||||||
|
|
||||||
|
@ -549,7 +548,6 @@ void SCR_DrawScreenField( stereoFrame_t stereoFrame ) {
|
||||||
VM_Call( uivm, UI_DRAW_CONNECT_SCREEN, qtrue );
|
VM_Call( uivm, UI_DRAW_CONNECT_SCREEN, qtrue );
|
||||||
break;
|
break;
|
||||||
case CA_ACTIVE:
|
case CA_ACTIVE:
|
||||||
CL_CGameSetVRClientInfo();
|
|
||||||
// always supply STEREO_CENTER as vieworg offset is now done by the engine.
|
// always supply STEREO_CENTER as vieworg offset is now done by the engine.
|
||||||
CL_CGameRendering(stereoFrame);
|
CL_CGameRendering(stereoFrame);
|
||||||
SCR_DrawDemoRecording();
|
SCR_DrawDemoRecording();
|
||||||
|
|
|
@ -1123,12 +1123,15 @@ void CL_InitUI( void ) {
|
||||||
Com_Error( ERR_FATAL, "VM_Create on UI failed" );
|
Com_Error( ERR_FATAL, "VM_Create on UI failed" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long val = (long)(&vr);
|
||||||
|
int *ptr = (int*)(&val); //HACK!!
|
||||||
|
|
||||||
// sanity check
|
// sanity check
|
||||||
v = VM_Call( uivm, UI_GETAPIVERSION );
|
v = VM_Call( uivm, UI_GETAPIVERSION );
|
||||||
if (v == UI_OLD_API_VERSION) {
|
if (v == UI_OLD_API_VERSION) {
|
||||||
// Com_Printf(S_COLOR_YELLOW "WARNING: loading old Quake III Arena User Interface version %d\n", v );
|
// Com_Printf(S_COLOR_YELLOW "WARNING: loading old Quake III Arena User Interface version %d\n", v );
|
||||||
// init for this gamestate
|
// init for this gamestate
|
||||||
VM_Call( uivm, UI_INIT, (clc.state >= CA_AUTHORIZING && clc.state < CA_ACTIVE));
|
VM_Call( uivm, UI_INIT, (clc.state >= CA_AUTHORIZING && clc.state < CA_ACTIVE), ptr[0], ptr[1]);
|
||||||
}
|
}
|
||||||
else if (v != UI_API_VERSION) {
|
else if (v != UI_API_VERSION) {
|
||||||
// Free uivm now, so UI_SHUTDOWN doesn't get called later.
|
// Free uivm now, so UI_SHUTDOWN doesn't get called later.
|
||||||
|
@ -1140,13 +1143,7 @@ void CL_InitUI( void ) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// init for this gamestate
|
// init for this gamestate
|
||||||
VM_Call( uivm, UI_INIT, (clc.state >= CA_AUTHORIZING && clc.state < CA_ACTIVE) );
|
VM_Call( uivm, UI_INIT, (clc.state >= CA_AUTHORIZING && clc.state < CA_ACTIVE), ptr[0], ptr[1] );
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
long val = (long)(&vr);
|
|
||||||
int *ptr = (int*)(&val); //HACK!!
|
|
||||||
VM_Call( uivm, UI_SET_VR_CLIENT_INFO, ptr[0], ptr[1] );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -507,8 +507,6 @@ void CL_ReadPackets (void);
|
||||||
void CL_WritePacket( void );
|
void CL_WritePacket( void );
|
||||||
void IN_CenterView (void);
|
void IN_CenterView (void);
|
||||||
|
|
||||||
void CL_CGameSetVRClientInfo( void );
|
|
||||||
|
|
||||||
void CL_VerifyCode( void );
|
void CL_VerifyCode( void );
|
||||||
|
|
||||||
float CL_KeyState (kbutton_t *key);
|
float CL_KeyState (kbutton_t *key);
|
||||||
|
|
|
@ -204,8 +204,11 @@ This must be the very first function compiled into the .q3vm file
|
||||||
*/
|
*/
|
||||||
Q_EXPORT intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11 ) {
|
Q_EXPORT intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11 ) {
|
||||||
switch ( command ) {
|
switch ( command ) {
|
||||||
case GAME_INIT:
|
case GAME_INIT: {
|
||||||
|
int ptr[2] = {arg3, arg4};
|
||||||
|
gVR = (vr_clientinfo_t *) (*(long *) (ptr));
|
||||||
G_InitGame(arg0, arg1, arg2);
|
G_InitGame(arg0, arg1, arg2);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
case GAME_SHUTDOWN:
|
case GAME_SHUTDOWN:
|
||||||
G_ShutdownGame( arg0 );
|
G_ShutdownGame( arg0 );
|
||||||
|
@ -234,11 +237,6 @@ Q_EXPORT intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, i
|
||||||
return ConsoleCommand();
|
return ConsoleCommand();
|
||||||
case BOTAI_START_FRAME:
|
case BOTAI_START_FRAME:
|
||||||
return BotAIStartFrame( arg0 );
|
return BotAIStartFrame( arg0 );
|
||||||
case GAME_SET_VR_CLIENT_INFO: {
|
|
||||||
int ptr[2] = {arg0, arg1};
|
|
||||||
gVR = (vr_clientinfo_t *) (*(long*)(ptr));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -425,8 +425,6 @@ typedef enum {
|
||||||
// The game can issue trap_argc() / trap_argv() commands to get the command
|
// The game can issue trap_argc() / trap_argv() commands to get the command
|
||||||
// and parameters. Return qfalse if the game doesn't recognize it as a command.
|
// and parameters. Return qfalse if the game doesn't recognize it as a command.
|
||||||
|
|
||||||
BOTAI_START_FRAME, // ( int time );
|
BOTAI_START_FRAME // ( int time );
|
||||||
|
|
||||||
GAME_SET_VR_CLIENT_INFO
|
|
||||||
} gameExport_t;
|
} gameExport_t;
|
||||||
|
|
||||||
|
|
|
@ -47,8 +47,12 @@ Q_EXPORT intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, i
|
||||||
case UI_GETAPIVERSION:
|
case UI_GETAPIVERSION:
|
||||||
return UI_API_VERSION;
|
return UI_API_VERSION;
|
||||||
|
|
||||||
case UI_INIT:
|
case UI_INIT: {
|
||||||
|
int ptr[2] = {arg1, arg2};
|
||||||
|
uiVR = (vr_clientinfo_t *) (*(long *) (ptr));
|
||||||
|
|
||||||
UI_Init();
|
UI_Init();
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case UI_SHUTDOWN:
|
case UI_SHUTDOWN:
|
||||||
|
@ -82,13 +86,6 @@ Q_EXPORT intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, i
|
||||||
return 0;
|
return 0;
|
||||||
case UI_HASUNIQUECDKEY: // mod authors need to observe this
|
case UI_HASUNIQUECDKEY: // mod authors need to observe this
|
||||||
return qtrue; // change this to qfalse for mods!
|
return qtrue; // change this to qfalse for mods!
|
||||||
|
|
||||||
case UI_SET_VR_CLIENT_INFO:{
|
|
||||||
int ptr[2] = {arg0, arg1};
|
|
||||||
uiVR = (vr_clientinfo_t *) (*(long*)(ptr));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -248,6 +248,8 @@ static char fs_gamedir[MAX_OSPATH]; // this will be a single file name with no
|
||||||
static cvar_t *fs_debug;
|
static cvar_t *fs_debug;
|
||||||
static cvar_t *fs_homepath;
|
static cvar_t *fs_homepath;
|
||||||
|
|
||||||
|
static cvar_t *fs_forceNativeVM;
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
// Also search the .app bundle for .pk3 files
|
// Also search the .app bundle for .pk3 files
|
||||||
static cvar_t *fs_apppath;
|
static cvar_t *fs_apppath;
|
||||||
|
@ -1332,6 +1334,7 @@ long FS_FOpenFileReadDir(const char *filename, searchpath_t *search, fileHandle_
|
||||||
!FS_IsExt(filename, ".menu", len) && // menu files
|
!FS_IsExt(filename, ".menu", len) && // menu files
|
||||||
!FS_IsExt(filename, ".game", len) && // menu files
|
!FS_IsExt(filename, ".game", len) && // menu files
|
||||||
!FS_IsExt(filename, ".dat", len) && // for journal files
|
!FS_IsExt(filename, ".dat", len) && // for journal files
|
||||||
|
!FS_IsExt(filename, ".glsl", len) && // external glsl files
|
||||||
!FS_IsDemoExt(filename, len)) // demos
|
!FS_IsDemoExt(filename, len)) // demos
|
||||||
{
|
{
|
||||||
*file = 0;
|
*file = 0;
|
||||||
|
@ -1467,7 +1470,7 @@ int FS_FindVM(void **startSearch, char *found, int foundlen, const char *name, i
|
||||||
|
|
||||||
while(search)
|
while(search)
|
||||||
{
|
{
|
||||||
if(search->dir && !fs_numServerPaks)
|
if(search->dir && (!fs_numServerPaks || fs_forceNativeVM->integer != 0))
|
||||||
{
|
{
|
||||||
dir = search->dir;
|
dir = search->dir;
|
||||||
|
|
||||||
|
@ -1495,7 +1498,8 @@ int FS_FindVM(void **startSearch, char *found, int foundlen, const char *name, i
|
||||||
return VMI_COMPILED;
|
return VMI_COMPILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(search->pack)
|
else if(search->pack &&
|
||||||
|
fs_forceNativeVM->integer == 0)
|
||||||
{
|
{
|
||||||
pack = search->pack;
|
pack = search->pack;
|
||||||
|
|
||||||
|
@ -3986,6 +3990,9 @@ void FS_InitFilesystem( void ) {
|
||||||
Com_StartupVariable("fs_homepath");
|
Com_StartupVariable("fs_homepath");
|
||||||
Com_StartupVariable("fs_game");
|
Com_StartupVariable("fs_game");
|
||||||
|
|
||||||
|
fs_forceNativeVM = Cvar_Get( "fs_forceNativeVM", "1", CVAR_ARCHIVE );
|
||||||
|
|
||||||
|
|
||||||
if(!FS_FilenameCompare(Cvar_VariableString("fs_game"), com_basegame->string))
|
if(!FS_FilenameCompare(Cvar_VariableString("fs_game"), com_basegame->string))
|
||||||
Cvar_Set("fs_game", "");
|
Cvar_Set("fs_game", "");
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
|
|
||||||
#include "../botlib/botlib.h"
|
#include "../botlib/botlib.h"
|
||||||
|
#include "../vr/vr_clientinfo.h"
|
||||||
|
|
||||||
botlib_export_t *botlib_export;
|
botlib_export_t *botlib_export;
|
||||||
|
extern vr_clientinfo_t vr;
|
||||||
|
|
||||||
// these functions must be used instead of pointer arithmetic, because
|
// these functions must be used instead of pointer arithmetic, because
|
||||||
// the game allocates gentities with private information after the server shared part
|
// the game allocates gentities with private information after the server shared part
|
||||||
|
@ -886,9 +888,13 @@ static void SV_InitGameVM( qboolean restart ) {
|
||||||
svs.clients[i].gentity = NULL;
|
svs.clients[i].gentity = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Ensure the game library has our VR client info
|
||||||
|
long val = (long)(&vr);
|
||||||
|
int *ptr = (int*)(&val); //HACK!!
|
||||||
|
|
||||||
// use the current msec count for a random seed
|
// use the current msec count for a random seed
|
||||||
// init for this gamestate
|
// init for this gamestate
|
||||||
VM_Call (gvm, GAME_INIT, sv.time, Com_Milliseconds(), restart);
|
VM_Call (gvm, GAME_INIT, sv.time, Com_Milliseconds(), restart, ptr[0], ptr[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "../vr/vr_clientinfo.h"
|
|
||||||
|
|
||||||
#ifdef USE_VOIP
|
#ifdef USE_VOIP
|
||||||
cvar_t *sv_voip;
|
cvar_t *sv_voip;
|
||||||
|
@ -31,7 +30,6 @@ cvar_t *sv_voipProtocol;
|
||||||
serverStatic_t svs; // persistant server info
|
serverStatic_t svs; // persistant server info
|
||||||
server_t sv; // local server
|
server_t sv; // local server
|
||||||
vm_t *gvm = NULL; // game virtual machine
|
vm_t *gvm = NULL; // game virtual machine
|
||||||
extern vr_clientinfo_t vr;
|
|
||||||
|
|
||||||
cvar_t *sv_fps = NULL; // time rate for running non-clients
|
cvar_t *sv_fps = NULL; // time rate for running non-clients
|
||||||
cvar_t *sv_timeout; // seconds without any message
|
cvar_t *sv_timeout; // seconds without any message
|
||||||
|
@ -1130,10 +1128,6 @@ void SV_Frame( int msec ) {
|
||||||
startTime = 0; // quite a compiler warning
|
startTime = 0; // quite a compiler warning
|
||||||
}
|
}
|
||||||
|
|
||||||
//Ensure the game library has our VR client info
|
|
||||||
long val = (long)(&vr);
|
|
||||||
int *ptr = (int*)(&val); //HACK!!
|
|
||||||
VM_Call( gvm, GAME_SET_VR_CLIENT_INFO, ptr[0], ptr[1] );
|
|
||||||
|
|
||||||
// update ping based on the all received frames
|
// update ping based on the all received frames
|
||||||
SV_CalcPings();
|
SV_CalcPings();
|
||||||
|
|
|
@ -182,12 +182,10 @@ typedef enum {
|
||||||
|
|
||||||
UI_DRAW_CONNECT_SCREEN,
|
UI_DRAW_CONNECT_SCREEN,
|
||||||
// void UI_DrawConnectScreen( qboolean overlay );
|
// void UI_DrawConnectScreen( qboolean overlay );
|
||||||
UI_HASUNIQUECDKEY,
|
UI_HASUNIQUECDKEY
|
||||||
// if !overlay, the background will be drawn, otherwise it will be
|
// if !overlay, the background will be drawn, otherwise it will be
|
||||||
// overlayed over whatever the cgame has drawn.
|
// overlayed over whatever the cgame has drawn.
|
||||||
// a GetClientState syscall will be made to get the current strings
|
// a GetClientState syscall will be made to get the current strings
|
||||||
|
|
||||||
UI_SET_VR_CLIENT_INFO
|
|
||||||
} uiExport_t;
|
} uiExport_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -46,12 +46,12 @@ void VR_InitCvars( void )
|
||||||
// VALUES PROVIDED BY SkillFur - Thank-you!
|
// VALUES PROVIDED BY SkillFur - Thank-you!
|
||||||
Cvar_Get ("vr_weapon_adjustment_1", "1,-4.0,7,-10,-20,-15,0", CVAR_ARCHIVE);
|
Cvar_Get ("vr_weapon_adjustment_1", "1,-4.0,7,-10,-20,-15,0", CVAR_ARCHIVE);
|
||||||
Cvar_Get ("vr_weapon_adjustment_2", "0.8,-3.0,5.5,0,0,0,0", CVAR_ARCHIVE);
|
Cvar_Get ("vr_weapon_adjustment_2", "0.8,-3.0,5.5,0,0,0,0", CVAR_ARCHIVE);
|
||||||
Cvar_Get ("vr_weapon_adjustment_3", "0.7,-2.5,5.5,0,0,0,0", CVAR_ARCHIVE);
|
Cvar_Get ("vr_weapon_adjustment_3", "0.7,-3.0,5.5,0,0,0,0", CVAR_ARCHIVE);
|
||||||
Cvar_Get ("vr_weapon_adjustment_4", "0.75,-4.0,6.5,-4,0,0,0", CVAR_ARCHIVE);
|
Cvar_Get ("vr_weapon_adjustment_4", "0.75,-5.4,6.5,-4,0,0,0", CVAR_ARCHIVE);
|
||||||
Cvar_Get ("vr_weapon_adjustment_5", "0.8,-3.8,6,7.5,0,0,0", CVAR_ARCHIVE);
|
Cvar_Get ("vr_weapon_adjustment_5", "0.8,-5.2,6,7.5,0,0,0", CVAR_ARCHIVE);
|
||||||
Cvar_Get ("vr_weapon_adjustment_6", "0.8,-3.3,6,7,0,0,0", CVAR_ARCHIVE);
|
Cvar_Get ("vr_weapon_adjustment_6", "0.8,-3.3,6,7,0,0,0", CVAR_ARCHIVE);
|
||||||
Cvar_Get ("vr_weapon_adjustment_7", "0.8,-3.0,6,0,0,0,0", CVAR_ARCHIVE);
|
Cvar_Get ("vr_weapon_adjustment_7", "0.8,-5.5,6,0,0,0,0", CVAR_ARCHIVE);
|
||||||
Cvar_Get ("vr_weapon_adjustment_8", "0.8,-3.5,6,1.5,0,0,0", CVAR_ARCHIVE);
|
Cvar_Get ("vr_weapon_adjustment_8", "0.8,-4.5,6,1.5,0,0,0", CVAR_ARCHIVE);
|
||||||
Cvar_Get ("vr_weapon_adjustment_9", "0.8,-5.5,6,0,0,0,0", CVAR_ARCHIVE);
|
Cvar_Get ("vr_weapon_adjustment_9", "0.8,-5.5,6,0,0,0,0", CVAR_ARCHIVE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,7 +192,7 @@ static float length(float x, float y)
|
||||||
void IN_VRInit( void )
|
void IN_VRInit( void )
|
||||||
{
|
{
|
||||||
vr_righthanded = Cvar_Get ("vr_righthanded", "1", CVAR_ARCHIVE);
|
vr_righthanded = Cvar_Get ("vr_righthanded", "1", CVAR_ARCHIVE);
|
||||||
vr_snapturn = Cvar_Get ("vr_snapturn", "1", CVAR_ARCHIVE);
|
vr_snapturn = Cvar_Get ("vr_snapturn", "45", CVAR_ARCHIVE);
|
||||||
vr_extralatencymode = Cvar_Get ("vr_extralatencymode", "1", CVAR_ARCHIVE);
|
vr_extralatencymode = Cvar_Get ("vr_extralatencymode", "1", CVAR_ARCHIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,20 +273,37 @@ static void IN_VRJoystick( qboolean isRightController, float joystickX, float jo
|
||||||
rotateAboutOrigin(-vr.hmdposition_delta[0] * factor * multiplier,
|
rotateAboutOrigin(-vr.hmdposition_delta[0] * factor * multiplier,
|
||||||
vr.hmdposition_delta[2] * factor * multiplier, - vr.hmdorientation[YAW], positional);
|
vr.hmdposition_delta[2] * factor * multiplier, - vr.hmdorientation[YAW], positional);
|
||||||
|
|
||||||
|
vec2_t joystick;
|
||||||
|
if ( !com_sv_running || !com_sv_running->integer )
|
||||||
|
{
|
||||||
|
//multiplayer server
|
||||||
|
rotateAboutOrigin(joystickX, joystickY, vr.hmdorientation[YAW], joystick);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
joystick[0] = joystickX;
|
||||||
|
joystick[1] = joystickY;
|
||||||
|
}
|
||||||
|
|
||||||
//sideways
|
//sideways
|
||||||
Com_QueueEvent(in_vrEventTime, SE_JOYSTICK_AXIS, 0, joystickX * 127.0f + positional[0] * 127.0f, 0, NULL);
|
Com_QueueEvent(in_vrEventTime, SE_JOYSTICK_AXIS, 0, joystick[0] * 127.0f + positional[0] * 127.0f, 0, NULL);
|
||||||
|
|
||||||
//forward/back
|
//forward/back
|
||||||
Com_QueueEvent(in_vrEventTime, SE_JOYSTICK_AXIS, 1, joystickY * 127.0f + positional[1] * 127.0f, 0, NULL);
|
Com_QueueEvent(in_vrEventTime, SE_JOYSTICK_AXIS, 1, joystick[1] * 127.0f + positional[1] * 127.0f, 0, NULL);
|
||||||
}
|
}
|
||||||
else //right controller
|
else //right controller
|
||||||
{
|
{
|
||||||
//yaw
|
//yaw
|
||||||
if (vr_snapturn->integer)
|
if (vr_snapturn->integer > 0)
|
||||||
{
|
{
|
||||||
|
int snap = 45;
|
||||||
|
if (vr_snapturn->integer > 1)
|
||||||
|
{
|
||||||
|
snap = vr_snapturn->integer;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(controller->axisButtons & VR_TOUCH_AXIS_RIGHT) && joystickX > pressedThreshold) {
|
if (!(controller->axisButtons & VR_TOUCH_AXIS_RIGHT) && joystickX > pressedThreshold) {
|
||||||
controller->axisButtons |= VR_TOUCH_AXIS_RIGHT;
|
controller->axisButtons |= VR_TOUCH_AXIS_RIGHT;
|
||||||
CL_SnapTurn(45);
|
CL_SnapTurn(snap);
|
||||||
} else if ((controller->axisButtons & VR_TOUCH_AXIS_RIGHT) &&
|
} else if ((controller->axisButtons & VR_TOUCH_AXIS_RIGHT) &&
|
||||||
joystickX < releasedThreshold) {
|
joystickX < releasedThreshold) {
|
||||||
controller->axisButtons &= ~VR_TOUCH_AXIS_RIGHT;
|
controller->axisButtons &= ~VR_TOUCH_AXIS_RIGHT;
|
||||||
|
@ -294,7 +311,7 @@ static void IN_VRJoystick( qboolean isRightController, float joystickX, float jo
|
||||||
|
|
||||||
if (!(controller->axisButtons & VR_TOUCH_AXIS_LEFT) && joystickX < -pressedThreshold) {
|
if (!(controller->axisButtons & VR_TOUCH_AXIS_LEFT) && joystickX < -pressedThreshold) {
|
||||||
controller->axisButtons |= VR_TOUCH_AXIS_LEFT;
|
controller->axisButtons |= VR_TOUCH_AXIS_LEFT;
|
||||||
CL_SnapTurn(-45);
|
CL_SnapTurn(-snap);
|
||||||
} else if ((controller->axisButtons & VR_TOUCH_AXIS_LEFT) &&
|
} else if ((controller->axisButtons & VR_TOUCH_AXIS_LEFT) &&
|
||||||
joystickX > -releasedThreshold) {
|
joystickX > -releasedThreshold) {
|
||||||
controller->axisButtons &= ~VR_TOUCH_AXIS_LEFT;
|
controller->axisButtons &= ~VR_TOUCH_AXIS_LEFT;
|
||||||
|
@ -374,7 +391,7 @@ static void IN_VRButtonsChanged( qboolean isRightController, uint32_t buttons )
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((buttons & ovrButton_X) && !(controller->buttons & ovrButton_X)) {
|
if ((buttons & ovrButton_X) && !(controller->buttons & ovrButton_X)) {
|
||||||
sendButtonActionSimple("fraglimit 1");
|
//sendButtonActionSimple("fraglimit 1");
|
||||||
Com_QueueEvent(in_vrEventTime, SE_KEY, K_PAD0_X, qtrue, 0, NULL);
|
Com_QueueEvent(in_vrEventTime, SE_KEY, K_PAD0_X, qtrue, 0, NULL);
|
||||||
} else if (!(buttons & ovrButton_X) && (controller->buttons & ovrButton_X)) {
|
} else if (!(buttons & ovrButton_X) && (controller->buttons & ovrButton_X)) {
|
||||||
Com_QueueEvent(in_vrEventTime, SE_KEY, K_PAD0_X, qfalse, 0, NULL);
|
Com_QueueEvent(in_vrEventTime, SE_KEY, K_PAD0_X, qfalse, 0, NULL);
|
||||||
|
|
Loading…
Reference in a new issue