Changes for PCVR build

This commit is contained in:
Simon 2023-07-27 23:24:35 +01:00
parent 5010b6ff54
commit e0b65748a0
13 changed files with 220 additions and 47 deletions

View file

@ -27,7 +27,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "../rd-common/tr_font.h"
#ifdef _WIN32
extern refimport_t *ri;
extern refimport_t ri;
#endif
/*

View file

@ -28,6 +28,7 @@ if(BuildSPRdVanilla OR BuildJK2SPRdVanilla)
${SharedDir}
${SPRDVanillaRendererIncludeDirectories}
"${SPDir}/rd-vanilla"
"${JKXRDir}"
"${GSLIncludeDirectory}"
)

View file

@ -697,6 +697,14 @@ public:
return;
}
// Record The Extents Of The World Incase No Other Weather Zones Exist
//---------------------------------------------------------------------
if (!mWeatherZones.size())
{
Com_Printf("WARNING: No Weather Zones Encountered\n");
AddWeatherZone(tr.world->bmodels[0].bounds[0], tr.world->bmodels[0].bounds[1]);
}
// all this piece of code does really is fill in the bool "SWeatherZone::mMarkedOutside", plus the mPointCache[] for each zone,
// so we can diskload those. Maybe.
fileHandle_t f = ReadCachedWeatherFile();
@ -720,15 +728,6 @@ public:
uint32_t contents;
uint32_t bit;
// Record The Extents Of The World Incase No Other Weather Zones Exist
//---------------------------------------------------------------------
if (!mWeatherZones.size())
{
Com_Printf("WARNING: No Weather Zones Encountered\n");
AddWeatherZone(tr.world->bmodels[0].bounds[0], tr.world->bmodels[0].bounds[1]);
}
f = WriteCachedWeatherFile();
// Iterate Over All Weather Zones
@ -1969,8 +1968,13 @@ void R_WorldEffectCommand(const char *command)
COM_EndParseSession();
return;
}
int count = 1000;
const char* tempStr;
COM_ParseString(&command, &tempStr);
COM_ParseInt(&command, &count);
CParticleCloud& nCloud = mParticleClouds.push_back();
nCloud.Initialize(1000, "gfx/effects/snowflake1.bmp");
nCloud.Initialize(count, "gfx/effects/snowflake1.tga");
nCloud.mBlendMode = 1;
nCloud.mRotationChangeNext = 0;
nCloud.mColor = 0.75f;

View file

@ -493,7 +493,8 @@ static void RB_BeginDrawingView (void) {
}
else
{
if ( r_fastsky->integer && !( backEnd.refdef.rdflags & RDF_NOWORLDMODEL ) && !g_bRenderGlowingObjects )
if ((!hasskybox || r_fastsky->integer) &&
!( backEnd.refdef.rdflags & RDF_NOWORLDMODEL ) && !g_bRenderGlowingObjects )
{
if (tr.world && tr.world->globalFog != -1)
{
@ -647,6 +648,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
int entityNum, oldEntityNum;
int dlighted, oldDlighted;
int depthRange, oldDepthRange;
int isVRViewModel, oldIsVRViewModel;
int i;
drawSurf_t *drawSurf;
unsigned int oldSort;
@ -672,10 +674,15 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
oldShader = NULL;
oldFogNum = -1;
oldDepthRange = qfalse;
isVRViewModel = qfalse;
oldIsVRViewModel = qfalse;
oldDlighted = qfalse;
oldSort = (unsigned int) -1;
depthRange = qfalse;
GLint oldFaceCullMode;
GLboolean oldFaceCullEnabled;
backEnd.pc.c_surfaces += numDrawSurfs;
for (i = 0, drawSurf = drawSurfs ; i < numDrawSurfs ; i++, drawSurf++) {
@ -774,6 +781,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
//
if ( entityNum != oldEntityNum ) {
depthRange = qfalse;
isVRViewModel = qfalse;
if ( entityNum != REFENTITYNUM_WORLD ) {
backEnd.currentEntity = &backEnd.refdef.entities[entityNum];
@ -795,6 +803,10 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
// hack the depth range to prevent view model from poking into walls
depthRange = qtrue;
}
if (backEnd.currentEntity->e.renderfx & RF_VRVIEWMODEL) {
isVRViewModel = qtrue;
}
} else {
backEnd.currentEntity = &tr.worldEntity;
backEnd.refdef.floatTime = originalTime;
@ -826,6 +838,25 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
oldDepthRange = depthRange;
}
if (isVRViewModel != oldIsVRViewModel) {
if (isVRViewModel) {
qglGetBooleanv(GL_CULL_FACE, &oldFaceCullEnabled);
qglGetIntegerv(GL_CULL_FACE_MODE, &oldFaceCullMode);
//Draw all faces on weapons
qglDisable(GL_CULL_FACE);
} else{
if (!oldFaceCullEnabled)
{
qglDisable(GL_CULL_FACE);
} else{
qglEnable(GL_CULL_FACE);
}
qglCullFace( oldFaceCullMode );
}
oldIsVRViewModel = isVRViewModel;
}
oldEntityNum = entityNum;
}
@ -1403,7 +1434,8 @@ const void *RB_DrawBuffer( const void *data ) {
cmd = (const drawBufferCommand_t *)data;
qglDrawBuffer( cmd->buffer );
//qglDrawBuffer( cmd->buffer );
// clear screen for debugging
if (!( backEnd.refdef.rdflags & RDF_NOWORLDMODEL ) && tr.world && tr.refdef.rdflags & RDF_doLAGoggles)
@ -1522,6 +1554,32 @@ void RB_ShowImages( void ) {
}
/*
=============
RB_Flush
=============
*/
const void *RB_Flush( const void *data ) {
const swapBuffersCommand_t *cmd;
// finish any 2D drawing if needed
if ( tess.numIndexes ) {
RB_EndSurface();
}
// texture swapping test
if ( r_showImages->integer ) {
RB_ShowImages();
}
cmd = (const swapBuffersCommand_t *)data;
backEnd.projection2D = qfalse;
return (const void *)( cmd + 1 );
}
/*
=============
RB_SwapBuffers
@ -1637,6 +1695,9 @@ void RB_ExecuteRenderCommands( const void *data ) {
case RC_WORLD_EFFECTS:
data = RB_WorldEffects( data );
break;
case RC_FLUSH:
data = RB_Flush( data );
break;
case RC_END_OF_LIST:
default:
// stop rendering

View file

@ -1342,6 +1342,7 @@ void RE_LoadWorldMap_Actual( const char *name, world_t &worldData, int index ) {
if (!index)
{
skyboxportal = 0;
hasskybox = 0;
tr.sunDirection[0] = 0.45f;
tr.sunDirection[1] = 0.3f;

View file

@ -457,23 +457,13 @@ void RE_BeginFrame( stereoFrame_t stereoFrame ) {
}
cmd->commandId = RC_DRAW_BUFFER;
if ( glConfig.stereoEnabled ) {
{
if ( stereoFrame == STEREO_LEFT ) {
cmd->buffer = (int)GL_BACK_LEFT;
cmd->buffer = (int)0;
} else if ( stereoFrame == STEREO_RIGHT ) {
cmd->buffer = (int)GL_BACK_RIGHT;
cmd->buffer = (int)1;
} else {
Com_Error( ERR_FATAL, "RE_BeginFrame: Stereo is enabled, but stereoFrame was %i", stereoFrame );
}
} else {
if ( stereoFrame != STEREO_CENTER ) {
Com_Error( ERR_FATAL, "RE_BeginFrame: Stereo is disabled, but stereoFrame was %i", stereoFrame );
}
// if ( !Q_stricmp( r_drawBuffer->string, "GL_FRONT" ) ) {
// cmd->buffer = (int)GL_FRONT;
// } else
{
cmd->buffer = (int)GL_BACK;
ri.Error( ERR_FATAL, "RE_BeginFrame: Stereo is enabled, but stereoFrame was %i", stereoFrame );
}
}
}
@ -487,26 +477,30 @@ Returns the number of msec spent in the back end
=============
*/
void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) {
swapBuffersCommand_t *cmd;
swapBuffersCommand_t *cmd;
if ( !tr.registered ) {
return;
}
cmd = (swapBuffersCommand_t *) R_GetCommandBufferReserved( sizeof( *cmd ), 0 );
if ( !cmd ) {
cmd = (swapBuffersCommand_t*)R_GetCommandBuffer(sizeof(*cmd));
if (!cmd) {
return;
}
cmd->commandId = RC_SWAP_BUFFERS;
R_IssueRenderCommands( qtrue );
cmd->commandId = RC_FLUSH;
R_InitNextFrame();
R_IssueRenderCommands( qfalse );
if ( frontEndMsec ) {
// use the other buffers next frame, because another CPU
// may still be rendering into the current ones
R_InitNextFrame();
if (frontEndMsec) {
*frontEndMsec = tr.frontEndMsec;
}
tr.frontEndMsec = 0;
if ( backEndMsec ) {
if (backEndMsec) {
*backEndMsec = backEnd.pc.msec;
}
backEnd.pc.msec = 0;
@ -516,3 +510,20 @@ void RE_EndFrame( int *frontEndMsec, int *backEndMsec ) {
styleUpdated[i] = false;
}
}
void RE_SubmitStereoFrame( ) {
swapBuffersCommand_t *cmd;
if ( !tr.registered ) {
return;
}
cmd = (swapBuffersCommand_t*)R_GetCommandBuffer(sizeof(*cmd));
if (!cmd) {
return;
}
cmd->commandId = RC_SWAP_BUFFERS;
R_IssueRenderCommands( qtrue );
}

View file

@ -729,7 +729,7 @@ static void InitOpenGL( void )
// set default state
GL_SetDefaultState();
R_Splash(); //get something on screen asap
//R_Splash(); //get something on screen asap
}
else
{
@ -2038,6 +2038,7 @@ extern "C" Q_EXPORT refexport_t* QDECL GetRefAPI ( int apiVersion, refimport_t *
REX(BeginFrame);
REX(EndFrame);
REX(SubmitStereoFrame);
REX(ProcessDissolve);
REX(InitDissolve);

View file

@ -74,6 +74,7 @@ typedef struct {
// as well as the locally generated scene information
typedef struct {
int x, y, width, height;
bool override_fov;
float fov_x, fov_y;
vec3_t vieworg;
vec3_t viewaxis[3]; // transformation matrix
@ -1309,7 +1310,7 @@ void RE_GetScreenShot(byte *data, int w, int h);
byte* RE_TempRawImage_ReadFromFile(const char *psLocalFilename, int *piWidth, int *piHeight, byte *pbReSampleBuffer, qboolean qbVertFlip);
void RE_TempRawImage_CleanUp();
void RE_BeginRegistration( glconfig_t *glconfig );
void RE_BeginRegistration( glconfig_t *glconfig, intptr_t pVrClientInfo );
void RE_LoadWorldMap( const char *mapname );
void RE_SetWorldVisData( const byte *vis );
qhandle_t RE_RegisterModel( const char *name );
@ -1778,6 +1779,7 @@ typedef enum {
RC_DRAW_BUFFER,
RC_SWAP_BUFFERS,
RC_WORLD_EFFECTS,
RC_FLUSH
} renderCommand_t;
@ -1818,6 +1820,7 @@ void RE_LAGoggles( void );
void RE_Scissor ( float x, float y, float w, float h);
void RE_BeginFrame( stereoFrame_t stereoFrame );
void RE_EndFrame( int *frontEndMsec, int *backEndMsec );
void RE_SubmitStereoFrame( );
qboolean RE_ProcessDissolve(void);
qboolean RE_InitDissolve(qboolean bForceCircularExtroWipe);

View file

@ -27,6 +27,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "../server/exe_headers.h"
#include "tr_local.h"
#include <VrClientInfo.h>
#if !defined(G2_H_INC)
#include "../ghoul2/G2.h"
@ -34,6 +35,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
trGlobals_t tr;
vr_client_info_t *vr;
static float s_flipMatrix[16] = {
// convert from our coordinate system (looking down X)
// to OpenGL's coordinate system (looking down -Z)
@ -525,7 +528,7 @@ R_SetupProjection
void R_SetupProjection( void ) {
float xmin, xmax, ymin, ymax;
float width, height, depth;
float zNear, zFar;
float zNear, zFar, zZoomX, zZoomY;
// dynamically compute far clip plane distance
SetFarClip();
@ -535,6 +538,20 @@ void R_SetupProjection( void ) {
//
zNear = r_znear->value;
zFar = tr.viewParms.zFar;
zZoomX = 1.0f;
zZoomY = 1.0f;
if (tr.refdef.override_fov || vr->cgzoommode)
{
zZoomX = vr->fov_x / tr.refdef.fov_x;
zZoomY = vr->fov_y / tr.refdef.fov_y;
}
if (ri.TBXR_GetVRProjection(vr->eye, zNear, zFar, zZoomX, zZoomY, tr.viewParms.projectionMatrix))
{
return;
}
ymax = zNear * tan( tr.refdef.fov_y * M_PI / 360.0f );
ymin = -ymax;

View file

@ -30,6 +30,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "tr_local.h"
#include "qcommon/matcomp.h"
#include "../qcommon/sstring.h"
#include <VrClientInfo.h>
#define LL(x) x=LittleLong(x)
#define LS(x) x=LittleShort(x)
@ -977,12 +978,13 @@ void CM_SetupShaderProperties(void);
/*
** RE_BeginRegistration
*/
void RE_BeginRegistration( glconfig_t *glconfigOut ) {
void RE_BeginRegistration( glconfig_t *glconfigOut, intptr_t pVrClientInfo ) {
ri.Hunk_ClearToMark();
R_Init();
*glconfigOut = glConfig;
vr = (vr_client_info_t*)pVrClientInfo;
R_IssuePendingRenderCommands();

View file

@ -25,6 +25,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "../server/exe_headers.h"
#include "tr_local.h"
#include <VrClientInfo.h>
int r_firstSceneDrawSurf;
@ -41,6 +42,7 @@ int r_numpolyverts;
int skyboxportal;
int drawskyboxportal;
int hasskybox; // Used to indicate whether the BSP contains a skybox (if not, then use fog colour if applicable)
/*
====================
@ -293,9 +295,15 @@ void RE_RenderScene( const refdef_t *fd ) {
tr.refdef.y = fd->y;
tr.refdef.width = fd->width;
tr.refdef.height = fd->height;
tr.refdef.override_fov = fd->override_fov;
tr.refdef.fov_x = fd->fov_x;
tr.refdef.fov_y = fd->fov_y;
memset( &parms, 0, sizeof( parms ) );
VectorCopy( fd->viewaxis[0], parms.ori.axis[0] );
VectorCopy( fd->viewaxis[1], parms.ori.axis[1] );
VectorCopy( fd->viewaxis[2], parms.ori.axis[2] );
VectorCopy( fd->vieworg, tr.refdef.vieworg );
VectorCopy( fd->viewaxis[0], tr.refdef.viewaxis[0] );
VectorCopy( fd->viewaxis[1], tr.refdef.viewaxis[1] );
@ -384,7 +392,6 @@ void RE_RenderScene( const refdef_t *fd ) {
// The refdef takes 0-at-the-top y coordinates, so
// convert to GL's 0-at-the-bottom space
//
memset( &parms, 0, sizeof( parms ) );
parms.viewportX = tr.refdef.x;
parms.viewportY = glConfig.vidHeight - ( tr.refdef.y + tr.refdef.height );
parms.viewportWidth = tr.refdef.width;
@ -395,9 +402,9 @@ void RE_RenderScene( const refdef_t *fd ) {
parms.fovY = tr.refdef.fov_y;
VectorCopy( fd->vieworg, parms.ori.origin );
VectorCopy( fd->viewaxis[0], parms.ori.axis[0] );
VectorCopy( fd->viewaxis[1], parms.ori.axis[1] );
VectorCopy( fd->viewaxis[2], parms.ori.axis[2] );
// VectorCopy( fd->viewaxis[0], parms.ori.axis[0] );
// VectorCopy( fd->viewaxis[1], parms.ori.axis[1] );
// VectorCopy( fd->viewaxis[2], parms.ori.axis[2] );
VectorCopy( fd->vieworg, parms.pvsOrigin );

View file

@ -805,6 +805,11 @@ void RB_StageIteratorSky( void ) {
return;
}
//Don't need to use the following in JK3
#ifdef JK2_MODE
hasskybox = 1;
#endif
// go through all the polygons and project them onto
// the sky box to see which blocks on each side need
// to be drawn

View file

@ -26,6 +26,24 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "sys/sys_local.h"
#include "sdl_icon.h"
#if defined(_WIN32)
// OpenXR Header
#define XR_USE_GRAPHICS_API_OPENGL
#define XR_USE_PLATFORM_WIN32
#include <Unknwn.h>
#include <openxr.h>
#include <openxr_platform.h>
#include <GL/gl.h>
#include <GL/glext.h>
#define GL_RGBA16F 0x881A
#endif
enum rserr_t
{
RSERR_OK,
@ -142,11 +160,20 @@ void GLimp_Minimize(void)
SDL_MinimizeWindow( screen );
}
void WIN_SwapWindow()
{
SDL_GL_SwapWindow(screen);
}
void TBXR_submitFrame();
void WIN_Present( window_t *window )
{
if ( window->api == GRAPHICS_API_OPENGL )
{
SDL_GL_SwapWindow(screen);
TBXR_submitFrame();
if ( r_swapInterval->modified )
{
@ -315,6 +342,8 @@ static bool GLimp_DetectAvailableModes(void)
GLimp_SetMode
===============
*/
void TBXR_GetScreenRes(int*, int*);
static rserr_t GLimp_SetMode(glconfig_t *glConfig, const windowDesc_t *windowDesc, const char *windowTitle, int mode, qboolean fullscreen, qboolean noborder)
{
int perChannelColorBits;
@ -395,6 +424,7 @@ static rserr_t GLimp_SetMode(glconfig_t *glConfig, const windowDesc_t *windowDes
SDL_FreeSurface( icon );
return RSERR_INVALID_MODE;
}
Com_Printf( " %d %d\n", glConfig->vidWidth, glConfig->vidHeight);
// Center window
@ -723,6 +753,31 @@ static qboolean GLimp_StartDriverAndSetMode(glconfig_t *glConfig, const windowDe
return qtrue;
}
bool xr_result(XrInstance instance, XrResult result, const char* format, ...)
{
if (XR_SUCCEEDED(result))
return true;
char resultString[XR_MAX_RESULT_STRING_SIZE];
xrResultToString(instance, result, resultString);
size_t len1 = strlen(format);
size_t len2 = strlen(resultString) + 1;
char* formatRes = new char[len1 + len2 + 4]; // + " []\n"
sprintf(formatRes, "%s [%s]\n", format, resultString);
va_list args;
va_start(args, format);
vprintf(formatRes, args);
va_end(args);
delete[] formatRes;
return false;
}
void VR_Init();
window_t WIN_Init( const windowDesc_t *windowDesc, glconfig_t *glConfig )
{
Cmd_AddCommand("modelist", R_ModeList_f);
@ -745,9 +800,9 @@ window_t WIN_Init( const windowDesc_t *windowDesc, glconfig_t *glConfig )
// Window render surface cvars
r_stencilbits = Cvar_Get( "r_stencilbits", "8", CVAR_ARCHIVE_ND|CVAR_LATCH );
r_depthbits = Cvar_Get( "r_depthbits", "24", CVAR_ARCHIVE_ND|CVAR_LATCH );
r_colorbits = Cvar_Get( "r_colorbits", "32", CVAR_ARCHIVE_ND|CVAR_LATCH );
r_ignorehwgamma = Cvar_Get( "r_ignorehwgamma", "1", CVAR_ARCHIVE|CVAR_LATCH );
r_depthbits = Cvar_Get( "r_depthbits", "0", CVAR_ARCHIVE_ND|CVAR_LATCH );
r_colorbits = Cvar_Get( "r_colorbits", "0", CVAR_ARCHIVE_ND|CVAR_LATCH );
r_ignorehwgamma = Cvar_Get( "r_ignorehwgamma", "0", CVAR_ARCHIVE_ND|CVAR_LATCH );
r_ext_multisample = Cvar_Get( "r_ext_multisample", "0", CVAR_ARCHIVE_ND|CVAR_LATCH );
Cvar_Get( "r_availableModes", "", CVAR_ROM );
@ -778,6 +833,7 @@ window_t WIN_Init( const windowDesc_t *windowDesc, glconfig_t *glConfig )
window.api = windowDesc->api;
#if defined(_WIN32)
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
@ -793,6 +849,10 @@ window_t WIN_Init( const windowDesc_t *windowDesc, glconfig_t *glConfig )
break;
}
}
VR_Init();
TBXR_GetScreenRes(&glConfig->vidWidth, &glConfig->vidHeight);
#endif
return window;