Skybox rendering.
This commit is contained in:
parent
ab32f499f8
commit
07f4d33492
|
|
@ -1,6 +1,7 @@
|
||||||
Removed cvars:
|
Removed cvars:
|
||||||
* r_allowExtensions (always use extensions if available)
|
* r_allowExtensions (always use extensions if available)
|
||||||
* r_allowSoftwareGL
|
* r_allowSoftwareGL
|
||||||
|
* r_clear
|
||||||
* r_colorbits (use desktop color depth)
|
* r_colorbits (use desktop color depth)
|
||||||
* r_ext_multitexture (required)
|
* r_ext_multitexture (required)
|
||||||
* r_finish
|
* r_finish
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,6 @@ void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint internalform
|
||||||
void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param);
|
void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param);
|
||||||
void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params);
|
void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params);
|
||||||
void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
|
void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
|
||||||
void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z);
|
|
||||||
void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y);
|
void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y);
|
||||||
void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z);
|
void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z);
|
||||||
void ( APIENTRY * qglVertex3fv )(const GLfloat *v);
|
void ( APIENTRY * qglVertex3fv )(const GLfloat *v);
|
||||||
|
|
@ -152,7 +151,6 @@ static void ( APIENTRY * dllTexImage2D )(GLenum target, GLint level, GLint inter
|
||||||
static void ( APIENTRY * dllTexParameterf )(GLenum target, GLenum pname, GLfloat param);
|
static void ( APIENTRY * dllTexParameterf )(GLenum target, GLenum pname, GLfloat param);
|
||||||
static void ( APIENTRY * dllTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params);
|
static void ( APIENTRY * dllTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params);
|
||||||
static void ( APIENTRY * dllTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
|
static void ( APIENTRY * dllTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
|
||||||
static void ( APIENTRY * dllTranslatef )(GLfloat x, GLfloat y, GLfloat z);
|
|
||||||
static void ( APIENTRY * dllVertex2f )(GLfloat x, GLfloat y);
|
static void ( APIENTRY * dllVertex2f )(GLfloat x, GLfloat y);
|
||||||
static void ( APIENTRY * dllVertex3f )(GLfloat x, GLfloat y, GLfloat z);
|
static void ( APIENTRY * dllVertex3f )(GLfloat x, GLfloat y, GLfloat z);
|
||||||
static void ( APIENTRY * dllVertex3fv )(const GLfloat *v);
|
static void ( APIENTRY * dllVertex3fv )(const GLfloat *v);
|
||||||
|
|
@ -593,11 +591,6 @@ static void APIENTRY logTexSubImage2D(GLenum target, GLint level, GLint xoffset,
|
||||||
SIG( "glTexSubImage2D" );
|
SIG( "glTexSubImage2D" );
|
||||||
dllTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels );
|
dllTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels );
|
||||||
}
|
}
|
||||||
static void APIENTRY logTranslatef(GLfloat x, GLfloat y, GLfloat z)
|
|
||||||
{
|
|
||||||
SIG( "glTranslatef" );
|
|
||||||
dllTranslatef( x, y, z );
|
|
||||||
}
|
|
||||||
static void APIENTRY logVertex2f(GLfloat x, GLfloat y)
|
static void APIENTRY logVertex2f(GLfloat x, GLfloat y)
|
||||||
{
|
{
|
||||||
SIG( "glVertex2f" );
|
SIG( "glVertex2f" );
|
||||||
|
|
@ -694,7 +687,6 @@ void QGL_Shutdown( void )
|
||||||
qglTexParameterf = NULL;
|
qglTexParameterf = NULL;
|
||||||
qglTexParameterfv = NULL;
|
qglTexParameterfv = NULL;
|
||||||
qglTexSubImage2D = NULL;
|
qglTexSubImage2D = NULL;
|
||||||
qglTranslatef = NULL;
|
|
||||||
qglVertex2f = NULL;
|
qglVertex2f = NULL;
|
||||||
qglVertex3f = NULL;
|
qglVertex3f = NULL;
|
||||||
qglVertex3fv = NULL;
|
qglVertex3fv = NULL;
|
||||||
|
|
@ -787,7 +779,6 @@ qboolean QGL_Init( const char *dllname )
|
||||||
qglTexParameterf = dllTexParameterf = (decltype(dllTexParameterf))GPA("glTexParameterf");
|
qglTexParameterf = dllTexParameterf = (decltype(dllTexParameterf))GPA("glTexParameterf");
|
||||||
qglTexParameterfv = dllTexParameterfv = (decltype(dllTexParameterfv))GPA("glTexParameterfv");
|
qglTexParameterfv = dllTexParameterfv = (decltype(dllTexParameterfv))GPA("glTexParameterfv");
|
||||||
qglTexSubImage2D = dllTexSubImage2D = (decltype(dllTexSubImage2D))GPA("glTexSubImage2D");
|
qglTexSubImage2D = dllTexSubImage2D = (decltype(dllTexSubImage2D))GPA("glTexSubImage2D");
|
||||||
qglTranslatef = dllTranslatef = (decltype(dllTranslatef))GPA("glTranslatef");
|
|
||||||
qglVertex2f = dllVertex2f = (decltype(dllVertex2f))GPA("glVertex2f");
|
qglVertex2f = dllVertex2f = (decltype(dllVertex2f))GPA("glVertex2f");
|
||||||
qglVertex3f = dllVertex3f = (decltype(dllVertex3f))GPA("glVertex3f");
|
qglVertex3f = dllVertex3f = (decltype(dllVertex3f))GPA("glVertex3f");
|
||||||
qglVertex3fv = dllVertex3fv = (decltype(dllVertex3fv))GPA("glVertex3fv");
|
qglVertex3fv = dllVertex3fv = (decltype(dllVertex3fv))GPA("glVertex3fv");
|
||||||
|
|
@ -904,7 +895,6 @@ void QGL_EnableLogging( qboolean enable )
|
||||||
qglTexParameterf = logTexParameterf ;
|
qglTexParameterf = logTexParameterf ;
|
||||||
qglTexParameterfv = logTexParameterfv ;
|
qglTexParameterfv = logTexParameterfv ;
|
||||||
qglTexSubImage2D = logTexSubImage2D ;
|
qglTexSubImage2D = logTexSubImage2D ;
|
||||||
qglTranslatef = logTranslatef ;
|
|
||||||
qglVertex2f = logVertex2f ;
|
qglVertex2f = logVertex2f ;
|
||||||
qglVertex3f = logVertex3f ;
|
qglVertex3f = logVertex3f ;
|
||||||
qglVertex3fv = logVertex3fv ;
|
qglVertex3fv = logVertex3fv ;
|
||||||
|
|
@ -970,7 +960,6 @@ void QGL_EnableLogging( qboolean enable )
|
||||||
qglTexParameterf = dllTexParameterf ;
|
qglTexParameterf = dllTexParameterf ;
|
||||||
qglTexParameterfv = dllTexParameterfv ;
|
qglTexParameterfv = dllTexParameterfv ;
|
||||||
qglTexSubImage2D = dllTexSubImage2D ;
|
qglTexSubImage2D = dllTexSubImage2D ;
|
||||||
qglTranslatef = dllTranslatef ;
|
|
||||||
qglVertex2f = dllVertex2f ;
|
qglVertex2f = dllVertex2f ;
|
||||||
qglVertex3f = dllVertex3f ;
|
qglVertex3f = dllVertex3f ;
|
||||||
qglVertex3fv = dllVertex3fv ;
|
qglVertex3fv = dllVertex3fv ;
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,6 @@ extern void ( APIENTRY * qglTexImage2D )(GLenum target, GLint level, GLint inte
|
||||||
extern void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param);
|
extern void ( APIENTRY * qglTexParameterf )(GLenum target, GLenum pname, GLfloat param);
|
||||||
extern void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params);
|
extern void ( APIENTRY * qglTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params);
|
||||||
extern void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
|
extern void ( APIENTRY * qglTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
|
||||||
extern void ( APIENTRY * qglTranslatef )(GLfloat x, GLfloat y, GLfloat z);
|
|
||||||
extern void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y);
|
extern void ( APIENTRY * qglVertex2f )(GLfloat x, GLfloat y);
|
||||||
extern void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z);
|
extern void ( APIENTRY * qglVertex3f )(GLfloat x, GLfloat y, GLfloat z);
|
||||||
extern void ( APIENTRY * qglVertex3fv )(const GLfloat *v);
|
extern void ( APIENTRY * qglVertex3fv )(const GLfloat *v);
|
||||||
|
|
|
||||||
|
|
@ -1351,9 +1351,7 @@ SKIES
|
||||||
============================================================
|
============================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void R_BuildCloudData( shaderCommands_t *shader );
|
|
||||||
void R_InitSkyTexCoords( float cloudLayerHeight );
|
void R_InitSkyTexCoords( float cloudLayerHeight );
|
||||||
void RB_ClipSkyPolygons( shaderCommands_t *shader );
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============================================================
|
============================================================
|
||||||
|
|
@ -1408,7 +1406,6 @@ ANIMATED MODELS
|
||||||
=============================================================
|
=============================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void R_MakeAnimModel( model_t *model );
|
|
||||||
void R_AddAnimSurfaces( trRefEntity_t *ent );
|
void R_AddAnimSurfaces( trRefEntity_t *ent );
|
||||||
void RB_SurfaceAnim( md4Surface_t *surfType );
|
void RB_SurfaceAnim( md4Surface_t *surfType );
|
||||||
|
|
||||||
|
|
@ -1442,6 +1439,8 @@ void RB_CalcColorFromOneMinusEntity( unsigned char *dstColors );
|
||||||
void RB_CalcSpecularAlpha( unsigned char *alphas );
|
void RB_CalcSpecularAlpha( unsigned char *alphas );
|
||||||
void RB_CalcDiffuseColor( unsigned char *colors );
|
void RB_CalcDiffuseColor( unsigned char *colors );
|
||||||
|
|
||||||
|
void myGlMultMatrix( const float *a, const float *b, float *out );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=============================================================
|
=============================================================
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -792,7 +792,11 @@ static void ComputeTexCoords( shaderStage_t *pStage ) {
|
||||||
static void RB_IterateStagesGeneric( shaderCommands_t *input )
|
static void RB_IterateStagesGeneric( shaderCommands_t *input )
|
||||||
{
|
{
|
||||||
// VULKAN
|
// VULKAN
|
||||||
vk_bind_resources_shared_between_stages(input->numPasses);
|
extern FILE* vk_log_file;
|
||||||
|
if (r_logFile->integer)
|
||||||
|
fprintf(vk_log_file, "vk_draw (passes %d, vert %d, inds %d)\n", input->numPasses, tess.numVertexes, tess.numIndexes);
|
||||||
|
|
||||||
|
vk_bind_resources_shared_between_stages();
|
||||||
|
|
||||||
for ( int stage = 0; stage < MAX_SHADER_STAGES; stage++ )
|
for ( int stage = 0; stage < MAX_SHADER_STAGES; stage++ )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
#define HALF_SKY_SUBDIVISIONS (SKY_SUBDIVISIONS/2)
|
#define HALF_SKY_SUBDIVISIONS (SKY_SUBDIVISIONS/2)
|
||||||
|
|
||||||
static float s_cloudTexCoords[6][SKY_SUBDIVISIONS+1][SKY_SUBDIVISIONS+1][2];
|
static float s_cloudTexCoords[6][SKY_SUBDIVISIONS+1][SKY_SUBDIVISIONS+1][2];
|
||||||
static float s_cloudTexP[6][SKY_SUBDIVISIONS+1][SKY_SUBDIVISIONS+1];
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===================================================================================
|
===================================================================================
|
||||||
|
|
@ -450,11 +449,58 @@ static void DrawSkyBox( shader_t *shader )
|
||||||
DrawSkySide( shader->sky.outerbox[sky_texorder[i]],
|
DrawSkySide( shader->sky.outerbox[sky_texorder[i]],
|
||||||
sky_mins_subd,
|
sky_mins_subd,
|
||||||
sky_maxs_subd );
|
sky_maxs_subd );
|
||||||
|
|
||||||
|
// VULKAN
|
||||||
|
glState.vk_current_images[0] = shader->sky.outerbox[sky_texorder[i]];
|
||||||
|
tess.numVertexes = 0;
|
||||||
|
tess.numIndexes = 0;
|
||||||
|
|
||||||
|
for ( t = sky_mins_subd[1]+HALF_SKY_SUBDIVISIONS; t < sky_maxs_subd[1]+HALF_SKY_SUBDIVISIONS; t++ )
|
||||||
|
{
|
||||||
|
for ( s = sky_mins_subd[0]+HALF_SKY_SUBDIVISIONS; s < sky_maxs_subd[0]+HALF_SKY_SUBDIVISIONS; s++ )
|
||||||
|
{
|
||||||
|
int ndx = tess.numVertexes;
|
||||||
|
|
||||||
|
tess.indexes[ tess.numIndexes ] = ndx;
|
||||||
|
tess.indexes[ tess.numIndexes + 1 ] = ndx + 1;
|
||||||
|
tess.indexes[ tess.numIndexes + 2 ] = ndx + 2;
|
||||||
|
|
||||||
|
tess.indexes[ tess.numIndexes + 3 ] = ndx + 2;
|
||||||
|
tess.indexes[ tess.numIndexes + 4 ] = ndx + 1;
|
||||||
|
tess.indexes[ tess.numIndexes + 5 ] = ndx + 3;
|
||||||
|
tess.numIndexes += 6;
|
||||||
|
|
||||||
|
VectorCopy(s_skyPoints[t][s], tess.xyz[ndx]);
|
||||||
|
tess.svars.texcoords[0][ndx][0] = s_skyTexCoords[t][s][0];
|
||||||
|
tess.svars.texcoords[0][ndx][1] = s_skyTexCoords[t][s][1];
|
||||||
|
|
||||||
|
VectorCopy(s_skyPoints[t + 1][s], tess.xyz[ndx + 1]);
|
||||||
|
tess.svars.texcoords[0][ndx + 1][0] = s_skyTexCoords[t + 1][s][0];
|
||||||
|
tess.svars.texcoords[0][ndx + 1][1] = s_skyTexCoords[t + 1][s][1];
|
||||||
|
|
||||||
|
VectorCopy(s_skyPoints[t][s + 1], tess.xyz[ndx + 2]);
|
||||||
|
tess.svars.texcoords[0][ndx + 2][0] = s_skyTexCoords[t][s + 1][0];
|
||||||
|
tess.svars.texcoords[0][ndx + 2][1] = s_skyTexCoords[t][s + 1][1];
|
||||||
|
|
||||||
|
VectorCopy(s_skyPoints[t + 1][s + 1], tess.xyz[ndx + 3]);
|
||||||
|
tess.svars.texcoords[0][ndx + 3][0] = s_skyTexCoords[t + 1][s + 1][0];
|
||||||
|
tess.svars.texcoords[0][ndx + 3][1] = s_skyTexCoords[t + 1][s + 1][1];
|
||||||
|
|
||||||
|
tess.numVertexes += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Com_Memset( tess.svars.colors, tr.identityLightByte, tess.numVertexes * 4 );
|
||||||
|
vk_bind_resources_shared_between_stages();
|
||||||
|
vk_bind_stage_specific_resources(vk.skybox_pipeline, false, true);
|
||||||
|
vkCmdDrawIndexed(vk.command_buffer, tess.numIndexes, 1, 0, 0, 0);
|
||||||
|
glState.vk_dirty_attachments = true;
|
||||||
|
vk.xyz_elements += tess.numVertexes;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FillCloudySkySide( const int mins[2], const int maxs[2], qboolean addIndexes )
|
static void FillCloudySkySide( const int mins[2], const int maxs[2] )
|
||||||
{
|
{
|
||||||
int s, t;
|
int s, t;
|
||||||
int vertexStart = tess.numVertexes;
|
int vertexStart = tess.numVertexes;
|
||||||
|
|
@ -480,31 +526,28 @@ static void FillCloudySkySide( const int mins[2], const int maxs[2], qboolean ad
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// only add indexes for one pass, otherwise it would draw multiple times for each pass
|
for ( t = 0; t < tHeight-1; t++ )
|
||||||
if ( addIndexes ) {
|
{
|
||||||
for ( t = 0; t < tHeight-1; t++ )
|
for ( s = 0; s < sWidth-1; s++ )
|
||||||
{
|
{
|
||||||
for ( s = 0; s < sWidth-1; s++ )
|
tess.indexes[tess.numIndexes] = vertexStart + s + t * ( sWidth );
|
||||||
{
|
tess.numIndexes++;
|
||||||
tess.indexes[tess.numIndexes] = vertexStart + s + t * ( sWidth );
|
tess.indexes[tess.numIndexes] = vertexStart + s + ( t + 1 ) * ( sWidth );
|
||||||
tess.numIndexes++;
|
tess.numIndexes++;
|
||||||
tess.indexes[tess.numIndexes] = vertexStart + s + ( t + 1 ) * ( sWidth );
|
tess.indexes[tess.numIndexes] = vertexStart + s + 1 + t * ( sWidth );
|
||||||
tess.numIndexes++;
|
tess.numIndexes++;
|
||||||
tess.indexes[tess.numIndexes] = vertexStart + s + 1 + t * ( sWidth );
|
|
||||||
tess.numIndexes++;
|
|
||||||
|
|
||||||
tess.indexes[tess.numIndexes] = vertexStart + s + ( t + 1 ) * ( sWidth );
|
tess.indexes[tess.numIndexes] = vertexStart + s + ( t + 1 ) * ( sWidth );
|
||||||
tess.numIndexes++;
|
tess.numIndexes++;
|
||||||
tess.indexes[tess.numIndexes] = vertexStart + s + 1 + ( t + 1 ) * ( sWidth );
|
tess.indexes[tess.numIndexes] = vertexStart + s + 1 + ( t + 1 ) * ( sWidth );
|
||||||
tess.numIndexes++;
|
tess.numIndexes++;
|
||||||
tess.indexes[tess.numIndexes] = vertexStart + s + 1 + t * ( sWidth );
|
tess.indexes[tess.numIndexes] = vertexStart + s + 1 + t * ( sWidth );
|
||||||
tess.numIndexes++;
|
tess.numIndexes++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FillCloudBox( int stage )
|
static void FillCloudBox()
|
||||||
{
|
{
|
||||||
for ( int i = 0; i < 5; i++ )
|
for ( int i = 0; i < 5; i++ )
|
||||||
{
|
{
|
||||||
|
|
@ -566,7 +609,7 @@ static void FillCloudBox( int stage )
|
||||||
}
|
}
|
||||||
|
|
||||||
// only add indexes for first stage
|
// only add indexes for first stage
|
||||||
FillCloudySkySide( sky_mins_subd, sky_maxs_subd, (qboolean) ( stage == 0 ) );
|
FillCloudySkySide( sky_mins_subd, sky_maxs_subd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -575,7 +618,6 @@ static void FillCloudBox( int stage )
|
||||||
*/
|
*/
|
||||||
void R_BuildCloudData( shaderCommands_t *input )
|
void R_BuildCloudData( shaderCommands_t *input )
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
shader_t *shader;
|
shader_t *shader;
|
||||||
|
|
||||||
shader = input->shader;
|
shader = input->shader;
|
||||||
|
|
@ -589,15 +631,9 @@ void R_BuildCloudData( shaderCommands_t *input )
|
||||||
tess.numIndexes = 0;
|
tess.numIndexes = 0;
|
||||||
tess.numVertexes = 0;
|
tess.numVertexes = 0;
|
||||||
|
|
||||||
if ( input->shader->sky.cloudHeight )
|
if ( input->shader->sky.cloudHeight && tess.xstages[0] )
|
||||||
{
|
{
|
||||||
for ( i = 0; i < MAX_SHADER_STAGES; i++ )
|
FillCloudBox();
|
||||||
{
|
|
||||||
if ( !tess.xstages[i] ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
FillCloudBox( i );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -643,8 +679,6 @@ void R_InitSkyTexCoords( float heightCloud )
|
||||||
2 * SQR( skyVec[2] ) * radiusWorld * heightCloud +
|
2 * SQR( skyVec[2] ) * radiusWorld * heightCloud +
|
||||||
SQR( skyVec[2] ) * SQR( heightCloud ) ) );
|
SQR( skyVec[2] ) * SQR( heightCloud ) ) );
|
||||||
|
|
||||||
s_cloudTexP[i][t][s] = p;
|
|
||||||
|
|
||||||
// compute intersection point based on p
|
// compute intersection point based on p
|
||||||
VectorScale( skyVec, p, v );
|
VectorScale( skyVec, p, v );
|
||||||
v[2] += radiusWorld;
|
v[2] += radiusWorld;
|
||||||
|
|
@ -692,15 +726,25 @@ void RB_StageIteratorSky( void ) {
|
||||||
|
|
||||||
// draw the outer skybox
|
// draw the outer skybox
|
||||||
if ( tess.shader->sky.outerbox[0] && tess.shader->sky.outerbox[0] != tr.defaultImage ) {
|
if ( tess.shader->sky.outerbox[0] && tess.shader->sky.outerbox[0] != tr.defaultImage ) {
|
||||||
qglColor3f( tr.identityLight, tr.identityLight, tr.identityLight );
|
float modelMatrix_original[16];
|
||||||
|
Com_Memcpy(modelMatrix_original, backEnd.or.modelMatrix, sizeof(float[16]));
|
||||||
|
|
||||||
|
float skybox_translate[16] = {
|
||||||
|
1, 0, 0, 0,
|
||||||
|
0, 1, 0, 0,
|
||||||
|
0, 0, 1, 0,
|
||||||
|
backEnd.viewParms.or.origin[0], backEnd.viewParms.or.origin[1], backEnd.viewParms.or.origin[2], 1
|
||||||
|
};
|
||||||
|
myGlMultMatrix(skybox_translate, modelMatrix_original, backEnd.or.modelMatrix);
|
||||||
|
|
||||||
qglPushMatrix ();
|
|
||||||
GL_State( 0 );
|
GL_State( 0 );
|
||||||
qglTranslatef (backEnd.viewParms.or.origin[0], backEnd.viewParms.or.origin[1], backEnd.viewParms.or.origin[2]);
|
qglColor3f( tr.identityLight, tr.identityLight, tr.identityLight );
|
||||||
|
qglPushMatrix ();
|
||||||
|
qglLoadMatrixf(backEnd.or.modelMatrix);
|
||||||
DrawSkyBox( tess.shader );
|
DrawSkyBox( tess.shader );
|
||||||
|
|
||||||
qglPopMatrix();
|
qglPopMatrix();
|
||||||
|
|
||||||
|
Com_Memcpy(backEnd.or.modelMatrix, modelMatrix_original, sizeof(float[16]));
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate the vertexes for all the clouds, which will be drawn
|
// generate the vertexes for all the clouds, which will be drawn
|
||||||
|
|
|
||||||
|
|
@ -324,6 +324,8 @@ static VkRenderPass create_render_pass(VkDevice device, VkFormat color_format, V
|
||||||
return render_pass;
|
return render_pass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VkPipeline create_pipeline(const Vk_Pipeline_Desc&);
|
||||||
|
|
||||||
bool vk_initialize(HWND hwnd) {
|
bool vk_initialize(HWND hwnd) {
|
||||||
try {
|
try {
|
||||||
auto& g = vk;
|
auto& g = vk;
|
||||||
|
|
@ -546,6 +548,19 @@ bool vk_initialize(HWND hwnd) {
|
||||||
vk.index_buffer_ptr = (byte*)data;
|
vk.index_buffer_ptr = (byte*)data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Skybox pipeline.
|
||||||
|
//
|
||||||
|
{
|
||||||
|
Vk_Pipeline_Desc desc;
|
||||||
|
desc.shader_type = Vk_Shader_Type::single_texture;
|
||||||
|
desc.state_bits = 0;
|
||||||
|
desc.face_culling = CT_FRONT_SIDED;
|
||||||
|
desc.polygon_offset = false;
|
||||||
|
|
||||||
|
vk.skybox_pipeline = create_pipeline(desc);
|
||||||
|
}
|
||||||
|
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -579,6 +594,7 @@ void vk_deinitialize() {
|
||||||
vkDestroyPipelineLayout(vk.device, vk.pipeline_layout, nullptr);
|
vkDestroyPipelineLayout(vk.device, vk.pipeline_layout, nullptr);
|
||||||
vkDestroyBuffer(vk.device, vk.vertex_buffer, nullptr);
|
vkDestroyBuffer(vk.device, vk.vertex_buffer, nullptr);
|
||||||
vkDestroyBuffer(vk.device, vk.index_buffer, nullptr);
|
vkDestroyBuffer(vk.device, vk.index_buffer, nullptr);
|
||||||
|
vkDestroyPipeline(vk.device, vk.skybox_pipeline, nullptr);
|
||||||
|
|
||||||
vkDestroySwapchainKHR(g.device, g.swapchain, nullptr);
|
vkDestroySwapchainKHR(g.device, g.swapchain, nullptr);
|
||||||
vkDestroyDevice(g.device, nullptr);
|
vkDestroyDevice(g.device, nullptr);
|
||||||
|
|
@ -1121,27 +1137,22 @@ void vk_get_mvp_transform(float mvp[16]) {
|
||||||
// update q3's proj matrix (opengl) to vulkan conventions: z - [0, 1] instead of [-1, 1] and invert y direction
|
// update q3's proj matrix (opengl) to vulkan conventions: z - [0, 1] instead of [-1, 1] and invert y direction
|
||||||
float zNear = r_znear->value;
|
float zNear = r_znear->value;
|
||||||
float zFar = tr.viewParms.zFar;
|
float zFar = tr.viewParms.zFar;
|
||||||
float p10 = -zFar / (zFar - zNear);
|
float P10 = -zFar / (zFar - zNear);
|
||||||
float p14 = -zFar*zNear / (zFar - zNear);
|
float P14 = -zFar*zNear / (zFar - zNear);
|
||||||
float p5 = -p[5];
|
float P5 = -p[5];
|
||||||
|
|
||||||
float proj[16] = {
|
float proj[16] = {
|
||||||
p[0], p[1], p[2], p[3],
|
p[0], p[1], p[2], p[3],
|
||||||
p[4], p5, p[6], p[7],
|
p[4], P5, p[6], p[7],
|
||||||
p[8], p[9], p10, p[11],
|
p[8], p[9], P10, p[11],
|
||||||
p[12], p[13], p14, p[15]
|
p[12], p[13], P14, p[15]
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void myGlMultMatrix( const float *a, const float *b, float *out );
|
|
||||||
myGlMultMatrix(backEnd.or.modelMatrix, proj, mvp);
|
myGlMultMatrix(backEnd.or.modelMatrix, proj, mvp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vk_bind_resources_shared_between_stages(int num_passes) {
|
void vk_bind_resources_shared_between_stages() {
|
||||||
extern FILE* vk_log_file;
|
|
||||||
if (r_logFile->integer)
|
|
||||||
fprintf(vk_log_file, "render_tess (passes %d, vert %d, inds %d)\n", num_passes, tess.numVertexes, tess.numIndexes);
|
|
||||||
|
|
||||||
// xyz
|
// xyz
|
||||||
{
|
{
|
||||||
if ((vk.xyz_elements + tess.numVertexes) * sizeof(vec4_t) > XYZ_SIZE)
|
if ((vk.xyz_elements + tess.numVertexes) * sizeof(vec4_t) > XYZ_SIZE)
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ void vk_destroy_resources();
|
||||||
VkRect2D vk_get_viewport_rect();
|
VkRect2D vk_get_viewport_rect();
|
||||||
void vk_get_mvp_transform(float mvp[16]);
|
void vk_get_mvp_transform(float mvp[16]);
|
||||||
|
|
||||||
void vk_bind_resources_shared_between_stages(int num_passes);
|
void vk_bind_resources_shared_between_stages();
|
||||||
void vk_bind_stage_specific_resources(VkPipeline pipeline, bool multitexture, bool sky);
|
void vk_bind_stage_specific_resources(VkPipeline pipeline, bool multitexture, bool sky);
|
||||||
|
|
||||||
void vk_begin_frame();
|
void vk_begin_frame();
|
||||||
|
|
@ -116,6 +116,8 @@ struct Vulkan_Instance {
|
||||||
VkDeviceMemory index_buffer_memory = VK_NULL_HANDLE;
|
VkDeviceMemory index_buffer_memory = VK_NULL_HANDLE;
|
||||||
byte* index_buffer_ptr = nullptr; // pointer to mapped index buffer
|
byte* index_buffer_ptr = nullptr; // pointer to mapped index buffer
|
||||||
VkDeviceSize index_buffer_offset = 0;
|
VkDeviceSize index_buffer_offset = 0;
|
||||||
|
|
||||||
|
VkPipeline skybox_pipeline = VK_NULL_HANDLE;
|
||||||
};
|
};
|
||||||
|
|
||||||
const int MAX_VK_PIPELINES = 1024;
|
const int MAX_VK_PIPELINES = 1024;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user