diff --git a/neo/doom3/game/gamesys/GameTypeInfo.h b/neo/doom3/game/gamesys/GameTypeInfo.h index 7b0760ea..a4eedee2 100644 --- a/neo/doom3/game/gamesys/GameTypeInfo.h +++ b/neo/doom3/game/gamesys/GameTypeInfo.h @@ -7,7 +7,7 @@ This file has been generated with the Type Info Generator v1.1 (c) 2004 id Software - 1185 constants + 1186 constants 133 enums 579 classes/structs/unions 38 templates @@ -381,6 +381,7 @@ static constantInfo_t constantInfo[] = { { "int", "GEOMETRY_FLAG_NONE", "0" }, { "int", "GEOMETRY_FLAG_SKELETAL", "1" }, { "int", "GEOMETRY_FLAG_UNLIT", "2" }, + { "int", "GEOMETRY_FLAG_GLASS", "4" }, { "static const uint32_t", "GL_RAYTRACING_MAX_LIGHTS", "256" }, { "static const int", "GL_RAYTRACING_LIGHT_TYPE_POINT", "0" }, { "static const int", "GL_RAYTRACING_LIGHT_TYPE_RECT", "1" }, @@ -1666,6 +1667,7 @@ static enumValueInfo_t GeometryFlag_t_typeInfo[] = { { "GEOMETRY_FLAG_NONE", 0 }, { "GEOMETRY_FLAG_SKELETAL", 1 }, { "GEOMETRY_FLAG_UNLIT", 2 }, + { "GEOMETRY_FLAG_GLASS", 4 }, { NULL, 0 } }; diff --git a/neo/engine/doomdll.vcxproj.user b/neo/engine/doomdll.vcxproj.user index f834c0ec..4a1fa688 100644 --- a/neo/engine/doomdll.vcxproj.user +++ b/neo/engine/doomdll.vcxproj.user @@ -17,7 +17,7 @@ WindowsLocalDebugger +set r_fullscreen 0 +set r_mode 11 +set sv_pure 0 D:\projects\Doom3 - +set r_fullscreen 1 +set r_mode 9 +set sv_pure 0 +set fs_game e3|+set r_fullscreen 0 +set r_mode 9 +set sv_pure 0|+set r_fullscreen 0 +set r_mode 9 +set sv_pure 0 +set fs_game e3|+set r_fullscreen 0 +set r_mode 9 +set sv_pure 0 |+set r_fullscreen 0 +set r_mode 11 +set sv_pure 0 | + +set r_fullscreen 0 +set r_mode 9 +set sv_pure 0|+set r_fullscreen 0 +set r_mode 9 +set sv_pure 0 +set fs_game e3|+set r_fullscreen 0 +set r_mode 9 +set sv_pure 0 |+set r_fullscreen 0 +set r_mode 11 +set sv_pure 0 +set fs_game e3|+set r_fullscreen 0 +set r_mode 11 +set sv_pure 0 | D:\projects\Doom3\Quake4.exe diff --git a/neo/engine/opengl/gl_d3d12raylight.cpp b/neo/engine/opengl/gl_d3d12raylight.cpp index 3ebfac2c..e4f38370 100644 --- a/neo/engine/opengl/gl_d3d12raylight.cpp +++ b/neo/engine/opengl/gl_d3d12raylight.cpp @@ -5037,6 +5037,7 @@ float3 EstimateRayTracedSpecularReflection( float3 reflectedRadiance = 0.0; float distanceFade = 1.0; + float3 reflectedSurfaceAverageColor = 1.0; if (!hit) { @@ -5049,6 +5050,7 @@ float3 EstimateRayTracedSpecularReflection( { distanceFade = ComputeSpecularReflectionDistanceFade(hitT, reflectionMaxT); float3 rayHitPos = reflectionOrigin + R * hitT; + reflectedSurfaceAverageColor = GetMeshAverageColor(meshIndex); uint2 hitPixel = pixel; float3 hitPos = rayHitPos; @@ -5094,8 +5096,8 @@ float3 EstimateRayTracedSpecularReflection( } } + reflectedRadiance *= reflectedSurfaceAverageColor; reflectedRadiance = CompressEmissiveRadiance(reflectedRadiance, hasSpecularMap ? 5.0 : 3.5); - reflectedRadiance *= hit ? GetMeshAverageColor(meshIndex) : 1.0; float cavityFade = lerp(0.42, 1.0, saturate(cavity)); float reflectionStrength = hasSpecularMap diff --git a/neo/engine/opengl/gl_d3d12shim.cpp b/neo/engine/opengl/gl_d3d12shim.cpp index 02e024ae..8368c806 100644 --- a/neo/engine/opengl/gl_d3d12shim.cpp +++ b/neo/engine/opengl/gl_d3d12shim.cpp @@ -2184,15 +2184,7 @@ static inline bool QD3D12_CurrentDrawUsesAlphaBlend() static inline uint32_t QD3D12_CurrentEffectiveRayMaterialFlags() { - uint32_t flags = QD3D12_CurrentRayMaterialFlags(); - - // Alpha-blended fixed-function surfaces are visually transparent. Mirror that - // into the DXR material bits automatically so callers do not also have to tag - // the same draw as glass just to make shadow/GI rays continue through it. - if (QD3D12_CurrentDrawUsesAlphaBlend()) - flags |= GL_RAYTRACING_MATERIAL_FLAG_GLASS; - - return QD3D12_ClampRayMaterialFlags(flags); + return QD3D12_CurrentRayMaterialFlags(); } static inline float QD3D12_CurrentEffectiveGeometryFlag() @@ -2203,6 +2195,12 @@ static inline float QD3D12_CurrentEffectiveGeometryFlag() return (float)bits; } +static inline bool QD3D12_GeometryFlagHasGlass(float geometryFlag) +{ + const uint32_t bits = (uint32_t)max(0.0f, floorf(geometryFlag + 0.5f)); + return (bits & QD3D12_GEOMETRY_FLAG_GLASS_BIT) != 0u; +} + static inline float QD3D12_CurrentEffectiveMaterialType() { if (QD3D12_RayMaterialFlagsHaveGlass(QD3D12_CurrentEffectiveRayMaterialFlags()) && @@ -9401,15 +9399,17 @@ static D3D12_GRAPHICS_PIPELINE_STATE_DESC BuildPSODesc( d.RasterizerState.MultisampleEnable = (d.SampleDesc.Count > 1) ? TRUE : FALSE; const bool alphaBlended = QD3D12_PipelineUsesAlphaBlend(mode); + const bool glassGBuffer = alphaBlended && QD3D12_GeometryFlagHasGlass(key.geometryFlag); d.BlendState.RenderTarget[0].RenderTargetWriteMask = key.colorWriteMask; if (!nativeColorOnly) { - d.BlendState.RenderTarget[1].RenderTargetWriteMask = (key.colorWriteMask && !alphaBlended) ? D3D12_COLOR_WRITE_ENABLE_ALL : 0; - d.BlendState.RenderTarget[2].RenderTargetWriteMask = (key.colorWriteMask && !alphaBlended) ? D3D12_COLOR_WRITE_ENABLE_ALL : 0; - d.BlendState.RenderTarget[3].RenderTargetWriteMask = (key.colorWriteMask && !alphaBlended) ? D3D12_COLOR_WRITE_ENABLE_ALL : 0; - d.BlendState.RenderTarget[4].RenderTargetWriteMask = (key.colorWriteMask && !alphaBlended) ? D3D12_COLOR_WRITE_ENABLE_ALL : 0; - d.BlendState.RenderTarget[5].RenderTargetWriteMask = (key.colorWriteMask && !alphaBlended) ? D3D12_COLOR_WRITE_ENABLE_ALL : 0; + const UINT8 gbufferWriteMask = (key.colorWriteMask && (!alphaBlended || glassGBuffer)) ? D3D12_COLOR_WRITE_ENABLE_ALL : 0; + d.BlendState.RenderTarget[1].RenderTargetWriteMask = gbufferWriteMask; + d.BlendState.RenderTarget[2].RenderTargetWriteMask = gbufferWriteMask; + d.BlendState.RenderTarget[3].RenderTargetWriteMask = gbufferWriteMask; + d.BlendState.RenderTarget[4].RenderTargetWriteMask = gbufferWriteMask; + d.BlendState.RenderTarget[5].RenderTargetWriteMask = gbufferWriteMask; } d.BlendState.AlphaToCoverageEnable = FALSE; @@ -9714,6 +9714,7 @@ static D3D12_GRAPHICS_PIPELINE_STATE_DESC BuildARBPSODesc( d.RasterizerState.MultisampleEnable = (d.SampleDesc.Count > 1) ? TRUE : FALSE; const bool alphaBlended = QD3D12_PipelineUsesAlphaBlend(key.pipeline); + const bool glassGBuffer = alphaBlended && QD3D12_GeometryFlagHasGlass(key.geometryFlag); d.BlendState.AlphaToCoverageEnable = FALSE; d.BlendState.IndependentBlendEnable = nativeColorOnly ? FALSE : TRUE; @@ -9730,7 +9731,7 @@ static D3D12_GRAPHICS_PIPELINE_STATE_DESC BuildARBPSODesc( rt.DestBlendAlpha = D3D12_BLEND_ZERO; rt.BlendOpAlpha = D3D12_BLEND_OP_ADD; rt.LogicOp = D3D12_LOGIC_OP_NOOP; - rt.RenderTargetWriteMask = (i == 0) ? key.colorWriteMask : 0; + rt.RenderTargetWriteMask = (i == 0) ? key.colorWriteMask : ((!nativeColorOnly && glassGBuffer) ? D3D12_COLOR_WRITE_ENABLE_ALL : 0); } if (alphaBlended) diff --git a/neo/engine/opengl/opengl.h b/neo/engine/opengl/opengl.h index 1e5f6432..854d274f 100644 --- a/neo/engine/opengl/opengl.h +++ b/neo/engine/opengl/opengl.h @@ -1569,8 +1569,9 @@ void APIENTRY glGetQueryObjectiv(GLuint id, GLenum pname, GLint* params); enum GeometryFlag_t { GEOMETRY_FLAG_NONE = 0, - GEOMETRY_FLAG_SKELETAL, - GEOMETRY_FLAG_UNLIT + GEOMETRY_FLAG_SKELETAL = 1, + GEOMETRY_FLAG_UNLIT = 2, + GEOMETRY_FLAG_GLASS = 4 }; void APIENTRY glGeometryFlagf(GLfloat flag); diff --git a/neo/engine/renderer/draw_common.cpp b/neo/engine/renderer/draw_common.cpp index 58671212..e6db97a2 100644 --- a/neo/engine/renderer/draw_common.cpp +++ b/neo/engine/renderer/draw_common.cpp @@ -859,6 +859,18 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { idDrawVert *ac = RB_BindAmbientBuffer( tri ); glVertexPointer( 3, GL_FLOAT, sizeof( idDrawVert ), ac->xyz.ToFloatPtr() ); glTexCoordPointer( 2, GL_FLOAT, sizeof( idDrawVert ), reinterpret_cast(&ac->st) ); + glNormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->normal.ToFloatPtr() ); + glTangentPointer( GL_FLOAT, sizeof( idDrawVert ), ac->tangents[0].ToFloatPtr() ); + glBinormalPointer( GL_FLOAT, sizeof( idDrawVert ), ac->tangents[1].ToFloatPtr() ); + + glEnableClientState( GL_NORMAL_ARRAY ); + glEnableClientState( GL_TANGENT_ARRAY_QD3D12 ); + glEnableClientState( GL_BINORMAL_ARRAY_QD3D12 ); + + const bool glassMaterial = shader->GetSurfaceType() == SURFTYPE_GLASS; + const float baseGeometryFlag = surf->geo->isSkeletal ? (float)GEOMETRY_FLAG_SKELETAL : (float)GEOMETRY_FLAG_NONE; + glGlassMaterialQD3D12( glassMaterial ? GL_TRUE : GL_FALSE ); + glGeometryFlagf( glassMaterial ? ( baseGeometryFlag + (float)GEOMETRY_FLAG_GLASS ) : baseGeometryFlag ); for ( stage = 0; stage < shader->GetNumStages() ; stage++ ) { pStage = shader->GetStage(stage); @@ -1062,6 +1074,12 @@ void RB_STD_T_RenderShaderPasses( const drawSurf_t *surf ) { if ( surf->space->weaponDepthHack || surf->space->modelDepthHack != 0.0f ) { RB_LeaveDepthHack(); } + + glGlassMaterialQD3D12( GL_FALSE ); + glGeometryFlagf( GEOMETRY_FLAG_NONE ); + glDisableClientState( GL_NORMAL_ARRAY ); + glDisableClientState( GL_TANGENT_ARRAY_QD3D12 ); + glDisableClientState( GL_BINORMAL_ARRAY_QD3D12 ); } /* diff --git a/neo/engine/tools/radiant/XYWnd.cpp b/neo/engine/tools/radiant/XYWnd.cpp index 5bfd957a..482318b1 100644 --- a/neo/engine/tools/radiant/XYWnd.cpp +++ b/neo/engine/tools/radiant/XYWnd.cpp @@ -6037,8 +6037,6 @@ void CXYWnd::XY_Draw() { if( m_precisionCrosshairMode != PRECISION_CROSSHAIR_NONE ) DrawPrecisionCrosshair(); - glFlush(); - // QE_CheckOpenGLForErrors(); }