Compare commits

...

6 commits

Author SHA1 Message Date
Simon
193c3f4765 Speed up build
use all processors and fix lint issue
2024-05-06 13:30:19 +01:00
Simon
ee4dd3b857 Build in latest Android Studio 2024-05-06 13:26:47 +01:00
Grant Bagwell
e680ff2675 Doom 1.3 - Quest 3 Realtime Shadows
Credit to Lubos for Multi-view stencil fix.
New Quest 3 default
Shadow Optimisations
New Menu additions
2023-10-14 23:26:12 +02:00
Simon
88c4f85455 Fixes a problem with older thumbsticks misreporting the X value 2022-09-04 14:32:02 +01:00
Simon
97bf74cbe6 Update to allow additional external haptics providers
all must support the haptic service interface
2021-12-03 22:56:37 +00:00
Simon
5ca43984e0 Finish removal of the useHapticsService cvar 2021-05-15 19:11:22 +01:00
15 changed files with 523 additions and 86 deletions

View file

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.drbeef.doom3quest"
android:versionCode="24"
android:versionName="1.2.0" android:installLocation="auto" >
android:versionCode="27"
android:versionName="1.2.3"
android:installLocation="auto">
<!-- Tell the system this app requires OpenGL ES 3.1. -->
@ -17,7 +18,11 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application android:allowBackup="false" android:icon="@drawable/ic_qquest" android:label="@string/doom3quest">
<application android:allowBackup="false"
android:icon="@drawable/ic_qquest"
android:label="@string/doom3quest"
android:extractNativeLibs="true">
<meta-data android:name="com.samsung.android.vr.application.mode" android:value="vr_only"/>
<meta-data android:name="com.oculus.supportedDevices" android:value="quest|quest2"/>
<!-- The activity is the built-in NativeActivity framework class. -->

View file

@ -1,5 +1,15 @@
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
}
}
apply plugin: 'com.android.application'
apply from: "${rootProject.projectDir}/VrApp.gradle"
android {
// This is the name of the generated apk file, which will have
@ -20,13 +30,21 @@ android {
abiFilters 'arm64-v8a'
}
ndkBuild {
abiFilters 'arm64-v8a'
def numProcs = Runtime.runtime.availableProcessors()
arguments "V=0", "-j$numProcs", "-C$project.buildDir.parent", "APP_PLATFORM=android-29", "NDK_TOOLCHAIN_VERSION=clang", "APP_STL=c++_static"
abiFilters 'arm64-v8a'
}
}
minSdkVersion 26
targetSdkVersion 26
}
externalNativeBuild {
ndkBuild {
path file('jni/Android.mk')
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
@ -36,12 +54,19 @@ android {
assets.srcDirs = ['../../assets']
}
}
lintOptions {
checkReleaseBuilds false
disable 'ExpiredTargetSdkVersion'
}
compileOptions {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
compileSdkVersion = 26
buildToolsVersion = '29.0.1'
ndkVersion '21.1.6352462'
/* buildTypes {
release {
debuggable true
@ -62,4 +87,4 @@ buildscript {
repositories {
google()
}
}
}

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip

View file

@ -82,7 +82,7 @@ PFNEGLGETSYNCATTRIBKHRPROC eglGetSyncAttribKHR;
//Let's go to the maximum!
const int CPU_LEVEL = 4;
const int GPU_LEVEL = 4;
const int GPU_LEVEL = 5;
//Passed in from the Java code
int NUM_MULTI_SAMPLES = -1;
@ -578,7 +578,7 @@ static bool ovrFramebuffer_Create(
// Create the depth buffer texture.
GL(glGenTextures(1, &frameBuffer->DepthBuffers[i]));
GL(glBindTexture(GL_TEXTURE_2D_ARRAY, frameBuffer->DepthBuffers[i]));
GL(glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_DEPTH_COMPONENT24, width, height, 2));
GL(glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_DEPTH24_STENCIL8, width, height, 2));
GL(glBindTexture(GL_TEXTURE_2D_ARRAY, 0));
// Create the frame buffer.
@ -593,6 +593,14 @@ static bool ovrFramebuffer_Create(
multisamples /* samples */,
0 /* baseViewIndex */,
2 /* numViews */));
GL(glFramebufferTextureMultisampleMultiviewOVR(
GL_DRAW_FRAMEBUFFER,
GL_STENCIL_ATTACHMENT,
frameBuffer->DepthBuffers[i],
0 /* level */,
multisamples /* samples */,
0 /* baseViewIndex */,
2 /* numViews */));
GL(glFramebufferTextureMultisampleMultiviewOVR(
GL_DRAW_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
@ -609,6 +617,13 @@ static bool ovrFramebuffer_Create(
0 /* level */,
0 /* baseViewIndex */,
2 /* numViews */));
GL(glFramebufferTextureMultiviewOVR(
GL_DRAW_FRAMEBUFFER,
GL_STENCIL_ATTACHMENT,
frameBuffer->DepthBuffers[i],
0 /* level */,
0 /* baseViewIndex */,
2 /* numViews */));
GL(glFramebufferTextureMultiviewOVR(
GL_DRAW_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
@ -633,7 +648,7 @@ static bool ovrFramebuffer_Create(
GL(glGenRenderbuffers(1, &frameBuffer->DepthBuffers[i]));
GL(glBindRenderbuffer(GL_RENDERBUFFER, frameBuffer->DepthBuffers[i]));
GL(glRenderbufferStorageMultisampleEXT(
GL_RENDERBUFFER, multisamples, GL_DEPTH_COMPONENT24, width, height));
GL_RENDERBUFFER, multisamples, GL_DEPTH24_STENCIL8, width, height));
GL(glBindRenderbuffer(GL_RENDERBUFFER, 0));
// Create the frame buffer.
@ -652,6 +667,11 @@ static bool ovrFramebuffer_Create(
GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER,
frameBuffer->DepthBuffers[i]));
GL(glFramebufferRenderbuffer(
GL_FRAMEBUFFER,
GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER,
frameBuffer->DepthBuffers[i]));
GL(GLenum renderFramebufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER));
GL(glBindFramebuffer(GL_FRAMEBUFFER, 0));
if (renderFramebufferStatus != GL_FRAMEBUFFER_COMPLETE) {
@ -675,6 +695,11 @@ static bool ovrFramebuffer_Create(
GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER,
frameBuffer->DepthBuffers[i]));
GL(glFramebufferRenderbuffer(
GL_DRAW_FRAMEBUFFER,
GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER,
frameBuffer->DepthBuffers[i]));
GL(glFramebufferTexture2D(
GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0));
GL(GLenum renderFramebufferStatus = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
@ -720,8 +745,8 @@ void ovrFramebuffer_SetNone()
void ovrFramebuffer_Resolve( ovrFramebuffer * frameBuffer )
{
// Discard the depth buffer, so the tiler won't need to write it back out to memory.
const GLenum depthAttachment[1] = { GL_DEPTH_ATTACHMENT };
glInvalidateFramebuffer( GL_DRAW_FRAMEBUFFER, 1, depthAttachment );
const GLenum depthAttachment[2] = { GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT };
glInvalidateFramebuffer( GL_DRAW_FRAMEBUFFER, 2, depthAttachment );
}
void ovrFramebuffer_Advance( ovrFramebuffer * frameBuffer )
@ -1612,9 +1637,30 @@ void * AppThreadFunction(void * parm ) {
NUM_MULTI_SAMPLES = 1;
}
}
else if (vrapi_GetSystemPropertyInt(&java, VRAPI_SYS_PROP_SUGGESTED_EYE_FOV_DEGREES_Y) > 101)
{
questType = 3;
if (DISPLAY_REFRESH == -1)
{
DISPLAY_REFRESH = 72.0;
}
if (SS_MULTIPLIER == -1.0f)
{
SS_MULTIPLIER = 1.1f;
}
if (NUM_MULTI_SAMPLES == -1)
{
NUM_MULTI_SAMPLES = 1;
}
}
else if (vrapi_GetSystemPropertyInt(&java, VRAPI_SYS_PROP_DEVICE_TYPE) == VRAPI_DEVICE_TYPE_OCULUSQUEST2)
{
questType = 2;
if (DISPLAY_REFRESH == -1)
{
DISPLAY_REFRESH = 60.0;
}
if (SS_MULTIPLIER == -1.0f)
{
SS_MULTIPLIER = 1.1f;
@ -1654,6 +1700,32 @@ void * AppThreadFunction(void * parm ) {
showLoadingIcon();
}
int maximumSupportRefresh = 0;
//AmmarkoV : Query Refresh rates and select maximum..!
//-----------------------------------------------------------------------------------------------------------
int numberOfRefreshRates = vrapi_GetSystemPropertyInt(&java,
VRAPI_SYS_PROP_NUM_SUPPORTED_DISPLAY_REFRESH_RATES);
float refreshRatesArray[16]; //Refresh rates are currently (12/2020) the following 4 : 60.0 / 72.0 / 80.0 / 90.0
if (numberOfRefreshRates > 16) { numberOfRefreshRates = 16; }
vrapi_GetSystemPropertyFloatArray(&java, VRAPI_SYS_PROP_SUPPORTED_DISPLAY_REFRESH_RATES,
&refreshRatesArray[0], numberOfRefreshRates);
for (int i = 0; i < numberOfRefreshRates; i++) {
ALOGV("Supported refresh rate : %d Hz", refreshRatesArray[i]);
if (maximumSupportRefresh < refreshRatesArray[i]) {
maximumSupportRefresh = refreshRatesArray[i];
}
}
if (maximumSupportRefresh > 90.0) {
ALOGV("Soft limiting to 90.0 Hz as per John carmack's request ( https://www.onlinepeeps.org/oculus-quest-2-according-to-carmack-in-the-future-also-at-120-hz/ );P");
maximumSupportRefresh = 90.0;
}
if (DISPLAY_REFRESH == 0 || DISPLAY_REFRESH > maximumSupportRefresh)
{
DISPLAY_REFRESH = 72.0;
}
//Should now be all set up and ready - start the Doom3 main loop
VR_Doom3Main(argc, argv);

View file

@ -525,11 +525,19 @@ void HandleInput_Default( int controlscheme, int switchsticks, ovrInputStateGame
int vr_turn_mode = Android_GetCVarInteger("vr_turnmode");
float vr_turn_angle = Android_GetCVarInteger("vr_turnangle");
//This fixes a problem with older thumbsticks misreporting the X value
static float joyx[4] = {0};
for (int j = 3; j > 0; --j)
joyx[j] = joyx[j-1];
joyx[0] = pPrimaryJoystick->x;
float joystickX = (joyx[0] + joyx[1] + joyx[2] + joyx[3]) / 4.0f;
//No snap turn when using mounted gun
snapTurn = 0;
static int increaseSnap = true;
{
if (pPrimaryJoystick->x > 0.7f) {
if (joystickX > 0.7f) {
if (increaseSnap) {
float turnAngle = vr_turn_mode ? (vr_turn_angle / 9.0f) : vr_turn_angle;
snapTurn -= turnAngle;
@ -544,12 +552,12 @@ void HandleInput_Default( int controlscheme, int switchsticks, ovrInputStateGame
} else {
snapTurn = 0;
}
} else if (pPrimaryJoystick->x < 0.3f) {
} else if (joystickX < 0.2f) {
increaseSnap = true;
}
static int decreaseSnap = true;
if (pPrimaryJoystick->x < -0.7f) {
if (joystickX < -0.7f) {
if (decreaseSnap) {
float turnAngle = vr_turn_mode ? (vr_turn_angle / 9.0f) : vr_turn_angle;
@ -567,7 +575,7 @@ void HandleInput_Default( int controlscheme, int switchsticks, ovrInputStateGame
} else {
snapTurn = 0;
}
} else if (pPrimaryJoystick->x > -0.3f) {
} else if (joystickX > -0.2f) {
decreaseSnap = true;
}
}

View file

@ -41,7 +41,7 @@ If you have questions concerning this license or the applicable additional terms
#define GAME_NAME "Doom3Quest" // appears on window titles and errors
#endif
#define ENGINE_VERSION "Doom3Quest 1.2.0" // printed in console
#define ENGINE_VERSION "Doom3Quest 1.2.3" // printed in console
#ifdef ID_REPRODUCIBLE_BUILD
// for reproducible builds we hardcode values that would otherwise come from __DATE__ and __TIME__

View file

@ -64,7 +64,7 @@ idCVar r_useNodeCommonChildren( "r_useNodeCommonChildren", "1", CVAR_RENDERER |
idCVar r_useShadowProjectedCull( "r_useShadowProjectedCull", "1", CVAR_RENDERER | CVAR_BOOL, "discard triangles outside light volume before shadowing" );
idCVar r_useShadowSurfaceScissor( "r_useShadowSurfaceScissor", "1", CVAR_RENDERER | CVAR_BOOL, "scissor shadows by the scissor rect of the interaction surfaces" );
idCVar r_useInteractionTable( "r_useInteractionTable", "1", CVAR_RENDERER | CVAR_BOOL, "create a full entityDefs * lightDefs table to make finding interactions faster" );
idCVar r_useTurboShadow( "r_useTurboShadow", "1", CVAR_RENDERER | CVAR_BOOL, "use the infinite projection with W technique for dynamic shadows" );
idCVar r_useTurboShadow( "r_useTurboShadow", "0", CVAR_RENDERER | CVAR_BOOL | CVAR_ARCHIVE, "use the infinite projection with W technique for dynamic shadows" );
idCVar r_useDeferredTangents( "r_useDeferredTangents", "1", CVAR_RENDERER | CVAR_BOOL, "defer tangents calculations after deform" );
idCVar r_useCachedDynamicModels( "r_useCachedDynamicModels", "1", CVAR_RENDERER | CVAR_BOOL, "cache snapshots of dynamic models" );
idCVar r_useStateCaching( "r_useStateCaching", "1", CVAR_RENDERER | CVAR_BOOL, "avoid redundant state changes in GL_*() calls" );
@ -133,7 +133,7 @@ idCVar r_lightSourceRadius( "r_lightSourceRadius", "0", CVAR_RENDERER | CVAR_FLO
idCVar r_flareSize( "r_flareSize", "1", CVAR_RENDERER | CVAR_FLOAT, "scale the flare deforms from the material def" );
idCVar r_useExternalShadows( "r_useExternalShadows", "1", CVAR_RENDERER | CVAR_INTEGER, "1 = skip drawing caps when outside the light volume, 2 = force to no caps for testing", 0, 2, idCmdSystem::ArgCompletion_Integer<0,2> );
idCVar r_useOptimizedShadows( "r_useOptimizedShadows", "1", CVAR_RENDERER | CVAR_BOOL, "use the dmap generated static shadow volumes" );
idCVar r_useOptimizedShadows( "r_useOptimizedShadows", "1", CVAR_RENDERER | CVAR_BOOL | CVAR_ARCHIVE, "use the dmap generated static shadow volumes" );
idCVar r_useScissor( "r_useScissor", "1", CVAR_RENDERER | CVAR_BOOL, "scissor clip as portals and lights are processed" );
idCVar r_screenFraction( "r_screenFraction", "100", CVAR_RENDERER | CVAR_INTEGER, "for testing fill rate, the resolution of the entire screen can be changed" );

View file

@ -1357,7 +1357,6 @@ void idSoundWorldLocal::ReadFromSaveGame( idFile *savefile ) {
}
//Only concerned with registering looping sounds with the haptics service
if (cvarSystem->GetCVarBool("vr_useHapticsService"))
{
bool looping = (def->parms.soundShaderFlags & SSF_LOOPING) != 0;
if (looping)
@ -1769,8 +1768,7 @@ void idSoundWorldLocal::AddChannelContribution( idSoundEmitterLocal *sound, idSo
float inputSamples[MIXBUFFER_SAMPLES*2+16];
float *alignedInputSamples = (float *) ( ( ( (intptr_t)inputSamples ) + 15 ) & ~15 );
if (cvarSystem->GetCVarBool("vr_useHapticsService") &&
looping)
if (looping)
{
idVec3 direction = (listenerPos / DOOM_TO_METERS) - sound->origin;

View file

@ -1,4 +1 @@
rootProject.projectDir = new File(settingsDir, '../../../..')
rootProject.name = "Doom3Quest"
include ':', 'VrSamples:Doom3Quest:Projects:Android'

Binary file not shown.

View file

@ -232,7 +232,7 @@ seta vr_crouchMode "0"
seta vr_moveThirdPerson "1"
seta vr_playerBodyMode "0"
seta vr_moveClick "0"
seta vr_movePoint "1"
seta vr_movePoint "2"
seta vr_comfortRepeat "100"
seta vr_pdaPitch "30"
seta vr_pdaPosZ "5.0"

View file

@ -162,7 +162,7 @@ seta g_password ""
seta g_showBrass "1"
seta g_showProjectilePct "0"
seta g_showHud "1"
seta g_showPlayerShadow "0"
seta g_showPlayerShadow "1"
seta g_showcamerainfo "0"
seta g_healthTakeLimit "25"
seta g_healthTakeAmt "5"
@ -193,7 +193,7 @@ seta si_gameType "singleplayer"
seta si_name "dhewm server"
seta g_spectatorChat "0"
seta net_clientLagOMeter "1"
seta g_weaponShadows "0"
seta g_weaponShadows "1"
seta g_useWeaponDepthHack "0"
seta g_xp_bind_run_once "0"
seta vr_weaponHand "0"
@ -232,7 +232,7 @@ seta vr_crouchMode "0"
seta vr_moveThirdPerson "1"
seta vr_playerBodyMode "0"
seta vr_moveClick "0"
seta vr_movePoint "1"
seta vr_movePoint "2"
seta vr_comfortRepeat "100"
seta vr_pdaPitch "30"
seta vr_pdaPosZ "5.0"

308
assets/quest3_default.cfg Normal file
View file

@ -0,0 +1,308 @@
unbindall
bind "TAB" "_impulse19"
bind "ENTER" "_button2"
bind "ESCAPE" "togglemenu"
bind "SPACE" "_moveup"
bind "/" "_impulse14"
bind "0" "_impulse10"
bind "1" "_impulse0"
bind "2" "_impulse1"
bind "3" "_impulse2"
bind "4" "_impulse3"
bind "5" "_impulse4"
bind "6" "_impulse5"
bind "7" "_impulse6"
bind "8" "_impulse7"
bind "9" "_impulse8"
bind "[" "_impulse15"
bind "\" "_mlook"
bind "]" "_impulse14"
bind "a" "_moveleft"
bind "c" "_movedown"
bind "d" "_moveright"
bind "f" "_impulse11"
bind "q" "_impulse9"
bind "r" "_impulse13"
bind "s" "_back"
bind "t" "clientMessageMode"
bind "w" "_forward"
bind "y" "clientMessageMode 1"
bind "z" "_zoom"
bind "BACKSPACE" "clientDropWeapon"
bind "PAUSE" "pause"
bind "UPARROW" "_forward"
bind "DOWNARROW" "_back"
bind "LEFTARROW" "_left"
bind "RIGHTARROW" "_right"
bind "ALT" "_strafe"
bind "CTRL" "_attack"
bind "SHIFT" "_speed"
bind "DEL" "_lookdown"
bind "PGDN" "_lookup"
bind "END" "_impulse18"
bind "F1" "_impulse28"
bind "F2" "_impulse29"
bind "F3" "_impulse17"
bind "F5" "savegame quick"
bind "F6" "_impulse20"
bind "F7" "_impulse22"
bind "F9" "loadgame quick"
bind "F12" "screenshot"
bind "MOUSE1" "_attack"
bind "MOUSE2" "_moveup"
bind "MOUSE3" "_zoom"
bind "MWHEELDOWN" "_impulse14"
bind "MWHEELUP" "_impulse15"
seta sys_lang "english"
seta in_kbd "english"
seta gui_mediumFontLimit "0.60"
seta gui_smallFontLimit "0.30"
seta s_decompressionLimit "6"
seta s_useEAXReverb "1"
seta s_numberOfSpeakers "2"
seta s_doorDistanceAdd "150"
seta s_globalFraction "0.8"
seta s_subFraction "0.75"
seta s_playDefaultSound "1"
seta s_volume_dB "0"
seta s_meterTopTime "2000"
seta s_reverse "0"
seta s_spatializationDecay "2"
seta s_maxSoundsPerShader "1"
seta s_device "default"
seta gui_filter_game "0"
seta gui_filter_idle "0"
seta gui_filter_gameType "0"
seta gui_filter_players "0"
seta gui_filter_password "0"
seta net_clientDownload "1"
seta net_master4 ""
seta net_master3 ""
seta net_master2 ""
seta net_master1 ""
seta net_clientMaxRate "16000"
seta net_serverMaxClientRate "16000"
seta com_guid ""
seta com_fixedTic "0"
seta com_skipTics "1"
seta gui_configServerRate "0"
seta m_strafeSmooth "4"
seta m_smooth "1"
seta m_strafeScale "6.25"
seta m_yaw "0.022"
seta m_pitch "0.022"
seta sensitivity "5"
seta in_toggleZoom "0"
seta in_toggleCrouch "1"
seta in_toggleRun "0"
seta in_alwaysRun "0"
seta in_freeLook "1"
seta in_anglespeedkey "1.5"
seta in_pitchspeed "140"
seta in_yawspeed "140"
seta com_preloadDemos "0"
seta com_compressDemos "1"
seta com_product_lang_ext "1"
seta com_showFPS "0"
seta com_purgeAll "1"
seta vr_msaa "2"
seta vr_supersampling "1.1"
seta vr_refresh "72"
seta r_scaleMenusTo43 "1"
seta r_debugArrowStep "120"
seta r_debugLineWidth "1"
seta r_debugLineDepthTest "0"
seta r_forceLoadImages "0"
seta r_shadows "1"
seta r_skipBump "0"
seta r_skipSpecular "0"
seta r_skipNewAmbient "1"
seta r_brightness "1.480604"
seta r_gamma "1"
seta r_swapInterval "1"
seta r_customHeight "486"
seta r_customWidth "720"
seta r_fullscreen "0"
seta r_mode "3"
seta r_multiSamples "0"
seta image_downSizeLimit "256"
seta image_downSizeBumpLimit "256"
seta image_downSizeSpecularLimit "64"
seta image_downSizeBump "0"
seta image_downSizeSpecular "0"
seta image_roundDown "1"
seta image_forceDownSize "0"
seta image_downSize "0"
seta image_preload "1"
seta image_anisotropy "0"
seta image_filter "GL_LINEAR_MIPMAP_LINEAR"
seta g_projectileLights "0"
seta g_hitEffect "0"
seta g_doubleVision "0"
seta g_decals "1"
seta g_muzzleFlash "1"
seta vr_hudmode "0"
seta vr_turnangle "45"
seta vr_turnmode "0"
seta vr_throwables "1"
seta vr_weaponsight "1"
seta vr_knockback "0"
seta vr_shakeamplitude "1.0"
seta vr_heightoffset "0.0"
seta vr_ipd "0.065"
seta net_serverDlTable ""
seta net_serverDlBaseURL ""
seta net_serverDownload "0"
seta mod_validSkins "skins/characters/player/marine_mp;skins/characters/player/marine_mp_green;skins/characters/player/marine_mp_blue;skins/characters/player/marine_mp_red;skins/characters/player/marine_mp_yellow"
seta g_mapCycle "mapcycle"
seta g_voteFlags "0"
seta g_gameReviewPause "10"
seta g_countDown "10"
seta g_password ""
seta g_showBrass "1"
seta g_showProjectilePct "0"
seta g_showHud "1"
seta g_showPlayerShadow "1"
seta g_showcamerainfo "0"
seta g_healthTakeLimit "25"
seta g_healthTakeAmt "5"
seta g_healthTakeTime "5"
seta g_useDynamicProtection "1"
seta g_armorProtectionMP "0.6"
seta g_armorProtection "0.3"
seta g_damageScale "1"
seta g_nightmare "0"
seta g_bloodEffects "1"
seta r_aspectRatio "-1"
seta ui_showGun "1"
seta ui_autoReload "1"
seta ui_autoSwitch "0"
seta ui_team "Red"
seta ui_skin "skins/characters/player/marine_mp"
seta ui_name "Player"
seta si_serverURL ""
seta si_spectators "1"
seta si_usePass "0"
seta si_warmup "0"
seta si_teamDamage "0"
seta si_timeLimit "10"
seta si_fragLimit "10"
seta si_maxPlayers "4"
seta si_map "game/mp/d3dm1"
seta si_gameType "singleplayer"
seta si_name "dhewm server"
seta g_spectatorChat "0"
seta net_clientLagOMeter "1"
seta g_weaponShadows "1"
seta g_useWeaponDepthHack "0"
seta g_xp_bind_run_once "0"
seta vr_weaponHand "0"
seta vr_throwPower "3.5"
seta vr_rumbleChainsaw "1"
seta vr_dualWield "2"
seta vr_contextSensitive "1"
seta vr_mustEmptyHands "0"
seta vr_gripMode "0"
seta vr_weaponCycleMode "0"
seta vr_headshotMultiplier "2.5"
seta vr_headshotMultiplierRecruit "1.8"
seta vr_headshotMultiplierNormal "1.5"
seta vr_headshotMultiplierHard "1.25"
seta vr_headshotMultiplierNightmare "1.1"
seta vr_shotgunChoke "90"
seta vr_instantAccel "1"
seta vr_cinematics "0"
seta vr_autoSwitchControllers "1"
seta vr_handSwapsAnalogs "0"
seta vr_strobeTime "500"
seta vr_motionSickness "0"
seta vr_teleportThroughDoors "0"
seta vr_teleportMaxTravel "950"
seta vr_teleportMode "0"
seta vr_teleport "2"
seta vr_useHandPoses "0"
seta vr_teleportHint "0"
seta vr_teleportButtonMode "0"
seta vr_teleportShowAimAssist "0"
seta vr_teleportSkipHandrails "0"
seta vr_frameCheck "1"
seta vr_crouchHideBody "1"
seta vr_crouchTriggerDist "7"
seta vr_crouchMode "0"
seta vr_moveThirdPerson "1"
seta vr_playerBodyMode "0"
seta vr_moveClick "0"
seta vr_movePoint "2"
seta vr_comfortRepeat "100"
seta vr_pdaPitch "30"
seta vr_pdaPosZ "5.0"
seta vr_pdaPosY "4.0"
seta vr_pdaPosX "6.0"
seta vr_headbbox "10.0"
seta vr_walkSpeedAdjust "20.0"
seta vr_stepSmooth "1"
seta vr_jumpBounce "0"
seta vr_3dgui "1"
seta vr_mountedWeaponController "0"
seta vr_mountz "0"
seta vr_mounty "0"
seta vr_mountx "0"
seta vr_vcz "0"
seta vr_vcy "0"
seta vr_vcx "0"
seta vr_controllerOffsetX "-1.4"
seta vr_controllerOffsetY "-1.32"
seta vr_controllerOffsetZ "-0.9"
seta vr_nodalZ "-6"
seta vr_nodalX "-3"
seta vr_motionFlashPitchAdj "0"
seta vr_motionWeaponPitchAdj "17.354475"
seta vr_weaponSightToSurface "1"
seta vr_deadzoneYaw "30"
seta vr_deadzonePitch "90"
seta vr_joystickMenuMapping "1"
seta vr_headKick "0"
seta vr_disableWeaponAnimation "1"
seta vr_wristStatMon "2"
seta vr_hudLowHealth "20"
seta vr_hudOcclusion "1"
seta vr_hudTransparency "1"
seta vr_hudRevealAngle "40"
seta vr_hudType "1"
seta vr_hudPosLock "1"
seta vr_hudPosAngle "30"
seta vr_hudPosDist "24"
seta vr_hudPosVert "4"
seta vr_hudPosHorz "0"
seta vr_hudScale "0.95"
seta vr_guiMode "2"
seta vr_guiSeparation ".01"
seta vr_guiScale "1"
seta vr_weaponPivotForearmLength "16"
seta vr_weaponPivotOffsetVertical "0"
seta vr_weaponPivotOffsetHorizontal "0"
seta vr_weaponPivotOffsetForward "3"
seta vr_PDAfixLocation "0"
seta vr_forward_keyhole "11.25"
seta vr_flashlightHelmetPosZ "-20"
seta vr_flashlightHelmetPosY "-6"
seta vr_flashlightHelmetPosX "6"
seta vr_flashlightBodyPosZ "0"
seta vr_flashlightBodyPosY "0"
seta vr_flashlightBodyPosX "0"
seta vr_flashlightStrict "0"
seta vr_flashlightMode "3"
seta vr_normalViewHeight "73"
seta vr_useFloorHeight "1"
seta vr_scale "1.0"
seta g_laserSightLength "1000"
seta g_laserSightWidth "0.3"
seta vr_slotDisable "0"
seta vr_slotDur "18"
seta vr_slotMag "0.1"
seta vr_laserSightUseOffset "1"
seta vr_guiFocusPitchAdj "7"
seta vr_wipScale "1.0"
seta vr_grabberBeamWidth "4"
seta vr_headScale "1.085"
seta vr_switchSticks "0"

View file

@ -5,22 +5,18 @@ package com.drbeef.doom3quest;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.util.Pair;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import com.drbeef.externalhapticsservice.HapticServiceClient;
@ -33,18 +29,29 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Vector;
import com.drbeef.externalhapticsservice.HapticsConstants;
import static android.system.Os.setenv;
@SuppressLint("SdCardPath") public class GLES3JNIActivity extends Activity implements SurfaceHolder.Callback
{
// Load the gles3jni library right away to make sure JNI_OnLoad() gets called as the very first thing.
private Vector<HapticServiceClient> externalHapticsServiceClients = new Vector<>();
//Use a vector of pairs, it is possible a given package _could_ in the future support more than one haptic service
//so a map here of Package -> Action would not work.
private static Vector<Pair<String, String>> externalHapticsServiceDetails = new Vector<>();
static
{
System.loadLibrary( "doom3" );
}
private HapticServiceClient externalHapticsServiceClient = null;
//Add possible external haptic service details here
externalHapticsServiceDetails.add(Pair.create(HapticsConstants.BHAPTICS_PACKAGE, HapticsConstants.BHAPTICS_ACTION_FILTER));
externalHapticsServiceDetails.add(Pair.create(HapticsConstants.FORCETUBE_PACKAGE, HapticsConstants.FORCETUBE_ACTION_FILTER));
}
private int permissionCount = 0;
private static final int READ_EXTERNAL_STORAGE_PERMISSION_ID = 1;
@ -68,78 +75,86 @@ import static android.system.Os.setenv;
public void haptic_event(String event, int position, int flags, int intensity, float angle, float yHeight) {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticEvent(APPLICATION, event, position, flags, intensity, angle, yHeight);
}
catch (RemoteException r)
{
Log.v(APPLICATION, r.toString());
for (HapticServiceClient externalHapticsServiceClient : externalHapticsServiceClients) {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticEvent(APPLICATION, event, position, flags, intensity, angle, yHeight);
}
catch (RemoteException r)
{
Log.v(APPLICATION, r.toString());
}
}
}
}
public void haptic_updateevent(String event, int intensity, float angle) {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticUpdateEvent(APPLICATION, event, intensity, angle);
}
catch (RemoteException r)
{
Log.v(APPLICATION, r.toString());
for (HapticServiceClient externalHapticsServiceClient : externalHapticsServiceClients) {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticUpdateEvent(APPLICATION, event, intensity, angle);
} catch (RemoteException r) {
Log.v(APPLICATION, r.toString());
}
}
}
}
public void haptic_stopevent(String event) {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticStopEvent(APPLICATION, event);
}
catch (RemoteException r)
{
Log.v(APPLICATION, r.toString());
for (HapticServiceClient externalHapticsServiceClient : externalHapticsServiceClients) {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticStopEvent(APPLICATION, event);
} catch (RemoteException r) {
Log.v(APPLICATION, r.toString());
}
}
}
}
public void haptic_endframe() {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticFrameTick();
}
catch (RemoteException r)
{
Log.v(APPLICATION, r.toString());
for (HapticServiceClient externalHapticsServiceClient : externalHapticsServiceClients) {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticFrameTick();
} catch (RemoteException r) {
Log.v(APPLICATION, r.toString());
}
}
}
}
public void haptic_enable() {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticEnable();
}
catch (RemoteException r)
{
Log.v(APPLICATION, r.toString());
for (HapticServiceClient externalHapticsServiceClient : externalHapticsServiceClients) {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticEnable();
} catch (RemoteException r) {
Log.v(APPLICATION, r.toString());
}
}
}
}
public void haptic_disable() {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticDisable();
}
catch (RemoteException r)
{
Log.v(APPLICATION, r.toString());
for (HapticServiceClient externalHapticsServiceClient : externalHapticsServiceClients) {
if (externalHapticsServiceClient.hasService()) {
try {
externalHapticsServiceClient.getHapticsService().hapticDisable();
} catch (RemoteException r) {
Log.v(APPLICATION, r.toString());
}
}
}
}
@ -211,6 +226,7 @@ import static android.system.Os.setenv;
//these so forcefully overwrite
copy_asset("/sdcard/Doom3Quest/config/base", "quest1_default.cfg", true);
copy_asset("/sdcard/Doom3Quest/config/base", "quest2_default.cfg", true);
copy_asset("/sdcard/Doom3Quest/config/base", "quest3_default.cfg", true);
if (exitAfterCopy)
{
@ -255,10 +271,13 @@ import static android.system.Os.setenv;
}
//GB Change per headset defaults
//Parse the config file for these values
long refresh = 60; // Default to 60
long refresh = -1; // Let the Surface View Default this
float ss = -1.0F;
long msaa = 1; // default for both HMDs
String configFileName = "/sdcard/Doom3Quest/config/base/doom3quest.cfg";
if(new File(configFileName).exists())
{
@ -293,12 +312,15 @@ import static android.system.Os.setenv;
}
}
externalHapticsServiceClient = new HapticServiceClient(this, (state, desc) -> {
Log.v(APPLICATION, "ExternalHapticsService is:" + desc);
});
externalHapticsServiceClient.bindService();
for (Pair<String, String> serviceDetail : externalHapticsServiceDetails) {
HapticServiceClient client = new HapticServiceClient(this, (state, desc) -> {
Log.v(APPLICATION, "ExternalHapticsService " + serviceDetail.second + ": " + desc);
}, new Intent(serviceDetail.second)
.setPackage(serviceDetail.first));
client.bindService();
externalHapticsServiceClients.add(client);
}
mNativeHandle = GLES3JNILib.onCreate( this, commandLineParams, refresh, ss, msaa );
}
@ -403,7 +425,9 @@ import static android.system.Os.setenv;
GLES3JNILib.onDestroy(mNativeHandle);
}
externalHapticsServiceClient.stopBinding();
for (HapticServiceClient externalHapticsServiceClient : externalHapticsServiceClients) {
externalHapticsServiceClient.stopBinding();
}
super.onDestroy();
mNativeHandle = 0;