mirror of
https://github.com/DrBeef/Doom3Quest.git
synced 2025-02-21 11:31:34 +00:00
Haptics
Weapon haptics working rather nicely! World shake also triggers haptics Velocity triggered attack for the flashlight and chainsaw vr_chibi (thanks to RBDOOM-BFG) just for a bit of a laugh
This commit is contained in:
parent
a8f3d92ee0
commit
6defa52225
14 changed files with 122 additions and 69 deletions
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.drbeef.doom3quest"
|
package="com.drbeef.doom3quest"
|
||||||
android:versionCode="1"
|
android:versionCode="3"
|
||||||
android:versionName="0.0.1" android:installLocation="auto" >
|
android:versionName="0.0.9" android:installLocation="auto" >
|
||||||
|
|
||||||
<!-- Tell the system this app requires OpenGL ES 3.1. -->
|
<!-- Tell the system this app requires OpenGL ES 3.1. -->
|
||||||
<uses-feature android:glEsVersion="0x00030001" android:required="true"/>
|
<uses-feature android:glEsVersion="0x00030001" android:required="true"/>
|
||||||
|
|
|
@ -20,7 +20,7 @@ typedef struct {
|
||||||
bool dualwield;
|
bool dualwield;
|
||||||
int weaponid;
|
int weaponid;
|
||||||
int lastweaponid;
|
int lastweaponid;
|
||||||
int backpackitemactive; //0 - nothing, 1 - grenades, 2 - knife, 3 - Binoculars
|
int holsteritemactive; //0 - nothing, 1 - flashlight
|
||||||
bool mountedgun;
|
bool mountedgun;
|
||||||
|
|
||||||
vec3_t hmdposition;
|
vec3_t hmdposition;
|
||||||
|
|
|
@ -11,7 +11,7 @@ enum control_scheme;
|
||||||
#define SCOPE_ENGAGE_DISTANCE 0.25
|
#define SCOPE_ENGAGE_DISTANCE 0.25
|
||||||
#define VSTOCK_ENGAGE_DISTANCE 0.25
|
#define VSTOCK_ENGAGE_DISTANCE 0.25
|
||||||
#define BINOCULAR_ENGAGE_DISTANCE 0.25
|
#define BINOCULAR_ENGAGE_DISTANCE 0.25
|
||||||
#define VELOCITY_TRIGGER 1.6
|
#define VELOCITY_TRIGGER 1.4
|
||||||
|
|
||||||
ovrInputStateTrackedRemote leftTrackedRemoteState_old;
|
ovrInputStateTrackedRemote leftTrackedRemoteState_old;
|
||||||
ovrInputStateTrackedRemote leftTrackedRemoteState_new;
|
ovrInputStateTrackedRemote leftTrackedRemoteState_new;
|
||||||
|
|
|
@ -60,6 +60,7 @@ int Sys_Milliseconds( void ) {
|
||||||
|
|
||||||
void Android_SetImpuse(int impulse);
|
void Android_SetImpuse(int impulse);
|
||||||
void Android_SetCommand(const char * cmd);
|
void Android_SetCommand(const char * cmd);
|
||||||
|
void Android_ButtonChange(int key, int state);
|
||||||
|
|
||||||
extern bool inMenu;
|
extern bool inMenu;
|
||||||
extern bool inGameGuiActive;
|
extern bool inGameGuiActive;
|
||||||
|
@ -248,7 +249,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
|
|
||||||
if (fired != velocityTriggeredAttack) {
|
if (fired != velocityTriggeredAttack) {
|
||||||
ALOGV("**WEAPON EVENT** veocity triggered %s", velocityTriggeredAttack ? "+attack" : "-attack");
|
ALOGV("**WEAPON EVENT** veocity triggered %s", velocityTriggeredAttack ? "+attack" : "-attack");
|
||||||
sendButtonAction("+attack", velocityTriggeredAttack);
|
Android_ButtonChange(UB_ATTACK, velocityTriggeredAttack ? 1 : 0);
|
||||||
fired = velocityTriggeredAttack;
|
fired = velocityTriggeredAttack;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -257,7 +258,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
//send a stop attack as we have an unfinished velocity attack
|
//send a stop attack as we have an unfinished velocity attack
|
||||||
velocityTriggeredAttack = false;
|
velocityTriggeredAttack = false;
|
||||||
ALOGV("**WEAPON EVENT** veocity triggered -attack");
|
ALOGV("**WEAPON EVENT** veocity triggered -attack");
|
||||||
sendButtonAction("+attack", velocityTriggeredAttack);
|
Android_ButtonChange(UB_ATTACK, velocityTriggeredAttack ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pVRClientInfo->weapon_stabilised)
|
if (pVRClientInfo->weapon_stabilised)
|
||||||
|
@ -280,7 +281,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
if (pDominantTracking->Status & (VRAPI_TRACKING_STATUS_POSITION_TRACKED | VRAPI_TRACKING_STATUS_POSITION_VALID)) {
|
if (pDominantTracking->Status & (VRAPI_TRACKING_STATUS_POSITION_TRACKED | VRAPI_TRACKING_STATUS_POSITION_VALID)) {
|
||||||
canUseBackpack = false;
|
canUseBackpack = false;
|
||||||
}
|
}
|
||||||
else if (!canUseBackpack && pVRClientInfo->backpackitemactive == 0) {
|
else if (!canUseBackpack && pVRClientInfo->holsteritemactive == 0) {
|
||||||
int channel = (vr_control_scheme >= 10) ? 0 : 1;
|
int channel = (vr_control_scheme >= 10) ? 0 : 1;
|
||||||
Doom3Quest_Vibrate(40, channel, 0.5); // vibrate to let user know they can switch
|
Doom3Quest_Vibrate(40, channel, 0.5); // vibrate to let user know they can switch
|
||||||
|
|
||||||
|
@ -289,10 +290,6 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
|
|
||||||
dominantGripPushed = (pDominantTrackedRemoteNew->Buttons &
|
dominantGripPushed = (pDominantTrackedRemoteNew->Buttons &
|
||||||
ovrButton_GripTrigger) != 0;
|
ovrButton_GripTrigger) != 0;
|
||||||
bool dominantButton1Pushed = (pDominantTrackedRemoteNew->Buttons &
|
|
||||||
domButton1) != 0;
|
|
||||||
bool dominantButton2Pushed = (pDominantTrackedRemoteNew->Buttons &
|
|
||||||
domButton2) != 0;
|
|
||||||
|
|
||||||
if (!canUseBackpack)
|
if (!canUseBackpack)
|
||||||
{
|
{
|
||||||
|
@ -303,60 +300,33 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (pVRClientInfo->backpackitemactive == 1) {
|
if (pVRClientInfo->holsteritemactive == 1) {
|
||||||
//Restores last used weapon if possible
|
//Restores last used weapon if possible
|
||||||
if (pVRClientInfo->weaponid != -1) {
|
if (pVRClientInfo->weaponid != -1) {
|
||||||
Android_SetImpuse(UB_IMPULSE0 + pVRClientInfo->weaponid);
|
Android_SetImpuse(UB_IMPULSE0 + pVRClientInfo->weaponid);
|
||||||
}
|
}
|
||||||
pVRClientInfo->backpackitemactive = 0;
|
pVRClientInfo->holsteritemactive = 0;
|
||||||
}
|
}
|
||||||
else if ((GetTimeInMilliSeconds() - dominantGripPushTime) < vr_reloadtimeoutms) {
|
else if ((GetTimeInMilliSeconds() - dominantGripPushTime) < vr_reloadtimeoutms) {
|
||||||
|
|
||||||
|
//Reload
|
||||||
Android_SetImpuse(UB_IMPULSE13);
|
Android_SetImpuse(UB_IMPULSE13);
|
||||||
}
|
}
|
||||||
|
|
||||||
dominantGripPushTime = 0;
|
dominantGripPushTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dominantButton1Pushed && pVRClientInfo->backpackitemactive == 2)
|
|
||||||
{
|
|
||||||
//Restores last used weapon if possible
|
|
||||||
if (pVRClientInfo->weaponid != -1) {
|
|
||||||
Android_SetImpuse(UB_IMPULSE0 + pVRClientInfo->weaponid);
|
|
||||||
}
|
|
||||||
pVRClientInfo->backpackitemactive = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!dominantButton2Pushed && pVRClientInfo->backpackitemactive == 3)
|
|
||||||
{
|
|
||||||
pVRClientInfo->backpackitemactive = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (pVRClientInfo->backpackitemactive == 0) {
|
if (pVRClientInfo->holsteritemactive == 0) {
|
||||||
if (dominantGripPushed) {
|
if (dominantGripPushed) {
|
||||||
pVRClientInfo->lastweaponid = pVRClientInfo->weaponid;
|
pVRClientInfo->lastweaponid = pVRClientInfo->weaponid;
|
||||||
|
|
||||||
//Initiate flashlight from backpack mode
|
//Initiate flashlight from backpack mode
|
||||||
Android_SetImpuse(UB_IMPULSE11);
|
Android_SetImpuse(UB_IMPULSE11);
|
||||||
int channel = (vr_control_scheme >= 10) ? 0 : 1;
|
int channel = (vr_control_scheme >= 10) ? 0 : 1;
|
||||||
Doom3Quest_Vibrate(80, channel, 0.8); // vibrate to let user know they switched
|
Doom3Quest_Vibrate(80, channel, 0.8); // vibrate to let user know they switched
|
||||||
pVRClientInfo->backpackitemactive = 1;
|
|
||||||
}
|
|
||||||
/*else if (dominantButton1Pushed)
|
|
||||||
{
|
|
||||||
pVRClientInfo->lastweaponid = pVRClientInfo->weaponid;
|
|
||||||
|
|
||||||
//Initiate knife from backpack mode
|
pVRClientInfo->holsteritemactive = 1;
|
||||||
sendButtonActionSimple("weapon 1");
|
|
||||||
int channel = (vr_control_scheme >= 10) ? 0 : 1;
|
|
||||||
Doom3Quest_Vibrate(80, channel, 0.8); // vibrate to let user know they switched
|
|
||||||
pVRClientInfo->backpackitemactive = 2;
|
|
||||||
}
|
}
|
||||||
else if (dominantButton2Pushed && pVRClientInfo->hasbinoculars)
|
|
||||||
{
|
|
||||||
int channel = (vr_control_scheme >= 10) ? 0 : 1;
|
|
||||||
Doom3Quest_Vibrate(80, channel, 0.8); // vibrate to let user know they switched
|
|
||||||
pVRClientInfo->backpackitemactive = 3;
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -399,7 +369,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
positional_movementForward = v[1];
|
positional_movementForward = v[1];
|
||||||
|
|
||||||
//Jump (B Button)
|
//Jump (B Button)
|
||||||
if (pVRClientInfo->backpackitemactive != 2 && !canUseBackpack) {
|
if (pVRClientInfo->holsteritemactive != 2 && !canUseBackpack) {
|
||||||
|
|
||||||
if ((primaryButtonsNew & primaryButton2) != (primaryButtonsOld & primaryButton2))
|
if ((primaryButtonsNew & primaryButton2) != (primaryButtonsOld & primaryButton2))
|
||||||
{
|
{
|
||||||
|
@ -409,7 +379,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
|
|
||||||
|
|
||||||
//Fire Primary
|
//Fire Primary
|
||||||
if (pVRClientInfo->backpackitemactive != 3 && // Can't fire while holding binoculars
|
if (pVRClientInfo->holsteritemactive != 3 && // Can't fire while holding binoculars
|
||||||
!pVRClientInfo->velocitytriggered && // Don't fire velocity triggered weapons
|
!pVRClientInfo->velocitytriggered && // Don't fire velocity triggered weapons
|
||||||
(pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) !=
|
(pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) !=
|
||||||
(pDominantTrackedRemoteOld->Buttons & ovrButton_Trigger)) {
|
(pDominantTrackedRemoteOld->Buttons & ovrButton_Trigger)) {
|
||||||
|
@ -420,7 +390,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
|
||||||
}
|
}
|
||||||
|
|
||||||
//Duck
|
//Duck
|
||||||
if (pVRClientInfo->backpackitemactive != 2 &&
|
if (pVRClientInfo->holsteritemactive != 2 &&
|
||||||
!canUseBackpack &&
|
!canUseBackpack &&
|
||||||
(primaryButtonsNew & primaryButton1) !=
|
(primaryButtonsNew & primaryButton1) !=
|
||||||
(primaryButtonsOld & primaryButton1)) {
|
(primaryButtonsOld & primaryButton1)) {
|
||||||
|
|
|
@ -162,7 +162,9 @@ public:
|
||||||
virtual int ButtonState( int key );
|
virtual int ButtonState( int key );
|
||||||
virtual int KeyState( int key );
|
virtual int KeyState( int key );
|
||||||
|
|
||||||
// DG: hack to allow adding callbacks and exporting additional functions without breaking the game ABI
|
virtual void Vibrate(int duration, int channel, float intensity );
|
||||||
|
|
||||||
|
// DG: hack to allow adding callbacks and exporting additional functions without breaking the game ABI
|
||||||
// see Common.h for longer explanation...
|
// see Common.h for longer explanation...
|
||||||
|
|
||||||
// returns true if setting the callback was successful, else false
|
// returns true if setting the callback was successful, else false
|
||||||
|
@ -2382,6 +2384,13 @@ void idCommonLocal::InitSIMD( void ) {
|
||||||
|
|
||||||
extern "C" void Doom3Quest_setUseScreenLayer(int use);
|
extern "C" void Doom3Quest_setUseScreenLayer(int use);
|
||||||
extern "C" void Doom3Quest_FrameSetup();
|
extern "C" void Doom3Quest_FrameSetup();
|
||||||
|
extern "C" void Doom3Quest_Vibrate(int duration, int channel, float intensity );
|
||||||
|
|
||||||
|
void idCommonLocal::Vibrate(int duration, int channel, float intensity )
|
||||||
|
{
|
||||||
|
Doom3Quest_Vibrate(duration, channel, intensity );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
|
|
|
@ -212,6 +212,9 @@ public:
|
||||||
// Directly sample a keystate.
|
// Directly sample a keystate.
|
||||||
virtual int KeyState( int key ) = 0;
|
virtual int KeyState( int key ) = 0;
|
||||||
|
|
||||||
|
//Haptic Feedback
|
||||||
|
virtual void Vibrate(int duration, int channel, float intensity ) = 0;
|
||||||
|
|
||||||
/* Some Mods (like Ruiner and DarkMod when it still was a mod) used "SourceHook"
|
/* Some Mods (like Ruiner and DarkMod when it still was a mod) used "SourceHook"
|
||||||
* to override Doom3 Methods to call their own code before the original method
|
* to override Doom3 Methods to call their own code before the original method
|
||||||
* was executed.. this is super ugly and probably not super portable either.
|
* was executed.. this is super ugly and probably not super portable either.
|
||||||
|
|
|
@ -459,6 +459,26 @@ void idAFAttachment::Think( void ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
idAfAttachment::GetPhysicsToVisualTransform
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
idCVar vr_chibi("vr_chibi", "1.0", CVAR_FLOAT | CVAR_ARCHIVE, "changes the size of human heads.");
|
||||||
|
bool idAFAttachment::GetPhysicsToVisualTransform( idVec3& origin, idMat3& axis )
|
||||||
|
{
|
||||||
|
const float scale = vr_chibi.GetFloat();
|
||||||
|
if( scale > 0.f && scale != 1.0f )
|
||||||
|
{
|
||||||
|
static const idVec3 offset( -1.8f, 0, -8.f);
|
||||||
|
axis = mat3_identity * scale;
|
||||||
|
origin = (scale - 1.f) / scale * offset;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
idAFAttachment::SetCombatModel
|
idAFAttachment::SetCombatModel
|
||||||
|
|
|
@ -131,6 +131,8 @@ public:
|
||||||
virtual void LinkCombat( void );
|
virtual void LinkCombat( void );
|
||||||
virtual void UnlinkCombat( void );
|
virtual void UnlinkCombat( void );
|
||||||
|
|
||||||
|
virtual bool GetPhysicsToVisualTransform( idVec3& origin, idMat3& axis );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
idEntity * body;
|
idEntity * body;
|
||||||
idClipModel * combatModel; // render model for hit detection of head
|
idClipModel * combatModel; // render model for hit detection of head
|
||||||
|
|
|
@ -6236,7 +6236,15 @@ void idPlayer::Think( void ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear the ik before we do anything else so the skeleton doesn't get updated twice
|
if (pVRClientInfo != nullptr)
|
||||||
|
{
|
||||||
|
pVRClientInfo->weaponid = currentWeapon;
|
||||||
|
cvarSystem->SetCVarBool("vr_weapon_stabilised", pVRClientInfo->weapon_stabilised);
|
||||||
|
pVRClientInfo->velocitytriggered = (currentWeapon == 11 || // 11 is flashlight
|
||||||
|
currentWeapon == 10); // 10 is chainsaw
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear the ik before we do anything else so the skeleton doesn't get updated twice
|
||||||
walkIK.ClearJointMods();
|
walkIK.ClearJointMods();
|
||||||
|
|
||||||
// if this is the very first frame of the map, set the delta view angles
|
// if this is the very first frame of the map, set the delta view angles
|
||||||
|
@ -6418,11 +6426,6 @@ void idPlayer::Think( void ) {
|
||||||
playerView.CalculateShake();
|
playerView.CalculateShake();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pVRClientInfo != nullptr)
|
|
||||||
{
|
|
||||||
pVRClientInfo->weaponid = currentWeapon;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !( thinkFlags & TH_THINK ) ) {
|
if ( !( thinkFlags & TH_THINK ) ) {
|
||||||
gameLocal.Printf( "player %d not thinking?\n", entityNumber );
|
gameLocal.Printf( "player %d not thinking?\n", entityNumber );
|
||||||
}
|
}
|
||||||
|
@ -6620,6 +6623,12 @@ void idPlayer::DamageFeedback( idEntity *victim, idEntity *inflictor, int &damag
|
||||||
if ( damage && ( victim != this ) && victim->IsType( idActor::Type ) ) {
|
if ( damage && ( victim != this ) && victim->IsType( idActor::Type ) ) {
|
||||||
SetLastHitTime( gameLocal.time );
|
SetLastHitTime( gameLocal.time );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (victim == this)
|
||||||
|
{
|
||||||
|
common->Vibrate(250, 0, damage / 50);
|
||||||
|
common->Vibrate(250, 1, damage / 50);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -7306,7 +7315,7 @@ idVec3 idPlayer::GetEyePosition( void ) const {
|
||||||
if (pVRClientInfo)
|
if (pVRClientInfo)
|
||||||
{
|
{
|
||||||
float eyeHeight = 0;
|
float eyeHeight = 0;
|
||||||
float vrEyeHeight = (-pVRClientInfo->hmdposition[1] * cvarSystem->GetCVarFloat( "vr_worldscale" ));
|
float vrEyeHeight = (-(pVRClientInfo->hmdposition[1] + cvarSystem->GetCVarFloat( "vr_heightoffset" )) * cvarSystem->GetCVarFloat( "vr_worldscale" ));
|
||||||
|
|
||||||
//Add special handling for physical crouching at some point
|
//Add special handling for physical crouching at some point
|
||||||
/* if (physicsObj.IsCrouching() && PHYSICAL_CROUCH) {
|
/* if (physicsObj.IsCrouching() && PHYSICAL_CROUCH) {
|
||||||
|
@ -8215,6 +8224,11 @@ void idPlayer::ReadFromSnapshot( const idBitMsgDelta &msg ) {
|
||||||
if ( weapon.GetEntity() ) {
|
if ( weapon.GetEntity() ) {
|
||||||
weapon.GetEntity()->OwnerDied();
|
weapon.GetEntity()->OwnerDied();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
common->Vibrate(250, 0, 1.0);
|
||||||
|
common->Vibrate(250, 1, 1.0);
|
||||||
|
}
|
||||||
} else if ( oldHealth <= 0 && health > 0 ) {
|
} else if ( oldHealth <= 0 && health > 0 ) {
|
||||||
// respawn
|
// respawn
|
||||||
Init();
|
Init();
|
||||||
|
@ -8235,6 +8249,11 @@ void idPlayer::ReadFromSnapshot( const idBitMsgDelta &msg ) {
|
||||||
} else {
|
} else {
|
||||||
common->Warning( "NET: no damage def for damage feedback '%d'\n", lastDamageDef );
|
common->Warning( "NET: no damage def for damage feedback '%d'\n", lastDamageDef );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
common->Vibrate(250, 0, 0.6);
|
||||||
|
common->Vibrate(250, 1, 0.6);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if ( health > oldHealth && PowerUpActive( MEGAHEALTH ) && !stateHitch ) {
|
} else if ( health > oldHealth && PowerUpActive( MEGAHEALTH ) && !stateHitch ) {
|
||||||
// just pulse, for any health raise
|
// just pulse, for any health raise
|
||||||
|
|
|
@ -369,6 +369,20 @@ void idPlayerView::WeaponFireFeedback( const idDict *weaponDef ) {
|
||||||
kickFinishTime = finish;
|
kickFinishTime = finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Defined for the VR weapons - defaults in case they are missing
|
||||||
|
float controllerShakeHighMag = weaponDef->GetFloat( "controllerShakeHighMag", "1.0" );
|
||||||
|
int controllerShakeHighTime = weaponDef->GetInt( "controllerShakeHighTime", "0" );
|
||||||
|
bool rightHanded = cvarSystem->GetCVarInteger("vr_control_scheme") == 0;
|
||||||
|
if (controllerShakeHighTime == 0)
|
||||||
|
{
|
||||||
|
controllerShakeHighTime = recoilTime / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
common->Vibrate(controllerShakeHighTime, rightHanded ? 1 : 0, controllerShakeHighMag);
|
||||||
|
if (cvarSystem->GetCVarBool("vr_weapon_stabilised"))
|
||||||
|
{
|
||||||
|
common->Vibrate(controllerShakeHighTime, rightHanded ? 0 : 1, controllerShakeHighMag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -389,6 +403,12 @@ void idPlayerView::CalculateShake() {
|
||||||
shakeAng[0] = gameLocal.random.CRandomFloat() * shakeVolume;
|
shakeAng[0] = gameLocal.random.CRandomFloat() * shakeVolume;
|
||||||
shakeAng[1] = gameLocal.random.CRandomFloat() * shakeVolume;
|
shakeAng[1] = gameLocal.random.CRandomFloat() * shakeVolume;
|
||||||
shakeAng[2] = gameLocal.random.CRandomFloat() * shakeVolume;
|
shakeAng[2] = gameLocal.random.CRandomFloat() * shakeVolume;
|
||||||
|
|
||||||
|
if (shakeVolume > 0.05) {
|
||||||
|
//Shake controllers!
|
||||||
|
common->Vibrate(50, 0, idMath::ClampFloat(0.3, 1.0, (shakeVolume*2.0f + 0.1f)));
|
||||||
|
common->Vibrate(50, 1, idMath::ClampFloat(0.3, 1.0, (shakeVolume*2.0f + 0.1f)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1102,12 +1102,15 @@ void idWeapon::UpdateFlashPosition( void ) {
|
||||||
GetGlobalJointTransform( true, flashJointView, muzzleFlash.origin, muzzleFlash.axis );
|
GetGlobalJointTransform( true, flashJointView, muzzleFlash.origin, muzzleFlash.axis );
|
||||||
|
|
||||||
// if the desired point is inside or very close to a wall, back it up until it is clear
|
// if the desired point is inside or very close to a wall, back it up until it is clear
|
||||||
idVec3 start = muzzleFlash.origin - playerViewAxis[0] * 16;
|
//idVec3 start = muzzleFlash.origin - playerViewAxis[0] * 16;
|
||||||
idVec3 end = muzzleFlash.origin + playerViewAxis[0] * 8;
|
idVec3 start = muzzleFlash.origin - viewWeaponAxis[0] * 16;
|
||||||
|
//idVec3 end = muzzleFlash.origin + playerViewAxis[0] * 8;
|
||||||
|
idVec3 end = muzzleFlash.origin + viewWeaponAxis[0] * 8;
|
||||||
trace_t tr;
|
trace_t tr;
|
||||||
gameLocal.clip.TracePoint( tr, start, end, MASK_SHOT_RENDERMODEL, owner );
|
gameLocal.clip.TracePoint( tr, start, end, MASK_SHOT_RENDERMODEL, owner );
|
||||||
// be at least 8 units away from a solid
|
// be at least 8 units away from a solid
|
||||||
muzzleFlash.origin = tr.endpos - playerViewAxis[0] * 8;
|
//muzzleFlash.origin = tr.endpos - playerViewAxis[0] * 8;
|
||||||
|
muzzleFlash.origin = tr.endpos - viewWeaponAxis[0] * 8;
|
||||||
|
|
||||||
// put the world muzzle flash on the end of the joint, no matter what
|
// put the world muzzle flash on the end of the joint, no matter what
|
||||||
GetGlobalJointTransform( false, flashJointWorld, worldMuzzleFlash.origin, worldMuzzleFlash.axis );
|
GetGlobalJointTransform( false, flashJointWorld, worldMuzzleFlash.origin, worldMuzzleFlash.axis );
|
||||||
|
@ -2876,9 +2879,8 @@ void idWeapon::Event_LaunchProjectiles( int num_projectiles, float spread, float
|
||||||
// there is an explicit joint for the muzzle
|
// there is an explicit joint for the muzzle
|
||||||
GetGlobalJointTransform( true, barrelJointView, muzzleOrigin, muzzleAxis );
|
GetGlobalJointTransform( true, barrelJointView, muzzleOrigin, muzzleAxis );
|
||||||
} else {
|
} else {
|
||||||
// go straight out of the view
|
muzzleOrigin = viewWeaponOrigin;
|
||||||
muzzleOrigin = playerViewOrigin;
|
muzzleAxis = viewWeaponAxis;
|
||||||
muzzleAxis = playerViewAxis;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add some to the kick time, incrementally moving repeat firing weapons back
|
// add some to the kick time, incrementally moving repeat firing weapons back
|
||||||
|
@ -2895,11 +2897,13 @@ void idWeapon::Event_LaunchProjectiles( int num_projectiles, float spread, float
|
||||||
// predict instant hit projectiles
|
// predict instant hit projectiles
|
||||||
if ( projectileDict.GetBool( "net_instanthit" ) ) {
|
if ( projectileDict.GetBool( "net_instanthit" ) ) {
|
||||||
float spreadRad = DEG2RAD( spread );
|
float spreadRad = DEG2RAD( spread );
|
||||||
muzzle_pos = muzzleOrigin + playerViewAxis[ 0 ] * 2.0f;
|
//muzzle_pos = muzzleOrigin + playerViewAxis[ 0 ] * 2.0f;
|
||||||
|
muzzle_pos = muzzleOrigin + viewWeaponAxis[ 0 ] * 2.0f;
|
||||||
for( i = 0; i < num_projectiles; i++ ) {
|
for( i = 0; i < num_projectiles; i++ ) {
|
||||||
ang = idMath::Sin( spreadRad * gameLocal.random.RandomFloat() );
|
ang = idMath::Sin( spreadRad * gameLocal.random.RandomFloat() );
|
||||||
spin = (float)DEG2RAD( 360.0f ) * gameLocal.random.RandomFloat();
|
spin = (float)DEG2RAD( 360.0f ) * gameLocal.random.RandomFloat();
|
||||||
dir = playerViewAxis[ 0 ] + playerViewAxis[ 2 ] * ( ang * idMath::Sin( spin ) ) - playerViewAxis[ 1 ] * ( ang * idMath::Cos( spin ) );
|
//dir = playerViewAxis[ 0 ] + playerViewAxis[ 2 ] * ( ang * idMath::Sin( spin ) ) - playerViewAxis[ 1 ] * ( ang * idMath::Cos( spin ) );
|
||||||
|
dir = viewWeaponAxis[ 0 ] + viewWeaponAxis[ 2 ] * ( ang * idMath::Sin( spin ) ) - viewWeaponAxis[ 1 ] * ( ang * idMath::Cos( spin ) );
|
||||||
dir.Normalize();
|
dir.Normalize();
|
||||||
gameLocal.clip.Translation( tr, muzzle_pos, muzzle_pos + dir * 4096.0f, NULL, mat3_identity, MASK_SHOT_RENDERMODEL, owner );
|
gameLocal.clip.Translation( tr, muzzle_pos, muzzle_pos + dir * 4096.0f, NULL, mat3_identity, MASK_SHOT_RENDERMODEL, owner );
|
||||||
if ( tr.fraction < 1.0f ) {
|
if ( tr.fraction < 1.0f ) {
|
||||||
|
@ -3000,8 +3004,9 @@ void idWeapon::Event_Melee( void ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !gameLocal.isClient ) {
|
if ( !gameLocal.isClient ) {
|
||||||
idVec3 start = playerViewOrigin;
|
idVec3 start = viewWeaponOrigin;
|
||||||
idVec3 end = start + playerViewAxis[0] * ( meleeDistance * owner->PowerUpModifier( MELEE_DISTANCE ) );
|
//idVec3 end = start + playerViewAxis[0] * ( meleeDistance * owner->PowerUpModifier( MELEE_DISTANCE ) );
|
||||||
|
idVec3 end = start + viewWeaponAxis[0] * ( meleeDistance * owner->PowerUpModifier( MELEE_DISTANCE ) );
|
||||||
gameLocal.clip.TracePoint( tr, start, end, MASK_SHOT_RENDERMODEL, owner );
|
gameLocal.clip.TracePoint( tr, start, end, MASK_SHOT_RENDERMODEL, owner );
|
||||||
if ( tr.fraction < 1.0f ) {
|
if ( tr.fraction < 1.0f ) {
|
||||||
ent = gameLocal.GetTraceEntity( tr );
|
ent = gameLocal.GetTraceEntity( tr );
|
||||||
|
@ -3163,7 +3168,8 @@ void idWeapon::Event_EjectBrass( void ) {
|
||||||
debris->Create( owner, origin, axis );
|
debris->Create( owner, origin, axis );
|
||||||
debris->Launch();
|
debris->Launch();
|
||||||
|
|
||||||
linear_velocity = 40 * ( playerViewAxis[0] + playerViewAxis[1] + playerViewAxis[2] );
|
//linear_velocity = 40 * ( playerViewAxis[0] + playerViewAxis[1] + playerViewAxis[2] );
|
||||||
|
linear_velocity = 40 * ( viewWeaponAxis[0] + viewWeaponAxis[1] + viewWeaponAxis[2] );
|
||||||
angular_velocity.Set( 10 * gameLocal.random.CRandomFloat(), 10 * gameLocal.random.CRandomFloat(), 10 * gameLocal.random.CRandomFloat() );
|
angular_velocity.Set( 10 * gameLocal.random.CRandomFloat(), 10 * gameLocal.random.CRandomFloat(), 10 * gameLocal.random.CRandomFloat() );
|
||||||
|
|
||||||
debris->GetPhysics()->SetLinearVelocity( linear_velocity );
|
debris->GetPhysics()->SetLinearVelocity( linear_velocity );
|
||||||
|
|
|
@ -339,7 +339,9 @@ idCVar net_serverDlTable( "net_serverDlTable", "", CVAR_GAME | CVAR_ARCHIV
|
||||||
|
|
||||||
|
|
||||||
idCVar vr_ipd( "vr_ipd", "0.065", CVAR_GAME | CVAR_FLOAT | CVAR_ARCHIVE, "VR IPD" );
|
idCVar vr_ipd( "vr_ipd", "0.065", CVAR_GAME | CVAR_FLOAT | CVAR_ARCHIVE, "VR IPD" );
|
||||||
idCVar vr_worldscale( "vr_worldscale", "40.0", CVAR_GAME | CVAR_FLOAT | CVAR_ARCHIVE, "VR World Scale" );
|
idCVar vr_worldscale( "vr_worldscale", "45.0", CVAR_GAME | CVAR_FLOAT | CVAR_ARCHIVE, "VR World Scale" );
|
||||||
|
idCVar vr_heightoffset( "vr_heightoffset", "0.0", CVAR_GAME | CVAR_FLOAT | CVAR_ARCHIVE, "VR Height Offset" );
|
||||||
idCVar vr_eye( "vr_eye", "0", CVAR_GAME | CVAR_INTEGER, "VR Eye currently being drawn" );
|
idCVar vr_eye( "vr_eye", "0", CVAR_GAME | CVAR_INTEGER, "VR Eye currently being drawn" );
|
||||||
|
idCVar vr_control_scheme( "vr_control_scheme", "0", CVAR_GAME | CVAR_INTEGER, "VR Control Scheme: 0 = right handed, 10 = left handed" );
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -255,6 +255,8 @@ extern idCVar net_clientLagOMeter;
|
||||||
extern idCVar vr_ipd;
|
extern idCVar vr_ipd;
|
||||||
extern idCVar vr_worldscale;
|
extern idCVar vr_worldscale;
|
||||||
extern idCVar vr_eye;
|
extern idCVar vr_eye;
|
||||||
|
extern idCVar vr_heightoffset;
|
||||||
|
extern idCVar vr_control_scheme;
|
||||||
|
|
||||||
extern const char *si_gameTypeArgs[];
|
extern const char *si_gameTypeArgs[];
|
||||||
|
|
||||||
|
|
|
@ -300,7 +300,7 @@ void idDeviceContext::SetMenuScaleForVR( bool enable ) {
|
||||||
float offsetX = (1.0f - scaleX) * (VIRTUAL_WIDTH * 0.5f);
|
float offsetX = (1.0f - scaleX) * (VIRTUAL_WIDTH * 0.5f);
|
||||||
float offsetY = (1.0f - scaleY) * (VIRTUAL_HEIGHT * 0.5f);
|
float offsetY = (1.0f - scaleY) * (VIRTUAL_HEIGHT * 0.5f);
|
||||||
fixScaleForMenu.Set(scaleX, scaleY);
|
fixScaleForMenu.Set(scaleX, scaleY);
|
||||||
fixOffsetForMenu.Set(offsetX + (eye==0 ? 14 : -14), offsetY);
|
fixOffsetForMenu.Set(offsetX + (eye==0 ? 20 : -20), offsetY);
|
||||||
} else {
|
} else {
|
||||||
fixScaleForMenu.Set(1, 1);
|
fixScaleForMenu.Set(1, 1);
|
||||||
fixOffsetForMenu.Set(0, 0);
|
fixOffsetForMenu.Set(0, 0);
|
||||||
|
|
Loading…
Reference in a new issue