[iortcw] 13/152: All: Rework the flares code / Add depth check for surface flare visibility

Simon McVittie smcv at debian.org
Fri Sep 8 10:39:38 UTC 2017


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to annotated tag 1.5a
in repository iortcw.

commit 99b4b2bb687ff4a51f41d6223d883bb5dba6898c
Author: MAN-AT-ARMS <M4N4T4RMS at gmail.com>
Date:   Sun Jan 17 14:24:05 2016 -0500

    All: Rework the flares code / Add depth check for surface flare visibility
---
 MP/code/rend2/tr_flares.c    | 35 ++++++++++++++++++++++++++++++++---
 MP/code/renderer/tr_flares.c | 21 ++++++++++++++++++---
 SP/code/rend2/tr_flares.c    | 35 ++++++++++++++++++++++++++++++++---
 SP/code/renderer/tr_flares.c | 21 ++++++++++++++++++---
 4 files changed, 100 insertions(+), 12 deletions(-)

diff --git a/MP/code/rend2/tr_flares.c b/MP/code/rend2/tr_flares.c
index dad093f..d4f6a5c 100644
--- a/MP/code/rend2/tr_flares.c
+++ b/MP/code/rend2/tr_flares.c
@@ -340,19 +340,48 @@ RB_TestFlare
 ==================
 */
 void RB_TestFlare( flare_t *f ) {
-	qboolean visible;
-	float fade;
+	float			depth;
+	qboolean		visible;
+	float			fade;
+	float			screenZ;
+	FBO_t           *oldFbo;
 
 	backEnd.pc.c_flareTests++;
 
+	// doing a readpixels is as good as doing a glFinish(), so
+	// don't bother with another sync
+	glState.finishCalled = qfalse;
+
+	// if we're doing multisample rendering, read from the correct FBO
+	oldFbo = glState.currentFBO;
+	if (tr.msaaResolveFbo)
+	{
+		FBO_Bind(tr.msaaResolveFbo);
+	}
+
+	// read back the z buffer contents
+	qglReadPixels( f->windowX, f->windowY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth );
+
+	// if we're doing multisample rendering, switch to the old FBO
+	if (tr.msaaResolveFbo)
+	{
+		FBO_Bind(oldFbo);
+	}
+
+	screenZ = backEnd.viewParms.projectionMatrix[14] / 
+		( ( 2*depth - 1 ) * backEnd.viewParms.projectionMatrix[11] - backEnd.viewParms.projectionMatrix[10] );
+
 	visible = f->cgvisible;
 
+	if ( -f->eyeZ - -screenZ  > 24 )
+		visible = qfalse;
+
 	if ( visible ) {
 		if ( !f->visible ) {
 			f->visible = qtrue;
 			f->fadeTime = backEnd.refdef.time - 1;
 		}
-		fade = ( ( backEnd.refdef.time - f->fadeTime ) / 1000.0f ) * r_flareFade->value;
+		fade = ( ( backEnd.refdef.time - f->fadeTime ) /1000.0f ) * r_flareFade->value;
 	} else {
 		if ( f->visible ) {
 			f->visible = qfalse;
diff --git a/MP/code/renderer/tr_flares.c b/MP/code/renderer/tr_flares.c
index 460324e..4aae1be 100644
--- a/MP/code/renderer/tr_flares.c
+++ b/MP/code/renderer/tr_flares.c
@@ -340,19 +340,34 @@ RB_TestFlare
 ==================
 */
 void RB_TestFlare( flare_t *f ) {
-	qboolean visible;
-	float fade;
+	float			depth;
+	qboolean		visible;
+	float			fade;
+	float			screenZ;
 
 	backEnd.pc.c_flareTests++;
 
+	// doing a readpixels is as good as doing a glFinish(), so
+	// don't bother with another sync
+	glState.finishCalled = qfalse;
+
+	// read back the z buffer contents
+	qglReadPixels( f->windowX, f->windowY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth );
+
+	screenZ = backEnd.viewParms.projectionMatrix[14] / 
+		( ( 2*depth - 1 ) * backEnd.viewParms.projectionMatrix[11] - backEnd.viewParms.projectionMatrix[10] );
+
 	visible = f->cgvisible;
 
+	if ( -f->eyeZ - -screenZ  > 24 )
+		visible = qfalse;
+
 	if ( visible ) {
 		if ( !f->visible ) {
 			f->visible = qtrue;
 			f->fadeTime = backEnd.refdef.time - 1;
 		}
-		fade = ( ( backEnd.refdef.time - f->fadeTime ) / 1000.0f ) * r_flareFade->value;
+		fade = ( ( backEnd.refdef.time - f->fadeTime ) /1000.0f ) * r_flareFade->value;
 	} else {
 		if ( f->visible ) {
 			f->visible = qfalse;
diff --git a/SP/code/rend2/tr_flares.c b/SP/code/rend2/tr_flares.c
index f88fdc7..8eaf01b 100644
--- a/SP/code/rend2/tr_flares.c
+++ b/SP/code/rend2/tr_flares.c
@@ -342,19 +342,48 @@ RB_TestFlare
 ==================
 */
 void RB_TestFlare( flare_t *f ) {
-	qboolean visible;
-	float fade;
+	float			depth;
+	qboolean		visible;
+	float			fade;
+	float			screenZ;
+	FBO_t           *oldFbo;
 
 	backEnd.pc.c_flareTests++;
 
+	// doing a readpixels is as good as doing a glFinish(), so
+	// don't bother with another sync
+	glState.finishCalled = qfalse;
+
+	// if we're doing multisample rendering, read from the correct FBO
+	oldFbo = glState.currentFBO;
+	if (tr.msaaResolveFbo)
+	{
+		FBO_Bind(tr.msaaResolveFbo);
+	}
+
+	// read back the z buffer contents
+	qglReadPixels( f->windowX, f->windowY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth );
+
+	// if we're doing multisample rendering, switch to the old FBO
+	if (tr.msaaResolveFbo)
+	{
+		FBO_Bind(oldFbo);
+	}
+
+	screenZ = backEnd.viewParms.projectionMatrix[14] / 
+		( ( 2*depth - 1 ) * backEnd.viewParms.projectionMatrix[11] - backEnd.viewParms.projectionMatrix[10] );
+
 	visible = (qboolean)( f->flags & 1 );
 
+	if ( -f->eyeZ - -screenZ  > 24 )
+		visible = qfalse;
+
 	if ( visible ) {
 		if ( !f->visible ) {
 			f->visible = qtrue;
 			f->fadeTime = backEnd.refdef.time - 1;
 		}
-		fade = ( ( backEnd.refdef.time - f->fadeTime ) / 1000.0f ) * r_flareFade->value;
+		fade = ( ( backEnd.refdef.time - f->fadeTime ) /1000.0f ) * r_flareFade->value;
 	} else {
 		if ( f->visible ) {
 			f->visible = qfalse;
diff --git a/SP/code/renderer/tr_flares.c b/SP/code/renderer/tr_flares.c
index 40f31b5..36b8c8e 100644
--- a/SP/code/renderer/tr_flares.c
+++ b/SP/code/renderer/tr_flares.c
@@ -342,19 +342,34 @@ RB_TestFlare
 ==================
 */
 void RB_TestFlare( flare_t *f ) {
-	qboolean visible;
-	float fade;
+	float			depth;
+	qboolean		visible;
+	float			fade;
+	float			screenZ;
 
 	backEnd.pc.c_flareTests++;
 
+	// doing a readpixels is as good as doing a glFinish(), so
+	// don't bother with another sync
+	glState.finishCalled = qfalse;
+
+	// read back the z buffer contents
+	qglReadPixels( f->windowX, f->windowY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth );
+
+	screenZ = backEnd.viewParms.projectionMatrix[14] / 
+		( ( 2*depth - 1 ) * backEnd.viewParms.projectionMatrix[11] - backEnd.viewParms.projectionMatrix[10] );
+
 	visible = (qboolean)( f->flags & 1 );
 
+	if ( -f->eyeZ - -screenZ  > 24 )
+		visible = qfalse;
+
 	if ( visible ) {
 		if ( !f->visible ) {
 			f->visible = qtrue;
 			f->fadeTime = backEnd.refdef.time - 1;
 		}
-		fade = ( ( backEnd.refdef.time - f->fadeTime ) / 1000.0f ) * r_flareFade->value;
+		fade = ( ( backEnd.refdef.time - f->fadeTime ) /1000.0f ) * r_flareFade->value;
 	} else {
 		if ( f->visible ) {
 			f->visible = qfalse;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git



More information about the Pkg-games-commits mailing list