mirror of
https://github.com/DrBeef/JKXR.git
synced 2025-02-20 19:02:01 +00:00
E11 Blaster Rifle Scope
also a small change to allow proper rendering of the view when controlling an NPC that isn't a droid
This commit is contained in:
parent
d450d55dc8
commit
c372dd455b
13 changed files with 129 additions and 31 deletions
|
@ -810,7 +810,7 @@ void updateHMDOrientation()
|
|||
//Keep this for our records
|
||||
VectorCopy(vr.hmdorientation, vr.hmdorientation_last);
|
||||
|
||||
if (!vr.third_person){
|
||||
if (!vr.third_person && !vr.remote_npc){
|
||||
VectorCopy(vr.hmdorientation, vr.hmdorientation_first);
|
||||
}
|
||||
|
||||
|
@ -874,7 +874,7 @@ void JKVR_GetMove(float *forward, float *side, float *pos_forward, float *pos_si
|
|||
*pitch = vr.weaponangles[PITCH];
|
||||
*roll = 0.0f;
|
||||
}
|
||||
else if (vr.cgzoommode == 2)
|
||||
else if (vr.cgzoommode == 2 || vr.cgzoommode == 4)
|
||||
{
|
||||
*forward = 0.0f;
|
||||
*pos_forward = 0.0f;
|
||||
|
@ -885,6 +885,16 @@ void JKVR_GetMove(float *forward, float *side, float *pos_forward, float *pos_si
|
|||
*pitch = vr.weaponangles[PITCH];
|
||||
*roll = vr.hmdorientation[ROLL];
|
||||
}
|
||||
else if (vr.remote_npc) {
|
||||
*forward = remote_movementForward;
|
||||
*pos_forward = 0.0f;
|
||||
*up = 0.0f;
|
||||
*side = remote_movementSideways;
|
||||
*pos_side = 0.0f;
|
||||
*yaw = vr.hmdorientation[YAW] - vr.hmdorientation_first[YAW];
|
||||
*pitch = vr.hmdorientation[PITCH];
|
||||
*roll = 0.0f;
|
||||
}
|
||||
else if (!vr.third_person) {
|
||||
*forward = remote_movementForward;
|
||||
*pos_forward = positional_movementForward;
|
||||
|
|
|
@ -5,8 +5,12 @@
|
|||
|
||||
typedef struct {
|
||||
bool cin_camera; // cinematic camera taken over
|
||||
|
||||
bool misc_camera; // looking through a misc camera view entity
|
||||
bool remote_turret; // controlling a remote turret
|
||||
bool remote_droid; // controlling a remote droid
|
||||
bool remote_npc; // controlling a remote NPC (will also be true when controlling a droid)
|
||||
|
||||
bool using_screen_layer;
|
||||
bool third_person;
|
||||
float fov;
|
||||
|
|
|
@ -237,20 +237,21 @@ void HandleInput_Default( ovrInputStateGamepad *pFootTrackingNew, ovrInputStateG
|
|||
}
|
||||
|
||||
//Should we trigger the disruptor scope?
|
||||
if (cl.frame.ps.weapon == WP_DISRUPTOR &&
|
||||
if ((cl.frame.ps.weapon == WP_DISRUPTOR ||
|
||||
cl.frame.ps.weapon == WP_BLASTER) &&
|
||||
cl.frame.ps.stats[STAT_HEALTH] > 0)
|
||||
{
|
||||
if (vr.weapon_stabilised &&
|
||||
VectorLength(vr.weaponoffset) < 0.24f &&
|
||||
vr.cgzoommode == 0) {
|
||||
sendButtonAction("disruptorscope", true);
|
||||
sendButtonAction("enterscope", true);
|
||||
} else if ((VectorLength(vr.weaponoffset) >= 0.24f || !vr.weapon_stabilised) &&
|
||||
vr.cgzoommode == 2) {
|
||||
sendButtonActionSimple("exitzoom");
|
||||
(vr.cgzoommode == 2 || vr.cgzoommode == 4)) {
|
||||
sendButtonActionSimple("exitscope");
|
||||
}
|
||||
}
|
||||
|
||||
if (vr.cgzoommode > 0)
|
||||
if (vr.cgzoommode > 0 && vr.cgzoommode < 4)
|
||||
{
|
||||
if (between(-0.2f, primaryJoystickX, 0.2f)) {
|
||||
if (cl.frame.ps.weapon == WP_DISRUPTOR)
|
||||
|
@ -399,7 +400,7 @@ void HandleInput_Default( ovrInputStateGamepad *pFootTrackingNew, ovrInputStateG
|
|||
-degrees(atan2f(x, -z)), 0);
|
||||
}
|
||||
}
|
||||
else if (vr.cgzoommode == 2)
|
||||
else if (vr.cgzoommode == 2 || vr.cgzoommode == 4)
|
||||
{
|
||||
float x =
|
||||
pOff->HeadPose.Pose.Position.x - vr.hmdposition[0];
|
||||
|
@ -724,7 +725,7 @@ void HandleInput_Default( ovrInputStateGamepad *pFootTrackingNew, ovrInputStateG
|
|||
(!vr.third_person && vr_turn_mode->integer == 1);
|
||||
|
||||
static int increaseSnap = true;
|
||||
if (!vr.item_selector) {
|
||||
if (!vr.item_selector && !vr.remote_npc) {
|
||||
if (usingSnapTurn) {
|
||||
if (primaryJoystickX > 0.7f) {
|
||||
if (increaseSnap) {
|
||||
|
|
|
@ -606,7 +606,7 @@ typedef struct {
|
|||
*/
|
||||
|
||||
#define ANGLE2SHORT(x) ((int)((x)*65536/360) & 65535)
|
||||
#define SHORT2ANGLE(x) ((x)*(360.0/65536))
|
||||
#define SHORT2ANGLE(x) ((x)*(360.0f/65536))
|
||||
|
||||
#define SNAPFLAG_RATE_DELAYED 1
|
||||
#define SNAPFLAG_NOT_ACTIVE 2 // snapshot used during connection and for zombies
|
||||
|
|
|
@ -207,8 +207,8 @@ void CG_ItemSelectorSelect_f( void );
|
|||
void CG_ItemSelectorNext_f( void );
|
||||
void CG_ItemSelectorPrev_f( void );
|
||||
void CG_ToggleSaber_f( void );
|
||||
void CG_ExitZoom_f( void );
|
||||
void CG_DisruptorScope_f( void );
|
||||
void CG_ExitScope_f( void );
|
||||
void CG_EnterScope_f( void );
|
||||
|
||||
/* This array MUST be sorted correctly by alphabetical name field */
|
||||
static consoleCommand_t commands[] = {
|
||||
|
@ -251,8 +251,8 @@ static consoleCommand_t commands[] = {
|
|||
{ "itemselectornext", CG_ItemSelectorNext_f },
|
||||
{ "itemselectorprev", CG_ItemSelectorPrev_f },
|
||||
{ "togglesaber", CG_ToggleSaber_f },
|
||||
{ "exitzoom", CG_ExitZoom_f },
|
||||
{ "disruptorscope", CG_DisruptorScope_f },
|
||||
{ "exitscope", CG_ExitScope_f },
|
||||
{ "enterscope", CG_EnterScope_f },
|
||||
};
|
||||
|
||||
static const size_t numCommands = ARRAY_LEN( commands );
|
||||
|
|
|
@ -715,6 +715,47 @@ static qboolean CG_DrawCustomHealthHud( centity_t *cent )
|
|||
return qtrue;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
CG_DrawWeapReticle
|
||||
==============
|
||||
*/
|
||||
static void CG_DrawWeapReticle( void )
|
||||
{
|
||||
vec4_t light_color = {0.7, 0.7, 0.7, 1};
|
||||
vec4_t black = {0.0, 0.0, 0.0, 1};
|
||||
|
||||
float indent = 0.16;
|
||||
float X_WIDTH=640;
|
||||
float Y_HEIGHT=480;
|
||||
|
||||
float x = (X_WIDTH * indent), y = (Y_HEIGHT * indent), w = (X_WIDTH * (1-(2*indent))) / 2.0f, h = (Y_HEIGHT * (1-(2*indent))) / 2;
|
||||
|
||||
// sides
|
||||
CG_FillRect( 0, 0, (X_WIDTH * indent), Y_HEIGHT, black );
|
||||
CG_FillRect( X_WIDTH * (1 - indent), 0, (X_WIDTH * indent), Y_HEIGHT, black );
|
||||
// top/bottom
|
||||
CG_FillRect( X_WIDTH * indent, 0, X_WIDTH * (1-indent), Y_HEIGHT * indent, black );
|
||||
CG_FillRect( X_WIDTH * indent, Y_HEIGHT * (1-indent), X_WIDTH * (1-indent), Y_HEIGHT * indent, black );
|
||||
|
||||
{
|
||||
// center
|
||||
if ( cgs.media.reticleShader ) {
|
||||
cgi_R_DrawStretchPic( x, y, w, h, 0, 0, 1, 1, cgs.media.reticleShader ); // tl
|
||||
cgi_R_DrawStretchPic( x + w, y, w, h, 1, 0, 0, 1, cgs.media.reticleShader ); // tr
|
||||
cgi_R_DrawStretchPic( x, y + h, w, h, 0, 1, 1, 0, cgs.media.reticleShader ); // bl
|
||||
cgi_R_DrawStretchPic( x + w, y + h, w, h, 1, 1, 0, 0, cgs.media.reticleShader ); // br
|
||||
}
|
||||
|
||||
// hairs
|
||||
CG_FillRect( 84, 239, 177, 2, black ); // left
|
||||
CG_FillRect( 320, 242, 1, 58, black ); // center top
|
||||
CG_FillRect( 319, 300, 2, 178, black ); // center bot
|
||||
CG_FillRect( 380, 239, 177, 2, black ); // right
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
static void CG_DrawBatteryCharge( void )
|
||||
{
|
||||
|
@ -1838,7 +1879,7 @@ static void CG_DrawCrosshair3D(int type) // 0 - force, 1 - weapons
|
|||
return;
|
||||
}
|
||||
|
||||
if ( cg.zoomMode > 0 && cg.zoomMode < 3 )
|
||||
if ( cg.zoomMode )
|
||||
{
|
||||
//not while scoped
|
||||
return;
|
||||
|
@ -2490,7 +2531,7 @@ static qboolean CG_RenderingFromMiscCamera()
|
|||
// don't render other 2d stuff
|
||||
return qtrue;
|
||||
}
|
||||
if ( !Q_stricmp( "NPC", g_entities[cg.snap->ps.viewEntity].classname ))
|
||||
if (vr->remote_droid)
|
||||
{
|
||||
//Render as if we are looking through a camera
|
||||
CG_DrawPic( 0, 0, 640, 480, cgi_R_RegisterShader( "gfx/2d/workingCamera" ));
|
||||
|
@ -2573,7 +2614,11 @@ static void CG_Draw2D( void )
|
|||
CGCam_DrawWideScreen();
|
||||
}
|
||||
|
||||
if (cg.zoomMode)
|
||||
if (cg.zoomMode == 4)
|
||||
{
|
||||
CG_DrawWeapReticle();
|
||||
}
|
||||
else if (cg.zoomMode != 0)
|
||||
{
|
||||
CG_DrawZoomBorders();
|
||||
}
|
||||
|
@ -2806,16 +2851,27 @@ void CG_DrawActive( stereoFrame_t stereoView ) {
|
|||
CG_Error( "CG_DrawActive: Undefined stereoView" );
|
||||
}
|
||||
|
||||
vr->remote_npc = !Q_stricmp( "NPC", g_entities[cg.snap->ps.viewEntity].classname );
|
||||
vr->remote_droid = vr->remote_npc &&
|
||||
( !Q_stricmp( "mouse", g_entities[cg.snap->ps.viewEntity].NPC_type) ||
|
||||
!Q_stricmp( "r2d2", g_entities[cg.snap->ps.viewEntity].NPC_type) ||
|
||||
!Q_stricmp( "r5d2", g_entities[cg.snap->ps.viewEntity].NPC_type));
|
||||
|
||||
vr->remote_turret = (!Q_stricmp( "misc_panel_turret", g_entities[cg.snap->ps.viewEntity].classname ));
|
||||
in_misccamera = ( !Q_stricmp( "misc_camera", g_entities[cg.snap->ps.viewEntity].classname ))
|
||||
|| ( !Q_stricmp( "NPC", g_entities[cg.snap->ps.viewEntity].classname )
|
||||
|| vr->remote_turret);
|
||||
|| vr->remote_droid
|
||||
|| vr->remote_turret;
|
||||
bool emplaced_gun = ( cg_entities[cg.snap->ps.clientNum].currentState.eFlags & EF_LOCKED_TO_WEAPON );
|
||||
|
||||
cg.refdef.worldscale = cg_worldScale.value;
|
||||
|
||||
bool usingScope = (cg.zoomMode == 2 || cg.zoomMode == 4);
|
||||
//Normal 1st person view angles
|
||||
if (!in_camera &&
|
||||
!in_misccamera &&
|
||||
cg.zoomMode != 2 &&
|
||||
!vr->remote_droid &&
|
||||
!vr->remote_npc &&
|
||||
!usingScope &&
|
||||
!cg.renderingThirdPerson)
|
||||
{
|
||||
VectorCopy(vr->hmdorientation, cg.refdef.viewangles);
|
||||
|
@ -2824,7 +2880,17 @@ void CG_DrawActive( stereoFrame_t stereoView ) {
|
|||
AnglesToAxis(cg.refdef.viewangles, cg.refdef.viewaxis);
|
||||
}
|
||||
|
||||
if (cg.zoomMode == 2)
|
||||
//Controlling an NPC that isn't a droid
|
||||
if (vr->remote_npc &&
|
||||
!vr->remote_droid)
|
||||
{
|
||||
VectorCopy(vr->hmdorientation, cg.refdef.viewangles);
|
||||
cg.refdef.viewangles[YAW] = cg.refdefViewAngles[YAW]; // Need to do this better.. results in laggy YAW, which is unpleasant
|
||||
AnglesToAxis(cg.refdef.viewangles, cg.refdef.viewaxis);
|
||||
}
|
||||
|
||||
//Sniper/E11 scope
|
||||
if (usingScope)
|
||||
{
|
||||
cg.refdef.viewangles[ROLL] = vr->clientviewangles[ROLL];
|
||||
cg.refdef.viewangles[PITCH] = vr->weaponangles[PITCH];
|
||||
|
@ -2833,6 +2899,7 @@ void CG_DrawActive( stereoFrame_t stereoView ) {
|
|||
AnglesToAxis(cg.refdef.viewangles, cg.refdef.viewaxis);
|
||||
}
|
||||
|
||||
//Normal 3rd person view angles
|
||||
if (!in_camera &&
|
||||
!in_misccamera &&
|
||||
cg.renderingThirdPerson)
|
||||
|
@ -2844,6 +2911,7 @@ void CG_DrawActive( stereoFrame_t stereoView ) {
|
|||
AnglesToAxis(cg.refdef.viewangles, cg.refdef.viewaxis);
|
||||
}
|
||||
|
||||
//Immersive cinematic sequence 6DoF
|
||||
if ((in_camera && vr->immersive_cinematics) || emplaced_gun || cg.renderingThirdPerson)
|
||||
{
|
||||
BG_ConvertFromVR(vr->hmdposition_offset, cg.refdef.vieworg, cg.refdef.vieworg);
|
||||
|
@ -2854,7 +2922,7 @@ void CG_DrawActive( stereoFrame_t stereoView ) {
|
|||
|
||||
// offset vieworg appropriately if we're doing stereo separation
|
||||
VectorCopy( cg.refdef.vieworg, baseOrg );
|
||||
if ( separation != 0 && (!in_camera || vr->immersive_cinematics) && !in_misccamera && cg.zoomMode != 2 ) {
|
||||
if ( separation != 0 && (!in_camera || vr->immersive_cinematics) && !in_misccamera && !usingScope ) {
|
||||
VectorMA( cg.refdef.vieworg, -separation, cg.refdef.viewaxis[1], cg.refdef.vieworg );
|
||||
}
|
||||
|
||||
|
|
|
@ -1309,6 +1309,9 @@ static void CG_RegisterGraphics( void ) {
|
|||
|
||||
cgs.media.boltShader = cgi_R_RegisterShader( "gfx/misc/blueLine" );
|
||||
|
||||
cgs.media.reticleShader = cgi_R_RegisterShader( "gfx/weapon/scope" );
|
||||
|
||||
|
||||
// FIXME: do these conditionally
|
||||
cgi_R_RegisterShader( "gfx/2d/workingCamera" );
|
||||
cgi_R_RegisterShader( "gfx/2d/brokenCamera" );
|
||||
|
|
|
@ -149,6 +149,8 @@ typedef struct {
|
|||
qhandle_t shieldShader;
|
||||
qhandle_t boltShader;
|
||||
|
||||
qhandle_t reticleShader;
|
||||
|
||||
// Disruptor zoom graphics
|
||||
qhandle_t disruptorMask;
|
||||
qhandle_t disruptorInsert;
|
||||
|
|
|
@ -1411,7 +1411,7 @@ static qboolean CG_CalcFov( void ) {
|
|||
fov_x = vr ? vr->fov : cg_fov.value;
|
||||
|
||||
// Disable zooming when in third person
|
||||
if ( cg.zoomMode && cg.zoomMode < 3 )//&& !cg.renderingThirdPerson ) // light amp goggles do none of the zoom silliness
|
||||
if (( cg.zoomMode && cg.zoomMode < 3 ) || cg.zoomMode == 4)//&& !cg.renderingThirdPerson ) // light amp goggles do none of the zoom silliness
|
||||
{
|
||||
if ( !cg.zoomLocked )
|
||||
{
|
||||
|
|
|
@ -2653,7 +2653,7 @@ void Cmd_UseInventory_f(gentity_t *ent);
|
|||
|
||||
extern float cg_zoomFov; //from cg_view.cpp
|
||||
|
||||
void CG_ExitZoom_f( )
|
||||
void CG_ExitScope_f( )
|
||||
{
|
||||
if ( cg.zoomMode )
|
||||
{
|
||||
|
@ -2665,15 +2665,22 @@ void CG_ExitZoom_f( )
|
|||
}
|
||||
}
|
||||
|
||||
void CG_DisruptorScope_f( )
|
||||
void CG_EnterScope_f( )
|
||||
{
|
||||
if ( cg.zoomMode == 0 || cg.zoomMode == 3 )
|
||||
{
|
||||
G_SoundOnEnt( pm->gent, CHAN_AUTO, "sound/weapons/disruptor/zoomstart.wav" );
|
||||
// not already zooming, so do it now
|
||||
cg.zoomMode = 2;
|
||||
cg.zoomLocked = qfalse;
|
||||
cg_zoomFov = 80.0f;//(cg.overrides.active&CG_OVERRIDE_FOV) ? cg.overrides.fov : cg_fov.value;
|
||||
if (cg.weaponSelect == WP_DISRUPTOR) {
|
||||
cg.zoomMode = 2;
|
||||
cg_zoomFov = 80.0f;
|
||||
cg.zoomLocked = qfalse;
|
||||
} else {
|
||||
//Our specially created E11 Blaster scope
|
||||
cg.zoomMode = 4;
|
||||
cg_zoomFov = 30.0f;
|
||||
cg.zoomLocked = qtrue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|||
#include "w_local.h"
|
||||
#include "g_functions.h"
|
||||
#include "bg_local.h"
|
||||
#include <JKVR/VrClientInfo.h>
|
||||
|
||||
//---------------
|
||||
// Blaster
|
||||
|
@ -137,9 +138,11 @@ void WP_FireBlaster( gentity_t *ent, qboolean alt_fire )
|
|||
}
|
||||
else
|
||||
{
|
||||
// add some slop to the main-fire direction
|
||||
angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD;
|
||||
angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD;
|
||||
if (vr->cgzoommode != 4) { // much more accurate if using the scope
|
||||
// add some slop to the main-fire direction
|
||||
angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD;
|
||||
angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Binary file not shown.
BIN
z_vr_assets/gfx/weapon/scope.tga
Normal file
BIN
z_vr_assets/gfx/weapon/scope.tga
Normal file
Binary file not shown.
Loading…
Reference in a new issue