Skip to content
Draft
5 changes: 2 additions & 3 deletions src.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,6 @@ set(GLSL_EMBED_LIST
blur_fp.glsl
cameraEffects_fp.glsl
contrast_fp.glsl
fogGlobal_fp.glsl
fxaa_fp.glsl
fxaa3_11_fp.glsl
motionblur_fp.glsl
Expand All @@ -130,8 +129,8 @@ set(GLSL_EMBED_LIST
vertexSkinning_vp.glsl

# Regular shaders
fogQuake3_vp.glsl
fogQuake3_fp.glsl
fog_vp.glsl
fog_fp.glsl
generic_vp.glsl
generic_fp.glsl
heatHaze_vp.glsl
Expand Down
14 changes: 2 additions & 12 deletions src/engine/renderer/GeometryOptimiser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,6 @@ static int LeafSurfaceCompare( const void* a, const void* b ) {
return 1;
}

if ( aa->fogIndex < bb->fogIndex ) {
return -1;
} else if ( aa->fogIndex > bb->fogIndex ) {
return 1;
}

// sort by leaf
if ( aa->scratch2 < bb->scratch2 ) {
return -1;
Expand Down Expand Up @@ -168,7 +162,6 @@ void OptimiseMapGeometryCore( world_t* world, bspSurface_t** rendererSurfaces, i

shader_t* shader1 = surf1->shader;

int fogIndex1 = surf1->fogIndex;
int lightMapNum1 = surf1->lightmapNum;
surf1->viewCount = surf1 - world->surfaces;
surf1->scratch1 = j;
Expand All @@ -187,9 +180,8 @@ void OptimiseMapGeometryCore( world_t* world, bspSurface_t** rendererSurfaces, i
}

shader_t* shader2 = surf2->shader;
int fogIndex2 = surf2->fogIndex;
int lightMapNum2 = surf2->lightmapNum;
if ( shader1 != shader2 || fogIndex1 != fogIndex2 || lightMapNum1 != lightMapNum2 ) {
if ( shader1 != shader2 || lightMapNum1 != lightMapNum2 ) {
continue;
}

Expand Down Expand Up @@ -315,7 +307,6 @@ void MergeLeafSurfacesCore( world_t* world, bspSurface_t** rendererSurfaces, int
SphereFromBounds( vboSurf->bounds[0], vboSurf->bounds[1], vboSurf->origin, &vboSurf->radius );

mergedSurf->data = ( surfaceType_t* ) vboSurf;
mergedSurf->fogIndex = surf1->fogIndex;
mergedSurf->shader = surf1->shader;
mergedSurf->lightmapNum = surf1->lightmapNum;
mergedSurf->viewCount = -1;
Expand Down Expand Up @@ -557,7 +548,6 @@ std::vector<MaterialSurface> OptimiseMapGeometryMaterial( world_t* world, bspSur
srf.skyBrush = surface->skyBrush;

srf.lightMapNum = surface->lightmapNum;
srf.fog = surface->fogIndex;
srf.portalNum = surface->portalNum;

srf.firstIndex = ( ( srfGeneric_t* ) surface->data )->firstIndex;
Expand All @@ -568,7 +558,7 @@ std::vector<MaterialSurface> OptimiseMapGeometryMaterial( world_t* world, bspSur
VectorCopy( ( ( srfGeneric_t* ) surface->data )->origin, srf.origin );
srf.radius = ( ( srfGeneric_t* ) surface->data )->radius;

materialSystem.GenerateMaterial( &srf, world->globalFog );
materialSystem.GenerateMaterial( &srf );

static const float MAX_NORMAL_SURFACE_DISTANCE = 65536.0f * sqrtf( 2.0f );
if ( VectorLength( ( ( srfGeneric_t* ) surface->data )->bounds[0] ) > MAX_NORMAL_SURFACE_DISTANCE
Expand Down
1 change: 0 additions & 1 deletion src/engine/renderer/GeometryOptimiser.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ void MarkShaderBuildScreen( const shaderStage_t* pStage );
void MarkShaderBuildPortal( const shaderStage_t* pStage );
void MarkShaderBuildHeatHaze( const shaderStage_t* pStage );
void MarkShaderBuildLiquid( const shaderStage_t* pStage );
void MarkShaderBuildFog( const shaderStage_t* pStage );

void MarkShaderBuildIQM( const IQModel_t* model );
void MarkShaderBuildMDV( const mdvModel_t* model );
Expand Down
78 changes: 5 additions & 73 deletions src/engine/renderer/Material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,14 +334,6 @@ void UpdateSurfaceDataLiquid( uint32_t* materials, shaderStage_t* pStage, bool,
gl_liquidShaderMaterial->WriteUniformsToBuffer( materials, GLShader::MATERIAL );
}

void UpdateSurfaceDataFog( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool ) {
// shader_t* shader = pStage->shader;

materials += pStage->bufferOffset;

gl_fogQuake3ShaderMaterial->WriteUniformsToBuffer( materials, GLShader::MATERIAL );
}

/*
* Buffer layout:
* // Static surfaces data:
Expand Down Expand Up @@ -746,10 +738,10 @@ class ListMaterialsCmd : public Cmd::StaticCmd {
shaderSortName.at( materialPack.fromSort ), shaderSortName.at( materialPack.toSort ) );
for ( const Material& material : materialPack.materials ) {
Print( "id: %u, sync: %5s, stateBits: %10x, GLShader: %s, GLProgramID: %u,"
" deform: %i, fog: %i, drawCmdCount: %u",
" deform: %i, drawCmdCount: %u",
material.id, material.useSync, material.stateBits,
material.shader->_name, material.program,
material.deformIndex, material.fog, material.drawCommandCount );
material.deformIndex, material.drawCommandCount );
}
}
}
Expand All @@ -762,7 +754,6 @@ static std::string GetStageInfo( const shaderStage_t* pStage, const uint32_t dyn
{ BindShaderGeneric3D, "genericMaterial " },
{ BindShaderLightMapping, "lightMappingMaterial" },
{ BindShaderHeatHaze, "heatHazeMaterial " },
{ BindShaderFog, "fogQuake3Material " },
{ BindShaderLiquid, "liquidMaterial " },
{ BindShaderScreen, "screenMaterial " },
{ BindShaderSkybox, "skyboxMaterial " },
Expand Down Expand Up @@ -1090,42 +1081,6 @@ void BindShaderLiquid( Material* material ) {
gl_liquidShaderMaterial->SetUniform_PortalMapBindless( GL_BindToTMU( 1, tr.portalRenderImage ) );
}

void BindShaderFog( Material* material ) {
// Bind shader program.
gl_fogQuake3ShaderMaterial->SetDeform( material->deformIndex );
gl_fogQuake3ShaderMaterial->BindProgram();

// Set shader uniforms.
const fog_t* fog = tr.world->fogs + material->fog;

// rotate the gradient vector for this orientation
float eyeT;
vec4_t fogDepthVector;
if ( fog->hasSurface ) {
VectorCopy( fog->surface, fogDepthVector );
fogDepthVector[ 3 ] = -fog->surface[ 3 ];
eyeT = DotProduct( backEnd.viewParms.orientation.origin, fogDepthVector ) + fogDepthVector[ 3 ];
} else {
Vector4Set( fogDepthVector, 0, 0, 0, 1 );
eyeT = 1; // non-surface fog always has eye inside
}

// Note: things that seemingly should be per-shader or per-surface can be set as global uniforms
// since fognum is grouped with the GL state stuff, segregating each fognum in a separate draw call.

gl_fogQuake3ShaderMaterial->SetUniform_ViewOrigin( backEnd.viewParms.orientation.origin );
gl_fogQuake3ShaderMaterial->SetUniform_FogDensity( fog->tcScale );
gl_fogQuake3ShaderMaterial->SetUniform_FogDepthVector( fogDepthVector );
gl_fogQuake3ShaderMaterial->SetUniform_FogEyeT( eyeT );

gl_fogQuake3ShaderMaterial->SetUniform_ColorGlobal_Uint( fog->color );

gl_fogQuake3ShaderMaterial->SetUniform_ModelMatrix( backEnd.orientation.transformMatrix );
gl_fogQuake3ShaderMaterial->SetUniform_ModelViewProjectionMatrix( glState.modelViewProjectionMatrix[glState.stackIndex] );

gl_fogQuake3ShaderMaterial->SetUniform_Time( backEnd.refdef.floatTime - backEnd.currentEntity->e.shaderTime );
}

void ProcessMaterialNONE( Material*, shaderStage_t*, MaterialSurface* ) {
ASSERT_UNREACHABLE();
}
Expand Down Expand Up @@ -1263,15 +1218,6 @@ void ProcessMaterialLiquid( Material* material, shaderStage_t* pStage, MaterialS
material->program = gl_liquidShaderMaterial->GetProgram( materialSystem.buildOneShader );
}

void ProcessMaterialFog( Material* material, shaderStage_t* pStage, MaterialSurface* surface ) {
material->shader = gl_fogQuake3ShaderMaterial;
material->fog = surface->fog;

gl_fogQuake3ShaderMaterial->SetDeform( pStage->deformIndex );

material->program = gl_fogQuake3ShaderMaterial->GetProgram( materialSystem.buildOneShader );
}

void MaterialSystem::AddStage( MaterialSurface* surface, shaderStage_t* pStage, uint32_t stage,
const bool mayUseVertexOverbright, const bool vertexLit, const bool fullbright ) {
const int variant = ( mayUseVertexOverbright ? ShaderStageVariant::VERTEX_OVERBRIGHT : 0 )
Expand Down Expand Up @@ -1495,7 +1441,7 @@ void MaterialSystem::ProcessStage( MaterialSurface* surface, shaderStage_t* pSta
/* This will only generate a material itself
A material represents a distinct global OpenGL state (e. g. blend function, depth test, depth write etc.)
Materials can have a dependency on other materials to make sure that consecutive stages are rendered in the proper order */
void MaterialSystem::GenerateMaterial( MaterialSurface* surface, int globalFog ) {
void MaterialSystem::GenerateMaterial( MaterialSurface* surface ) {
uint32_t stage = 0;
uint32_t previousMaterialID = 0;

Expand All @@ -1515,13 +1461,6 @@ void MaterialSystem::GenerateMaterial( MaterialSurface* surface, int globalFog )

surface->stages++;
}

if ( !surface->shader->noFog && surface->fog >= 1 && surface->fog != globalFog ) {
uint32_t unused;
ProcessStage( surface, surface->shader->fogShader->stages, surface->shader->fogShader, packIDs, stage, unused, true );

surface->stages++;
}
}

void MaterialSystem::SetWorldBounds( vec3_t bounds[2] ) {
Expand Down Expand Up @@ -1917,7 +1856,6 @@ bool MaterialSystem::AddPortalSurface( uint32_t viewID, PortalSurface* portalSur
{
drawSurf.bspSurface = portalSurfaces[portalSurface->drawSurfID].bspSurface;
drawSurf.entity = &tr.worldEntity;
drawSurf.fog = portalSurfaces[portalSurface->drawSurfID].fog;
drawSurf.portalNum = portalSurfaces[portalSurface->drawSurfID].portalNum;
drawSurf.shader = portalSurfaces[portalSurface->drawSurfID].shader;
drawSurf.surface = portalSurfaces[portalSurface->drawSurfID].surface;
Expand Down Expand Up @@ -1993,7 +1931,7 @@ void MaterialSystem::AddAutospriteSurfaces() {
for ( const bspSurface_t* surface : autospriteSurfaces )
{
R_AddDrawSurf( surface->data, surface->shader,
surface->lightmapNum, surface->fogIndex, true );
surface->lightmapNum, true );
}
}

Expand Down Expand Up @@ -2045,7 +1983,7 @@ void MaterialSystem::RenderMaterials( const shaderSort_t fromSort, const shaderS
}

tr.drawingSky = true;
Tess_Begin( Tess_StageIteratorSky, skyShader, false, -1, 0, false );
Tess_Begin( Tess_StageIteratorSky, skyShader, false, -1, false );
Tess_End();
}
}
Expand Down Expand Up @@ -2095,12 +2033,6 @@ void MaterialSystem::RenderMaterial( Material& material, const uint32_t viewID )
stateBits &= ~( GLS_SRCBLEND_BITS | GLS_DSTBLEND_BITS );
}

if( material.shaderBinder == BindShaderFog ) {
if ( r_noFog->integer || !r_wolfFog->integer || ( backEnd.refdef.rdflags & RDF_NOWORLDMODEL ) ) {
return;
}
}

backEnd.currentEntity = &tr.worldEntity;

GL_State( stateBits );
Expand Down
10 changes: 2 additions & 8 deletions src/engine/renderer/Material.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ struct MaterialSurface {
bool skyBrush;

int16_t lightMapNum;
int fog;
int portalNum = -1;

GLuint firstIndex;
Expand Down Expand Up @@ -148,15 +147,13 @@ struct Material {

bool usePolygonOffset = false;

int fog = 0;

uint32_t drawCommandCount = 0;
bool texturesResident = false;
std::vector<Texture*> textures;

bool operator==( const Material& other ) {
return program == other.program && stateBits == other.stateBits
&& fog == other.fog && cullType == other.cullType && usePolygonOffset == other.usePolygonOffset;
&& cullType == other.cullType && usePolygonOffset == other.usePolygonOffset;
}

void AddTexture( Texture* texture ) {
Expand Down Expand Up @@ -381,7 +378,7 @@ class MaterialSystem {
const bool mayUseVertexOverbright, const bool vertexLit, const bool fullbright );
void ProcessStage( MaterialSurface* surface, shaderStage_t* pStage, shader_t* shader, uint32_t* packIDs, uint32_t& stage,
uint32_t& previousMaterialID, bool skipStageSync = false );
void GenerateMaterial( MaterialSurface* surface, int globalFog );
void GenerateMaterial( MaterialSurface* surface );
void GenerateWorldMaterialsBuffer();
void GenerateWorldCommandBuffer( std::vector<MaterialSurface>& surfaces );
void GeneratePortalBoundingSpheres();
Expand Down Expand Up @@ -462,7 +459,6 @@ void UpdateSurfaceDataSkybox( uint32_t* materials, shaderStage_t* pStage, bool,
void UpdateSurfaceDataScreen( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );
void UpdateSurfaceDataHeatHaze( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );
void UpdateSurfaceDataLiquid( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );
void UpdateSurfaceDataFog( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );

void BindShaderNONE( Material* );
void BindShaderNOP( Material* );
Expand All @@ -473,7 +469,6 @@ void BindShaderSkybox( Material* material );
void BindShaderScreen( Material* material );
void BindShaderHeatHaze( Material* material );
void BindShaderLiquid( Material* material );
void BindShaderFog( Material* material );

void ProcessMaterialNONE( Material*, shaderStage_t*, MaterialSurface* );
void ProcessMaterialNOP( Material*, shaderStage_t*, MaterialSurface* );
Expand All @@ -484,6 +479,5 @@ void ProcessMaterialSkybox( Material* material, shaderStage_t* pStage, MaterialS
void ProcessMaterialScreen( Material* material, shaderStage_t* pStage, MaterialSurface* /* surface */ );
void ProcessMaterialHeatHaze( Material* material, shaderStage_t* pStage, MaterialSurface* surface );
void ProcessMaterialLiquid( Material* material, shaderStage_t* pStage, MaterialSurface* /* surface */ );
void ProcessMaterialFog( Material* material, shaderStage_t* pStage, MaterialSurface* surface );

#endif // MATERIAL_H
14 changes: 13 additions & 1 deletion src/engine/renderer/VertexSpecification.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ enum
// GPU vertex animations
ATTR_INDEX_POSITION2,
ATTR_INDEX_QTANGENT2,

ATTR_INDEX_FOG_SURFACE,

// This occupies 5 attribute slots
ATTR_INDEX_FOG_PLANES_0,
ATTR_INDEX_FOG_PLANES_LAST = ATTR_INDEX_FOG_PLANES_0 + 4,

ATTR_INDEX_MAX
};

Expand All @@ -53,7 +60,9 @@ static const char* const attributeNames[] =
"attr_Color",
"attr_BoneFactors",
"attr_Position2",
"attr_QTangent2"
"attr_QTangent2",
"attr_FogSurface",
"attr_FogPlanes", nullptr, nullptr, nullptr, nullptr,
};

enum
Expand All @@ -69,6 +78,9 @@ enum
ATTR_POSITION2 = BIT( ATTR_INDEX_POSITION2 ),
ATTR_QTANGENT2 = BIT( ATTR_INDEX_QTANGENT2 ),

ATTR_FOG_SURFACE = BIT( ATTR_INDEX_FOG_SURFACE ),
ATTR_FOG_PLANES = BIT( ATTR_INDEX_FOG_PLANES_0 ) * ( BIT( 5 ) - 1 ),

ATTR_INTERP_BITS = ATTR_POSITION2 | ATTR_QTANGENT2,
};

Expand Down
Loading
Loading