From 3f0d5e28032776460f3e35ebb1b2fc6c0a9d631b Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Fri, 22 Nov 2024 15:05:04 +0200 Subject: [PATCH 01/21] Added new postFX act 1 --- src/Core/Universe.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Core/Universe.h b/src/Core/Universe.h index 4a4b56d0a..7c3bfbce2 100644 --- a/src/Core/Universe.h +++ b/src/Core/Universe.h @@ -95,6 +95,7 @@ enum OO_POSTFX_GRAYSCALE, OO_POSTFX_OLDMOVIE, OO_POSTFX_CRT, + OO_POSTFX_CRTBADSIGNAL, OO_POSTFX_ENDOFLIST // keep this for last }; From 840b71cabb4d76e4c88d2b04624e49a7da68c897 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Fri, 22 Nov 2024 15:09:47 +0200 Subject: [PATCH 02/21] Added new postFX act 2 This new post effect is set so that the HUD will be drawn in a separate buffer. This means that the HUD is not affected by it. --- src/Core/Universe.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Core/Universe.m b/src/Core/Universe.m index 041b8df30..5060da6fc 100644 --- a/src/Core/Universe.m +++ b/src/Core/Universe.m @@ -4802,8 +4802,7 @@ - (BOOL) viewFrustumIntersectsSphereAt:(Vector)position withRadius:(GLfloat)radi - (void) drawUniverse { int currentPostFX = [self currentPostFX]; - BOOL hudSeparateRenderPass = [self useShaders] && (currentPostFX == OO_POSTFX_NONE || (currentPostFX == OO_POSTFX_CLOAK && [self colorblindMode] == OO_POSTFX_NONE)); - NSSize viewSize = [gameView viewSize]; + BOOL hudSeparateRenderPass = [self useShaders] && (currentPostFX == OO_POSTFX_NONE || ((currentPostFX == OO_POSTFX_CLOAK || currentPostFX == OO_POSTFX_CRTBADSIGNAL) && [self colorblindMode] == OO_POSTFX_NONE)); OOLog(@"universe.profile.draw", @"%@", @"Begin draw"); if (!no_update) From 1fe0c2c94deeaa29d54a36f5522b2f7fb184897e Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Fri, 22 Nov 2024 15:16:22 +0200 Subject: [PATCH 03/21] Fixed occasional false indication of ECM burst when launching from station. --- src/Core/Entities/PlayerEntity.m | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Core/Entities/PlayerEntity.m b/src/Core/Entities/PlayerEntity.m index b7108209d..71eba3085 100644 --- a/src/Core/Entities/PlayerEntity.m +++ b/src/Core/Entities/PlayerEntity.m @@ -6066,11 +6066,15 @@ - (void) deactivateCloakingDevice - (double) scannerFuzziness { double fuzz = 0.0; + /* Fuzziness from ECM bursts */ - double since = [UNIVERSE getTime] - last_ecm_time; - if (since < SCANNER_ECM_FUZZINESS) + if (last_ecm_time > 0.0) { - fuzz += (SCANNER_ECM_FUZZINESS - since) * (SCANNER_ECM_FUZZINESS - since) * 500.0; + double since = [UNIVERSE getTime] - last_ecm_time; + if (since < SCANNER_ECM_FUZZINESS) + { + fuzz += (SCANNER_ECM_FUZZINESS - since) * (SCANNER_ECM_FUZZINESS - since) * 500.0; + } } /* Other causes could go here */ From 6d1c668ec2712ac06dd3cb83a51c968d92766233 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Fri, 22 Nov 2024 15:27:58 +0200 Subject: [PATCH 04/21] Added new postFX act 3 ECM blast now causes EM disruption on ship's viewscreen. --- src/Core/HeadUpDisplay.m | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/Core/HeadUpDisplay.m b/src/Core/HeadUpDisplay.m index c7653b3f9..984d9af00 100644 --- a/src/Core/HeadUpDisplay.m +++ b/src/Core/HeadUpDisplay.m @@ -1188,6 +1188,8 @@ - (void) drawScanner:(NSDictionary *)info BOOL isHostile = NO; BOOL inColorBlindMode = [UNIVERSE colorblindMode] != OO_POSTFX_NONE; + + static BOOL gettingInterference = NO; if (emptyDial) { @@ -1321,6 +1323,28 @@ - (void) drawScanner:(NSDictionary *)info relativePosition = [PLAYER vectorTo:scannedEntity]; double fuzz = [PLAYER scannerFuzziness]; + if ([UNIVERSE useShaders]) + { + // we want to start and stop the effect exactly once, not start it + // or stop it on every frame + if (fuzz > 0.0) + { + if (!gettingInterference) + { + [UNIVERSE setCurrentPostFX:OO_POSTFX_CRTBADSIGNAL]; + gettingInterference = YES; + } + } + else + { + if (gettingInterference) + { + [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; + gettingInterference = NO; + } + } + } + if (fuzz > 0 && ![[UNIVERSE gameController] isGamePaused]) { relativePosition = vector_add(relativePosition,OOVectorRandomRadial(fuzz)); @@ -1475,6 +1499,11 @@ - (void) drawScanner:(NSDictionary *)info } } + else if ([UNIVERSE useShaders] && gettingInterference) + { + // no ECM interference fx if we are docking + [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; + } for (i = 0; i < ent_count; i++) { From 53d35997164c8398ed59e14c7c7918d04fcf4de1 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Fri, 22 Nov 2024 15:35:50 +0200 Subject: [PATCH 05/21] Added CRTBadSignal effect to the final processing shader. --- Resources/Shaders/oolite-final.fragment | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Resources/Shaders/oolite-final.fragment b/Resources/Shaders/oolite-final.fragment index f6e66de01..0cac4e3ef 100644 --- a/Resources/Shaders/oolite-final.fragment +++ b/Resources/Shaders/oolite-final.fragment @@ -443,6 +443,24 @@ vec3 CRT(sampler2D inImage, vec2 inCoords) } // ------------------------------------------------------------------------------------------ +// ======================================================================================= +// CRTBadSignal - original at https://www.shadertoy.com/view/ltV3z1 +// ======================================================================================= +vec3 CRTBadSignal(sampler2D inImage, vec2 inCoords) +{ + vec2 uv = inCoords; + float t = uTime; + float fx = 0.001 + 25.0 * abs(sin(t) / 10.0) - mod(1.0 + t,7.0); + const float s = 50.0; // noise intensity + float x = (floor(uv.x * 300.0) ) + (floor(uv.y * 300.0 )) * (t * 0.1); + vec4 dtv = vec4(mod((mod(x, 2.0) + 1.0) * (mod(x, 0.0) + 0.0), 0.01) - 0.005) * s; + vec3 col = vec3(0.1, 0.1, 0.1) + dtv.xyz / fx; + + col.xyz += texture(inImage,uv).xyz; + + return col; +} +// ------------------------------------------------------------------------------------------ // ======================================================================================= // FXAA - original at https://www.shadertoy.com/view/MdyyRt @@ -533,6 +551,12 @@ void main() hdrColor *= exposure; break; case 8: + hdrColor = CRTBadSignal(scene, TexCoords); + bloomColor = CRT(bloomBlur, TexCoords); + if(bloom) hdrColor += bloomColor; + hdrColor *= exposure; + break; + case 9: hdrColor = gravLens(scene, TexCoords); bloomColor = gravLens(bloomBlur, TexCoords); if(bloom) hdrColor += bloomColor; From a09ebe408edd5b6ac48fc93bc729e592fa31a61f Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Fri, 22 Nov 2024 15:39:52 +0200 Subject: [PATCH 06/21] Fixed copy/paste error resulting in compile failure. --- src/Core/Universe.m | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Core/Universe.m b/src/Core/Universe.m index 5060da6fc..945d8c990 100644 --- a/src/Core/Universe.m +++ b/src/Core/Universe.m @@ -4803,6 +4803,7 @@ - (void) drawUniverse { int currentPostFX = [self currentPostFX]; BOOL hudSeparateRenderPass = [self useShaders] && (currentPostFX == OO_POSTFX_NONE || ((currentPostFX == OO_POSTFX_CLOAK || currentPostFX == OO_POSTFX_CRTBADSIGNAL) && [self colorblindMode] == OO_POSTFX_NONE)); + NSSize viewSize = [gameView viewSize]; OOLog(@"universe.profile.draw", @"%@", @"Begin draw"); if (!no_update) From e10ae4d76f2ccf2be3f168d1d580811bdc5fb679 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Fri, 22 Nov 2024 18:43:35 +0200 Subject: [PATCH 07/21] Added new ECM interference effect in the HDR final processing shader. --- Resources/Shaders/oolite-final-hdr.fragment | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Resources/Shaders/oolite-final-hdr.fragment b/Resources/Shaders/oolite-final-hdr.fragment index 6272fda45..f3ac5a935 100644 --- a/Resources/Shaders/oolite-final-hdr.fragment +++ b/Resources/Shaders/oolite-final-hdr.fragment @@ -521,6 +521,25 @@ vec3 CRT(sampler2D inImage, vec2 inCoords) } // ------------------------------------------------------------------------------------------ +// ======================================================================================= +// CRTBadSignal - original at https://www.shadertoy.com/view/ltV3z1 +// ======================================================================================= +vec3 CRTBadSignal(sampler2D inImage, vec2 inCoords) +{ + vec2 uv = inCoords; + float t = uTime; + float fx = 0.001 + 25.0 * abs(sin(t) / 10.0) - mod(1.0 + t,7.0); + const float s = 50.0; // noise intensity + float x = (floor(uv.x * 300.0) ) + (floor(uv.y * 300.0)) * (t * 0.1); + vec4 dtv = vec4(mod((mod(x, 2.0) + 1.0) * (mod(x, 0.0) + 0.0), 0.01) - 0.005) * s; + vec3 col = vec3(0.1, 0.1, 0.1) + dtv.xyz / fx; + + col.xyz += texture(inImage,uv).xyz; + + return col; +} +// ------------------------------------------------------------------------------------------ + // ======================================================================================= // FXAA - original at https://www.shadertoy.com/view/MdyyRt @@ -716,6 +735,12 @@ void main() hdrColor *= exposure; break; case 8: + hdrColor = CRTBadSignal(scene, TexCoords); + bloomColor = CRT(bloomBlur, TexCoords); + if(bloom) hdrColor += bloomColor; + hdrColor *= exposure; + break; + case 9: hdrColor = gravLens(scene, TexCoords); bloomColor = gravLens(bloomBlur, TexCoords); if(bloom) hdrColor += bloomColor; From 85a6b824f7d2379cf511b344b92d64a4dfd6e652 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Fri, 22 Nov 2024 19:33:33 +0200 Subject: [PATCH 08/21] Ensure that the ECM blast effect does not get way too bright in HDR. --- Resources/Shaders/oolite-final-hdr.fragment | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Shaders/oolite-final-hdr.fragment b/Resources/Shaders/oolite-final-hdr.fragment index f3ac5a935..ee9ccbabc 100644 --- a/Resources/Shaders/oolite-final-hdr.fragment +++ b/Resources/Shaders/oolite-final-hdr.fragment @@ -532,7 +532,7 @@ vec3 CRTBadSignal(sampler2D inImage, vec2 inCoords) const float s = 50.0; // noise intensity float x = (floor(uv.x * 300.0) ) + (floor(uv.y * 300.0)) * (t * 0.1); vec4 dtv = vec4(mod((mod(x, 2.0) + 1.0) * (mod(x, 0.0) + 0.0), 0.01) - 0.005) * s; - vec3 col = vec3(0.1, 0.1, 0.1) + dtv.xyz / fx; + vec3 col = clamp(vec3(0.1, 0.1, 0.1) + dtv.xyz / fx, vec3(0.0), vec3(1.0)); col.xyz += texture(inImage,uv).xyz; From e958ab012483088843d0efdc250693377adfc106 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Sun, 24 Nov 2024 16:48:10 +0200 Subject: [PATCH 09/21] Some cosmetic changes part 1 --- Resources/Shaders/oolite-final-hdr.fragment | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Shaders/oolite-final-hdr.fragment b/Resources/Shaders/oolite-final-hdr.fragment index ee9ccbabc..03765665c 100644 --- a/Resources/Shaders/oolite-final-hdr.fragment +++ b/Resources/Shaders/oolite-final-hdr.fragment @@ -528,9 +528,9 @@ vec3 CRTBadSignal(sampler2D inImage, vec2 inCoords) { vec2 uv = inCoords; float t = uTime; - float fx = 0.001 + 25.0 * abs(sin(t) / 10.0) - mod(1.0 + t,7.0); + float fx = 0.001 + 25.0 * abs(sin(t) / 10.0) - mod(1.0 + t, 7.0); const float s = 50.0; // noise intensity - float x = (floor(uv.x * 300.0) ) + (floor(uv.y * 300.0)) * (t * 0.1); + float x = (floor(uv.x * 300.0)) + (floor(uv.y * 300.0)) * (t * 0.1); vec4 dtv = vec4(mod((mod(x, 2.0) + 1.0) * (mod(x, 0.0) + 0.0), 0.01) - 0.005) * s; vec3 col = clamp(vec3(0.1, 0.1, 0.1) + dtv.xyz / fx, vec3(0.0), vec3(1.0)); @@ -736,7 +736,7 @@ void main() break; case 8: hdrColor = CRTBadSignal(scene, TexCoords); - bloomColor = CRT(bloomBlur, TexCoords); + bloomColor = CRT(bloomBlur, TexCoords); // yes CRT, not a typo if(bloom) hdrColor += bloomColor; hdrColor *= exposure; break; From b5151a1d0ad4db98a7eed54e8105550ec8c5abe4 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Sun, 24 Nov 2024 16:51:05 +0200 Subject: [PATCH 10/21] Some cosmetic changes part 2 --- Resources/Shaders/oolite-final.fragment | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Shaders/oolite-final.fragment b/Resources/Shaders/oolite-final.fragment index 0cac4e3ef..2d897cff1 100644 --- a/Resources/Shaders/oolite-final.fragment +++ b/Resources/Shaders/oolite-final.fragment @@ -450,11 +450,11 @@ vec3 CRTBadSignal(sampler2D inImage, vec2 inCoords) { vec2 uv = inCoords; float t = uTime; - float fx = 0.001 + 25.0 * abs(sin(t) / 10.0) - mod(1.0 + t,7.0); + float fx = 0.001 + 25.0 * abs(sin(t) / 10.0) - mod(1.0 + t, 7.0); const float s = 50.0; // noise intensity - float x = (floor(uv.x * 300.0) ) + (floor(uv.y * 300.0 )) * (t * 0.1); + float x = (floor(uv.x * 300.0)) + (floor(uv.y * 300.0 )) * (t * 0.1); vec4 dtv = vec4(mod((mod(x, 2.0) + 1.0) * (mod(x, 0.0) + 0.0), 0.01) - 0.005) * s; - vec3 col = vec3(0.1, 0.1, 0.1) + dtv.xyz / fx; + vec3 col = clamp(vec3(0.1, 0.1, 0.1) + dtv.xyz / fx, vec3(0.0), vec3(1.0)); col.xyz += texture(inImage,uv).xyz; @@ -552,7 +552,7 @@ void main() break; case 8: hdrColor = CRTBadSignal(scene, TexCoords); - bloomColor = CRT(bloomBlur, TexCoords); + bloomColor = CRT(bloomBlur, TexCoords); // yes CRT, not a typo if(bloom) hdrColor += bloomColor; hdrColor *= exposure; break; From e480e651dc9d129fd089f0686778eaf9d01e5406 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Sun, 24 Nov 2024 20:37:42 +0200 Subject: [PATCH 11/21] Added new ECM visual effect to CHANGELOG.TXT --- Doc/CHANGELOG.TXT | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/CHANGELOG.TXT b/Doc/CHANGELOG.TXT index 7c5813243..7e563caec 100644 --- a/Doc/CHANGELOG.TXT +++ b/Doc/CHANGELOG.TXT @@ -54,6 +54,7 @@ General: confusion. * Updated the wormhole cloud effect. * Mouse flight sensitivity made configurable by editing the preferences file. +* Implemented new ECM visual effect. Expansion Pack Development: =========================== From 5e69a3833baee9aafa00ebc41bb12555062c6083 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Mon, 25 Nov 2024 09:27:16 +0200 Subject: [PATCH 12/21] Making new ECM visual a user default option - act 1 --- src/Core/Universe.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Core/Universe.h b/src/Core/Universe.h index 7c3bfbce2..f5a1da81c 100644 --- a/src/Core/Universe.h +++ b/src/Core/Universe.h @@ -314,6 +314,8 @@ enum #ifndef NDEBUG double timeAccelerationFactor; #endif + + BOOL ECMVisualFXEnabled; NSMutableArray *activeWormholes; @@ -645,6 +647,9 @@ enum - (double) timeAccelerationFactor; - (void) setTimeAccelerationFactor:(double)newTimeAccelerationFactor; +- (BOOL) ECMVisualFXEnabled; +- (void) setECMVisualFXEnabled:(BOOL)isEnabled; + - (void) filterSortedLists; /////////////////////////////////////// From f1e8c8c2c1198e07ba358cac29d7b6752553260a Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Mon, 25 Nov 2024 09:30:17 +0200 Subject: [PATCH 13/21] Making new ECM visual a user default option - act 2 --- src/Core/Universe.m | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Core/Universe.m b/src/Core/Universe.m index 945d8c990..d5b5d4522 100644 --- a/src/Core/Universe.m +++ b/src/Core/Universe.m @@ -745,7 +745,9 @@ - (id) initWithGameView:(MyOpenGLView *)inGameView OOLog(@"MSAA.setup", @"Multisample anti-aliasing %@requested.", [inGameView msaa] ? @"" : @"not "); [inGameView setFov:OOClamp_0_max_f([prefs oo_floatForKey:@"fov-value" defaultValue:57.2f], MAX_FOV_DEG) fromFraction:NO]; if ([inGameView fov:NO] < MIN_FOV_DEG) [inGameView setFov:MIN_FOV_DEG fromFraction:NO]; - + + [self setECMVisualFXEnabled:[prefs oo_boolForKey:@"ecm-visual-fx" defaultValue:YES]]; + // Set up speech synthesizer. #if OOLITE_SPEECH_SYNTH #if OOLITE_MAC_OS_X @@ -7383,6 +7385,18 @@ - (void) setTimeAccelerationFactor:(double)newTimeAccelerationFactor #endif +- (BOOL) ECMVisualFXEnabled +{ + return ECMVisualFXEnabled; +} + + +- (void) setECMVisualFXEnabled:(BOOL)isEnabled +{ + ECMVisualFXEnabled = isEnabled; +} + + - (void) filterSortedLists { /* From ecfa35585f32124a8007425545b98c5f4c9293ae Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Mon, 25 Nov 2024 09:34:14 +0200 Subject: [PATCH 14/21] Making new ECM visual a user default option - act 3 --- src/Core/HeadUpDisplay.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/HeadUpDisplay.m b/src/Core/HeadUpDisplay.m index 984d9af00..767ded712 100644 --- a/src/Core/HeadUpDisplay.m +++ b/src/Core/HeadUpDisplay.m @@ -1323,7 +1323,7 @@ - (void) drawScanner:(NSDictionary *)info relativePosition = [PLAYER vectorTo:scannedEntity]; double fuzz = [PLAYER scannerFuzziness]; - if ([UNIVERSE useShaders]) + if ([UNIVERSE useShaders] && [UNIVERSE ECMVisualFXEnabled]) { // we want to start and stop the effect exactly once, not start it // or stop it on every frame @@ -1499,7 +1499,7 @@ - (void) drawScanner:(NSDictionary *)info } } - else if ([UNIVERSE useShaders] && gettingInterference) + else if ([UNIVERSE useShaders] && [UNIVERSE ECMVisualFXEnabled] && gettingInterference) { // no ECM interference fx if we are docking [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; From 81cc49cd5dcddf926126cb19f2c129542d0b764a Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Mon, 25 Nov 2024 17:04:08 +0200 Subject: [PATCH 15/21] Reduced the intensity of the ECM effect. Less is more. --- Resources/Shaders/oolite-final-hdr.fragment | 2 +- Resources/Shaders/oolite-final.fragment | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Shaders/oolite-final-hdr.fragment b/Resources/Shaders/oolite-final-hdr.fragment index 03765665c..1e283c6ec 100644 --- a/Resources/Shaders/oolite-final-hdr.fragment +++ b/Resources/Shaders/oolite-final-hdr.fragment @@ -532,7 +532,7 @@ vec3 CRTBadSignal(sampler2D inImage, vec2 inCoords) const float s = 50.0; // noise intensity float x = (floor(uv.x * 300.0)) + (floor(uv.y * 300.0)) * (t * 0.1); vec4 dtv = vec4(mod((mod(x, 2.0) + 1.0) * (mod(x, 0.0) + 0.0), 0.01) - 0.005) * s; - vec3 col = clamp(vec3(0.1, 0.1, 0.1) + dtv.xyz / fx, vec3(0.0), vec3(1.0)); + vec3 col = clamp(vec3(0.1, 0.1, 0.1) + dtv.xyz / fx, vec3(0.0), vec3(0.1)); col.xyz += texture(inImage,uv).xyz; diff --git a/Resources/Shaders/oolite-final.fragment b/Resources/Shaders/oolite-final.fragment index 2d897cff1..024093a88 100644 --- a/Resources/Shaders/oolite-final.fragment +++ b/Resources/Shaders/oolite-final.fragment @@ -454,7 +454,7 @@ vec3 CRTBadSignal(sampler2D inImage, vec2 inCoords) const float s = 50.0; // noise intensity float x = (floor(uv.x * 300.0)) + (floor(uv.y * 300.0 )) * (t * 0.1); vec4 dtv = vec4(mod((mod(x, 2.0) + 1.0) * (mod(x, 0.0) + 0.0), 0.01) - 0.005) * s; - vec3 col = clamp(vec3(0.1, 0.1, 0.1) + dtv.xyz / fx, vec3(0.0), vec3(1.0)); + vec3 col = clamp(vec3(0.1, 0.1, 0.1) + dtv.xyz / fx, vec3(0.0), vec3(0.1)); col.xyz += texture(inImage,uv).xyz; From 5688f9099ec844afe814b5c033db2919a85d36de Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Tue, 26 Nov 2024 12:04:21 +0200 Subject: [PATCH 16/21] Fixing bug where ECM effect does not work when no entities are on scanner - act 1 Also moving the ECM effect update code to a reasonable place - it has no business being in HeadUpDisplay.m. --- src/Core/HeadUpDisplay.m | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/src/Core/HeadUpDisplay.m b/src/Core/HeadUpDisplay.m index 767ded712..c7653b3f9 100644 --- a/src/Core/HeadUpDisplay.m +++ b/src/Core/HeadUpDisplay.m @@ -1188,8 +1188,6 @@ - (void) drawScanner:(NSDictionary *)info BOOL isHostile = NO; BOOL inColorBlindMode = [UNIVERSE colorblindMode] != OO_POSTFX_NONE; - - static BOOL gettingInterference = NO; if (emptyDial) { @@ -1323,28 +1321,6 @@ - (void) drawScanner:(NSDictionary *)info relativePosition = [PLAYER vectorTo:scannedEntity]; double fuzz = [PLAYER scannerFuzziness]; - if ([UNIVERSE useShaders] && [UNIVERSE ECMVisualFXEnabled]) - { - // we want to start and stop the effect exactly once, not start it - // or stop it on every frame - if (fuzz > 0.0) - { - if (!gettingInterference) - { - [UNIVERSE setCurrentPostFX:OO_POSTFX_CRTBADSIGNAL]; - gettingInterference = YES; - } - } - else - { - if (gettingInterference) - { - [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; - gettingInterference = NO; - } - } - } - if (fuzz > 0 && ![[UNIVERSE gameController] isGamePaused]) { relativePosition = vector_add(relativePosition,OOVectorRandomRadial(fuzz)); @@ -1499,11 +1475,6 @@ - (void) drawScanner:(NSDictionary *)info } } - else if ([UNIVERSE useShaders] && [UNIVERSE ECMVisualFXEnabled] && gettingInterference) - { - // no ECM interference fx if we are docking - [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; - } for (i = 0; i < ent_count; i++) { From c33ed9f996a9435a7f9d107b84b8340ce248338b Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Tue, 26 Nov 2024 12:18:04 +0200 Subject: [PATCH 17/21] Fixing bug where ECM effect does not work when no entities are on scanner - act 2 --- src/Core/Entities/PlayerEntity.m | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/Core/Entities/PlayerEntity.m b/src/Core/Entities/PlayerEntity.m index 71eba3085..39de4614c 100644 --- a/src/Core/Entities/PlayerEntity.m +++ b/src/Core/Entities/PlayerEntity.m @@ -2725,6 +2725,8 @@ - (void) doBookkeeping:(double) delta_t STAGE_TRACKING_BEGIN double speed_delta = SHIP_THRUST_FACTOR * thrust; + + static BOOL gettingInterference = NO; OOSunEntity *sun = [UNIVERSE sun]; double external_temp = 0; @@ -2819,6 +2821,29 @@ - (void) doBookkeeping:(double) delta_t ecm_in_operation = NO; } } + + // ecm interference visual effect + if ([UNIVERSE useShaders] && [UNIVERSE ECMVisualFXEnabled]) + { + // we want to start and stop the effect exactly once, not start it + // or stop it on every frame + if ([self scannerFuzziness] > 0.0) + { + if (!gettingInterference) + { + [UNIVERSE setCurrentPostFX:OO_POSTFX_CRTBADSIGNAL]; + gettingInterference = YES; + } + } + else + { + if (gettingInterference) + { + [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; + gettingInterference = NO; + } + } + } // Energy Banks and Shields From d4c1da5b7a71be7229f62ab9ef41b21af89b8235 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Tue, 26 Nov 2024 12:41:21 +0200 Subject: [PATCH 18/21] Fixed bug where docking while the ECM fx was playing would not stop ir. --- src/Core/Entities/PlayerEntity.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Core/Entities/PlayerEntity.m b/src/Core/Entities/PlayerEntity.m index 39de4614c..a58d2e5c8 100644 --- a/src/Core/Entities/PlayerEntity.m +++ b/src/Core/Entities/PlayerEntity.m @@ -3955,6 +3955,12 @@ - (void) performDockingUpdates:(OOTimeDelta)delta_t { [self docked]; // bookkeeping for docking } + + // if ecm visual effect is playing while docking, terminate it + if ([UNIVERSE useShaders] && [UNIVERSE ECMVisualFXEnabled] && [UNIVERSE currentPostFX] == OO_POSTFX_CRTBADSIGNAL) + { + [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; + } } From cb22369e0c4e2e1642da8e9714e1eebd9f659194 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Tue, 26 Nov 2024 13:34:54 +0200 Subject: [PATCH 19/21] Fixing bug where postFXs don't stop upon death - act 1 --- src/Core/Universe.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Core/Universe.h b/src/Core/Universe.h index f5a1da81c..1255b82ca 100644 --- a/src/Core/Universe.h +++ b/src/Core/Universe.h @@ -383,6 +383,7 @@ enum - (int) currentPostFX; - (void) setCurrentPostFX: (int) newCurrentPostFX; +- (void) terminatePostFX:(int) postFX; - (id)initWithGameView:(MyOpenGLView *)gameView; From 9f79b907527aaa0bfc21ef94e008c4a1197bb677 Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Tue, 26 Nov 2024 13:38:27 +0200 Subject: [PATCH 20/21] Fixing bug where postFXs don't stop upon death - act 2 --- src/Core/Universe.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Core/Universe.m b/src/Core/Universe.m index d5b5d4522..2391285a0 100644 --- a/src/Core/Universe.m +++ b/src/Core/Universe.m @@ -308,6 +308,15 @@ - (void) setCurrentPostFX: (int) newCurrentPostFX _currentPostFX = newCurrentPostFX; } + +- (void) terminatePostFX:(int)postFX +{ + if ([self currentPostFX] == postFX) + { + [self setCurrentPostFX:[self colorblindMode]]; + } +} + - (int) nextColorblindMode:(int) index { if (++index > OO_POSTFX_COLORBLINDNESS_TRITAN) From c817b33e37da435d5bedd7d254ded9e8f1c80fef Mon Sep 17 00:00:00 2001 From: AnotherCommander Date: Tue, 26 Nov 2024 13:51:47 +0200 Subject: [PATCH 21/21] Fixing bug where postFXs don't stop upon death - act 3 They wouldn't stop also on docking, so added that case too. --- src/Core/Entities/PlayerEntity.m | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Core/Entities/PlayerEntity.m b/src/Core/Entities/PlayerEntity.m index a58d2e5c8..5d3005871 100644 --- a/src/Core/Entities/PlayerEntity.m +++ b/src/Core/Entities/PlayerEntity.m @@ -2839,7 +2839,7 @@ - (void) doBookkeeping:(double) delta_t { if (gettingInterference) { - [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; + [UNIVERSE terminatePostFX:OO_POSTFX_CRTBADSIGNAL]; gettingInterference = NO; } } @@ -3956,16 +3956,17 @@ - (void) performDockingUpdates:(OOTimeDelta)delta_t [self docked]; // bookkeeping for docking } - // if ecm visual effect is playing while docking, terminate it - if ([UNIVERSE useShaders] && [UNIVERSE ECMVisualFXEnabled] && [UNIVERSE currentPostFX] == OO_POSTFX_CRTBADSIGNAL) - { - [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; - } + // if cloak or ecm visual effects are playing while docking, terminate them + [UNIVERSE terminatePostFX:OO_POSTFX_CLOAK]; + if ([UNIVERSE ECMVisualFXEnabled]) [UNIVERSE terminatePostFX:OO_POSTFX_CRTBADSIGNAL]; } - (void) performDeadUpdates:(OOTimeDelta)delta_t { + [UNIVERSE terminatePostFX:OO_POSTFX_CLOAK]; + if ([UNIVERSE ECMVisualFXEnabled]) [UNIVERSE terminatePostFX:OO_POSTFX_CRTBADSIGNAL]; + [self gameOverFadeToBW]; if ([self shotTime] > kDeadResetTime) @@ -6086,7 +6087,7 @@ - (void) deactivateCloakingDevice if (![self hasCloakingDevice]) return; [super deactivateCloakingDevice]; - [UNIVERSE setCurrentPostFX:[UNIVERSE colorblindMode]]; + [UNIVERSE terminatePostFX:OO_POSTFX_CLOAK]; [UNIVERSE addMessage:DESC(@"cloak-off") forCount:2]; [self playCloakingDeviceOff]; }